image.pngAndroid项目构建架构图
- 顶层build.gradle文件位于项目根目录下,用于定义适用于项目中所有模块的构建配置,buildscript代码块用来定义项目中所有模块共用的gradle代码库和依赖项
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0'
}
}
allprojects {
repositories {
google()
center()
}
}
// 定义所有模块之间的共享属性.
ext {
compileSdkVersion = 28
supportLibVersion = "28.0.0"
...
}
- 可以在同一个项目中的某个模块的build.gradle文件中访问共享属性
android {
// Use the following syntax to access properties you defined at the project level:
// rootProject.ext.property_name
compileSdkVersion rootProject.ext.compileSdkVersion
...
}
...
dependencies {
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
...
}
- compileSdkVersion
这个主要是编译app的时候使用的sdk版本,就我们在AndroidStudio上面点击运行时候的编译时候的环境。记住这个只是在编译时候选择的版本,不涉及到运行时候的行为。由于androidStudio有预编译的功能所以会提示一些警告,提前了解新的sdk api。修改compileSdkVersion并不会影响我们的我们生成的app在手机上运行的行为。
- minSdkVersion
这个就是程序运行的最低的要求的Sdk,就是给说如果我设置的minSdkVersion是15的话那么如果你系统低于这个SdkVersion是安装不上的。还有一个好处就是
- targetSdkVersion
targetSdkVersion是android向前兼容的主要方式,加入你的targetSdkVersion设置为16,在Android4.4之后的设备上,系统会判断你的targetSdkVersion是否小于19,如果小于的话,那就按照19之前的api方法,如果大于等于19,那么就按照之后的api方法来走,保证了程序运行的一致性。也就是向前兼容性
minSdkVersion<=targetSdkVersion<=compileSdkVersion
minSDKVersion查看创建项目的时候的版本分部图表确定,然后targetSdkVersion最好和compileSdkVersion一样。CompileSdk选最新的,因为你更新了 compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的。可以使用最新的api
- buildToolsVersion
构建工作的版本
- minifyEnable
是否对项目的代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
proguard-android.txt是在AndroidSdk目录下,里面是所有项目通用的混淆规则
proguard-rules.pro是在当前项目的根目录下,里面可以编写当前项目特有的混淆规则
- shrinkResources
是否要开启资源压缩
- flavorDimensions
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.voctex.flavorsapp"
minSdkVersion 18
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//定义不同的维度
flavorDimensions "company","channel"
}
productFlavors{
companyA{
dimension "company"
applicationId 'com.example.myapp.paid'
buildConfigField "String","FLAVOR_NAME","\"companyA\""
}
companyB{
dimension "company"
applicationId 'com.example.myapp.free'
buildConfigField "String","FLAVOR_NAME","\"companyB\""
}
channelA{
dimension "channel"
buildConfigField "String","FLAVOR_NAME","\"channelA\""
}
channelB{
dimension "channel"
buildConfigField "String","FLAVOR_NAME","\"channelB\""
}
}
}
如上如果我们使用gradle assembleRelease打包的话就会打出不同渠道的不同维度的包
image.png
- splits
splits {
//按屏幕密度打包
density {
enable true //enable: 启用屏幕密度拆分机制
exclude "ldpi", "tvdpi", "xxxhdpi" //exclude: 默认情况下所有屏幕密度都包括在内,你可以移除一些密度
include "hdpi", "xhdpi", "mdpi"//表示要包括哪些屏幕密度
//reset() // 重置屏幕密度列表为只包含一个空字符串 (这能够实现,在与include一起使用时可以表示使用哪一个屏幕密度,而不是要忽略哪一些屏幕密度)
compatibleScreens 'small', 'normal', 'large', 'xlarge'
//表示兼容屏幕的列表。这将会注入到manifest中匹配的 <compatible-screens> <screen> 节点。这个设置是可选的
}
//按abi打包
abi {
enable true //启用ABI拆分机制
exclude 'x86' //默认情况下所有ABI都包括在内,你可以移除一些ABI
reset() //重置ABI列表为只包含一个空字符串(这可以实现,在与include一起使用来可以表示要使用哪一个ABI,而不是要忽略哪一些ABI)
include 'armeabi-v7a', 'mips' //指明要包含哪些ABI
universalApk true //指示是否打包一个通用版本(包含所有的ABI)。默认值为 false
}
}
- gradle.properties
可以配置项目全局Gradle设置,如守护进程的最大堆大小
- local.properties
为构建系统配置本地环境属性,包括
1.ndk.dir NDK的路径
2.sdk.dir SDK的路径
3.cmake.dir CMake的路径
4.ndk.symlinkdir 在AndroidStudio3.5以及更高版本中,创建指向NDK的符号链接,该链接可比NDK安装路径短
网友评论