android. gradle教,Android Gradle详解,androidgradle详解

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配置对于我们日常开发太重要了,我们要知道为什么要这样配置,这样配置的优缺点,不能盲目。...

你可能感兴趣的:(android.,gradle教)