Android Gradle 插件分類
在android中有三類工程,一類是app應(yīng)用工程,它可以生成一個可運行的apk應(yīng)用;一類是Library庫工程,他可以生成AAR包給其他的App工程公用,就和我們的Jar一樣,但是它包含了Android的資源等信息,是一個特殊的Jar包;最后一類是Test測試工程,用于對APP工程或者Library庫工程進(jìn)行單元測試
- APP插件id:com.android.application
- Library插件id:com.android.library
- Test插件id:com.android.test
通過上面3種不同的插件,就可以配置我們的工程是一個Android App工程,還是一個Android Library工程,或者是一個Android Test測試工程
要應(yīng)用一個插件就必須要知道它的插件id,如果是第三方插件,還需要配置它們的依賴classpath,Android Gradle插件就是屬于第三方插件,他托管在jcenter上,所以應(yīng)用之前,需要先配置依賴classpath
buildscript {
repositories{
jcenter()
}
dependencies{
classpath 'com.android.tools.build:gradle:1.5.0'
}
}
buildscript{}閉包可以寫在根工程的build.gradle腳本文件中,這樣所有的子工程就不用重復(fù)配置了
配置好后,就可以在App工程中用了
apply plugin:'com.android.application'
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
}
android{}是Android插件提供的一個擴(kuò)展類型
Android Gradle工程的配置,都是在android{}中,這是唯一的一個入口,通過它,可以讓我們自定義一個Android Gradle工程.
compileSdkVersion是編譯所依賴的Android Sdk的版本
buildToolsVersion是構(gòu)建該Android工程所用構(gòu)建工具的版本
具體實現(xiàn)如下
extension=project.extensions.create('android',getExtensionClass(),(ProjectInternal)project,instantiator,
androidBuilder,sdkHandler,buildTypeContainer,productFlavorContainer,signingConfigContainer,
extraModelInfo,isLivraty())
defaultConfig
defaultConfig是默認(rèn)的配置,它是一個ProductFlavor,ProductFlavor允許我們根據(jù)不同的情況同時生成多個不同的APK包,默認(rèn)配置中
applicationId 是配置我們的包名
minSdkVersion是最低支持的Android系統(tǒng)的API Level
targetSdkVersion 表明我們是基于那個Androi版本開發(fā)的
versionCode表明我們的APP應(yīng)用內(nèi)部版本號,一般用于控制App升級
versionName 表明我們的APP應(yīng)用的版本名稱
buildTypes
buildTypes 是一個域?qū)ο?和SourceSet一樣,里面有main,test,release,debug等,我們可以在buildTypes{}里新增任意多的我們需要構(gòu)建的類型
minifyEanbled 是否為該構(gòu)建類型啟用混淆,false表示不啟用
proguardFiles 當(dāng)我們啟用混淆時,所使用的proguard的配置文件,可以根據(jù)接收的參數(shù)同時配置一個或者多個配置文件如
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
getDefaultProguardFile是Android擴(kuò)展的一個方法,用來獲取AndroidSDK 目錄下默認(rèn)的proguard配置文件 文件名就是傳入的參數(shù)名proguard-android.txt
signingConfig
配置默認(rèn)的簽名信息,對生成的App簽名,是ProductFlavor的一個屬性,可以直接對其進(jìn)行配置,方法原型如下
public ProductFlavor setSigningConfig(SigningConfig signingConfig){
msigningConfig=signingConfig
ruturn this;
}
public SigningConfig getsigningConfig(){
return mSigningConfig;
}
默認(rèn)配置如下
signingConfigs {
release {
//簽名證書文件,打正式包時,自己生成
storeFile file('G:/xxx/xxx/xxx.jks')
//簽名證書密碼
storePassword 'xxx'
//簽名證書中的秘鑰別名
keyAlias 'xxx'
//簽名證書中的該秘鑰的密碼
keyPassword 'xxx'
}
debug {
storeFile file('G:/xxx/xxx/xxx.jks')
storePassword 'xxx'
keyAlias 'xxx'
keyPassword 'xxx'
}
}
multiDexEnabled
是buildType的一個屬性,用于配置該BuildType是否啟用自動拆分多個Dex的功能,一般用于程序中代碼太多,超過65536個方法的時候,拆分為多個Dex的處理,接收boolean值
shrinkResources
是buildType的一個屬性,用于配置是否自動清理未使用的資源,默認(rèn)為false
zipalign
zipalign是Andoroid提供的一個整理優(yōu)化apk文件的工具,它能提高系統(tǒng)和應(yīng)用的運行效率,更快的讀寫apk中的資源,降低內(nèi)存的使用,所以對于要發(fā)布的app,再發(fā)布之前一定要使用zipalign進(jìn)行優(yōu)化
如果想在release模式開啟zipalign優(yōu)化,需要進(jìn)行如下配置
android{
buildTypes{
release{
aipAlignEnabled true
}
debug{
}
}
}
批量修改生成的apk文件名
既然要修改生成的apk文件名,那么就要修改Android Gradle打包的輸出,為此,Android對象為我們提供了下列3個屬性
application Variants 僅僅適用于Android 應(yīng)用的Gradle插件
library Variants 僅僅適用于 Android庫 Gradle插件
testVariants 以上兩種Gradle插件都適用
以上三個屬性都返回DomainObjectSet對象集合,如下例
buildTypes {
release {
xxx...
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "dayuyoupin-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime()}-${variant.productFlavors[0].name}.apk"
//output.outputFile = new File(outputFile.parent, fileName)
outputFileName = fileName
}
}
}
}
debug {
signingConfig signingConfigs.debug
}
}
application Variants 是一個DomainObjectCollection集合,我們可以通過all方法進(jìn)行遍歷,遍歷的每一個variant都是一個生成的產(chǎn)物
ext{}
程序中ext{}快表明要為當(dāng)前project創(chuàng)建擴(kuò)展屬性,以供其他腳本引用,就像java里的變量一樣,創(chuàng)建好以后,可以在build.gradle中引用它,如下先創(chuàng)建一個version.gradle,然后引用
version.gradle
ext.name="xxx"
ext{
appVersionCode=1
appVersionName="1.0.0"
}
build.gradle 中引用
build.gradle
apply plugin:'java'
apply from: 'version.gradle'
引用java插件時,java就是插件的plugin id
插件可以分為腳本插件和二進(jìn)制插件,from區(qū)分與腳本插件和二進(jìn)制插件,引用第三方發(fā)布的jar包的一些二進(jìn)制插件時,就必須在項目根目錄的build.gradle中的buildscript{}中配置其classpath
隱藏簽名信息
前面我們把項目的簽名信息放在項目中,托管在git上,這樣做雖然非常方便,但存在著一定的安全隱患,如果要安全隱藏,最好的辦法就是將其放在服務(wù)器上,要實現(xiàn)這個,還得有自己的專門用于打包發(fā)版的服務(wù)器,下面以使用環(huán)境變量的方式為例
singingConfigs{
def appStoreFile=System.getenv("STORE_FILE")
def appStorePassword=System.getenv("STORE_PASSWORD)
def appKeyAlias=System.getenv("KEY_PASSWORD"))
release{
storeFile file(appStoreFile)
storePassword appStorePassword
keyAlias appKeyAlias
keyPassword appkeyPassword
}
}
release{
signingConfig signigConfigs.release
}
動態(tài)配置AndroidManifest文件
應(yīng)用于多渠道打包,如下
build.gradle
productFlavors{
google{}
baidu{}
}
productFlavors.all{ flavor ->
mainfestPlaceholders.put("UMENG_CHANNEL",name)
}
mainfest中
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
通過all函數(shù)遍歷每一個ProductFlavor.然后把它們的name作為友盟中渠道的名字,再利用Android Gradle中提供的mainfestPlaceholders占位符的應(yīng)用方式,可以動態(tài)替換掉AndroiMainfest文件中任何${var}格式的占位符
BuildConfig
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.deepbaytech.tao";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "baidu";
public static final int VERSION_CODE = 0;
public static final String VERSION_NAME = "1.3.7.debug";
}
DEBUG 用于標(biāo)記是debug還是release模式,其余的還有包名,當(dāng)前構(gòu)建的類型,是debug還是release,當(dāng)前構(gòu)建的渠道,當(dāng)前的版本號以及版本名稱,這些差不多就是我們當(dāng)前構(gòu)建渠道的基本應(yīng)用信息,都是常量,相比于我們獲取這些信息的其他方式,無疑要方便許多
一般在開發(fā)過程中都會輸出日志進(jìn)行調(diào)試,一般只有我們自己開發(fā)中才會打印日志,發(fā)布版本后就 不打印了,也就是我們需要一個標(biāo)記是debug還是release模式的開關(guān),這就是buildConfig.DEBUG,在debug模式下時true.在release模式下它的值會自動變?yōu)閒alse,不用我們自己改動,Android會自動幫我們修改,非常方便.
當(dāng)然我們也可以自己定義,在BuildConfig中新增一些常量.一般利用android Gradle提供的buildConfigField(String type,String name,String value) 來動態(tài)配置.例子如下
假如我們有baidu和google兩個渠道,發(fā)布的時候會有這兩個渠道包,當(dāng)我們安裝baidu渠道包的時候打開的是baidu首頁,當(dāng)我們安裝google渠道包的時候,打開的是google首頁,從這個思路分析,我們只要添加一個字段WEB_URL,在百度渠道包下時http://www.baidu.com,在google渠道包下值為http://www.google.com即可:
productFlavors{
google{
buildConfigField 'String','WEB_URL','"http://www.google.com"'
}
baidu{
buildConfigField 'String','WEB_URL','"http://www.baidu.com"'
}
}
release和debug也可以配置,如下
buildType{
debug{
buildConfigField 'String','NAME','"value"'
}
}