Android Gradle详解,androidgradle详解
了解Gradle配置对于我们日常开发太重要了,我们要知道为什么要这样配置,这样配置的优缺点,不能盲目。
一,默认配置
1,defaultConfig是Android对象中默认配置,它是一个ProductFlavor。默认配置有包名,版本号,版本名称等信息
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig{
applicationId "com.example.test"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
//......
}
}
2,applicationId是ProductFlavor的一个属性,用于生成App包名,等同于AndroidManifest.xml文件中配置的manifest标签的package属性值。
3,minSdkVersion是ProductFlavor的一个方法,是App最低支持Android操作系统的版本。
4,targetSdkVersion用于配置基于哪个Android SDK开发。
5,versionCode用于配置App内部版本号,通常用于版本升级。
6,versionName用于配置App的版本名称,是让用户知道当前的版本。
7,配置签名信息
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
signingConfigs{
debug{
storeFile file("test.keystore")
storePassword "password"
keyAlias "test"
keyPassword "password"
}
release{
storeFile file("test.keystore")
storePassword "password"
keyAlias "test"
keyPassword "password"
}
}
defaultConfig {
applicationId "com.example.test"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
8,minifyEnabled 开启代码混淆
9,multiDexEnabled 方法超限,启动拆分多个Dex
10,proguardFiles 混淆配置文件,可以配置多个
11,shrinkResources 自动清理未使用的资源
12,zipAlignEnabled 整理优化apk
二,Gradle高级用法
1,批量修改apk文件名,AS 3.0之前版本和之后版本写法不同
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dataBinding {
enabled = true
}
defaultConfig {
applicationId "com.example.test"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
zipAlignEnabled true
}
}
applicationVariants.all { variant ->
variant.outputs.all { output -> // AS 3.0之后版本 each 改为 all
def fileName = "${buildTime()}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName// AS 3.0之后版本 output.outputFile 改为 outputFileName
}
}
}
}
def buildTime() {
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
return formattedDate
}
2,隐藏签名文件信息
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "26.0.2"
signingConfigs {
def appStoreFile=System.getenv("STORE_FILE")
def appStorePassword=System.getenv("STORE_PASSWORD")
def appKeyAlias=System.getenv("KEY_ALIAS")
def appKeyPassword=System.getenv("KEY_PASSWORD")
release{
storeFile file(appStoreFile)
storePassword appStorePassword
keyAlias appKeyAlias
keyPassword appKeyPassword
}
}
buildTypes {
signingConfig signingConfigs.release
zipAlignEnabled true
}
}
3,动态配置AndroidManifest文件
Android Gradle提供了manifestPlaceholder占位符,用来替换AndroidManifest文件中的内容。比如:我们在用友盟第三方统计需要指定渠道名,这时我们就用到了占位符。
AndroidManifest文件中,第三方统计指定渠道名。${UMENG_CHANNEL}就是一个占位符
build.gradle中定义两个渠道,xiaomi和baidu,配置manifestPlaceholders。key都是UMENG_CHANNEL,在构建的时候会把AndroidManifest中的UMENG_CHANNEL占位符替换成manifestPlaceholders中对应的value值
android {
compileSdkVersion 23
buildToolsVersion "26.0.2"
productFlavors{
xiaomi{
manifestPlaceholders.put("UMENG_CHANNEL","xiaomi")
}
baidu{
manifestPlaceholders.put("UMENG_CHANNEL","baidu")
}
}
}
如果渠道非常多,每个渠道都得 指定渠道名,这样未免太麻烦,不过还有更好的方式。all函数遍历所有productFlavors,把name作为友盟渠道名。
android {
compileSdkVersion 23
buildToolsVersion "26.0.2"
productFlavors {
xiaomi {
}
baidu {
}
}
productFlavors.all { flavor ->
mManifestPlaceholders.put("UMENG_CHANNEL", name)
}
}
4,自定义BuildConfig
BuildConfig是Gradle构建时自动生成的,我们是如何使用它呢。比如我们打包时有debug和release版本,debug需要显示log信息,release版本需要隐藏log信息,那么我们打包时不用改代码就能知道需要关闭还是打开log
在build.gradle进行配置 buildConfigField 数据类型 名称 值
buildTypes {
debug {
buildConfigField "boolean", "type", "true"
}
release {
buildConfigField "boolean", "type", "false"
minifyEnabled true//是否启动混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在项目中直接调用BuildConfig
if(BuildConfig.type){
//打开log
}else{
//关闭log
}
5,动态添加资源和图片
现在有个需求,不同的渠道包app图标不同,文字也不同。小米渠道显示的是小米,百度的渠道显示的是百度。通过resValue可以动态配置string资源,不同的渠道资源不同。resValue 数据类型 名称 值,调用的时候就想调用strings.xml中的资源一样。manifestPlaceholders替换AndroidManifest中的icon,首先在 android:icon="${app_icon}"中定义占位符app_icon,然后manifestPlaceholders中引用即可
productFlavors {
xiaomi {
resValue 'string', 'name', 'xiaomi'
// 修改 AndroidManifest.xml 里的icon
manifestPlaceholders = [app_icon: "@mipmap/ic_launcher_xiaomi"]
}
baidu {
resValue 'string', 'name', 'baidu'
// 修改 AndroidManifest.xml 里的icon
manifestPlaceholders = [app_icon: "@mipmap/ic_launcher_baidu"]
}
}
6,JAVA编译选项
在我们编译代码的时候,如果对JDK的版本有要求或者是编码格式有要求,那我们也可以进行配置。
compileOptions {
encoding = 'utf-8'
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
http://www.dengb.com/wlaqjs/1327382.htmlwww.dengb.comtruehttp://www.dengb.com/wlaqjs/1327382.htmlTechArticleAndroid Gradle详解,androidgradle详解 了解Gradle配置对于我们日常开发太重要了,我们要知道为什么要这样配置,这样配置的优缺点,不能盲目。...