1.動態(tài)配置 AndroidManifest 文件
- 顧名思義就是可以在構(gòu)建的過程中眶蕉,動態(tài)修改AndroidManifest文件中的一些內(nèi)容。例如友盟等。
xml文件中:
<meta-data android:value="${UMENG_CHANNEL}" android:name="UMENG_CHANNEL"/>
gradle 文件中:
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
productFlavors{
google{
mainfestPlaceholders.put("UMENG_CHANNEL","google")
}
baidu{
mainfestPlaceholders.put("UMENG_CHANNEL","baidu")
}
}
//name就是每個渠道的名字
productFlavors.all{ flavor ->
mainfestPlaceholders.put("UMENG_CHANNEL",name)
}
}
mainfestPlaceholders是 ProductFlavor 的一個屬性,是一個 Map 類型,所以我們可以同時配置很多個占位符码耐。
通過 all 函數(shù)遍歷每一個productFlavor,然后把它們的那么作為友盟中渠道的名字溶其。
Android Gradle 提供的mainfestPlaceholders占位符的應(yīng)用方式骚腥,讓我們可以替換AndroidManifest文件中任何${var}格式的占位符。
2.自定義你的 BuildConfig
- BuildConfig是自動生成的不能修改瓶逃,它是由 Android Gradle 構(gòu)建腳本編譯后生成的束铭。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
productFlavors{
google{
buildConfigFiled'String','WEB_URL','"http://www.google.com"'
}
baidu{
buildConfigFiled'String','WEB_URL','"http://www.baidu.com"'
}
}
}
}
buildConfigFiled(String type,String name,String value)讓我們可以添加自己的常量到BuildConfig 中。
第一個參數(shù)type是要生成的字段的類型金闽,第二個參數(shù) name 是要生成的常量名字纯露,第三個參數(shù) value 是要生成字段的常量。
value 這個參數(shù)代芜,是單引號中間的部分埠褪,尤其對于 String 類型的值,里面的雙引號一定不能省略挤庇。
3.動態(tài)添加自定義資源
- resValue 方法有 3 個參數(shù):第一個是 type钞速,也就是你要的資源類型,比如有 string嫡秕、id渴语、bool 等;第二個是 name昆咽,也就是你要定義資源的名稱驾凶;第三是 value 就是你要定義資源的值。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
productFlavors{
google{
resValue'string','channel_tips','google 渠道歡迎您'
}
baidu{
resValue'string','channel_tips','baidu 渠道歡迎您'
}
}
}
}
- 這和我們在 res/values 這個文件夾定義的 xml 文件的格式是一樣的掷酗,只不過我們通過 Gradle 配置调违。
4.Java 編譯選項
- 有時候需要對我們的Java 源文件的編碼、源文件使用的 JDK版本等進(jìn)行調(diào)優(yōu)修改泻轰。比如需要配置源文件的編碼為 UTF-8 的編碼技肩,以兼容更多的字符。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
compileOptions{
encoding = 'utf-8'
sourceCompatibility = JavaVersion.VERSION_1_6
targetCompatibility = JavaVersion.VERSION_1_6
}
}
Android 對象提供了一個compileOptions方法浮声,它接受一個CompileOptions類型的閉包作為參數(shù)虚婿,來對 Java 編譯選項進(jìn)行配置旋奢。
CompileOptions是編譯配置,它提供了 3 個屬性然痊,分別是 encoding至朗、sourceCompatibility、targetCompatibility玷过,通過對它們
進(jìn)行設(shè)置來配置 Java 相關(guān)的編譯選項爽丹。
5.adb操作選項配置
adb筑煮,它是一個 Android Debug Bridge辛蚊,用于連接我們的 Android 手機(jī)進(jìn)行一些操作,比如調(diào)試 apk真仲、安裝 apk袋马、復(fù)制文件到手機(jī)等。
在 Android Gradle 中秸应,預(yù)留了對 adb 的一些選項的控制配置虑凛,它就是 adbOptions{}閉包,它和 compileOptions一樣也是 Android 的一個方法软啼。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
adbOptions{
timeOutInMs = 5*1000 //秒
installOPtions = '-r','-s'
}
}
第一種對timeOutInMs的設(shè)置采用屬性的方式桑谍,第二種對installOPtions的設(shè)置采用方法的方式。
timeOutInMs 它是設(shè)置超時時間的祸挪,單位是毫秒锣披,這個超時時間是執(zhí)行 adb 這個命令的超時時間。有時候我們安裝贿条、運(yùn)行或者調(diào)試的時候雹仿,可能會遇到 CommandRejectException 這樣的異常,這個一般是當(dāng)我們執(zhí)行一個命令的時候整以,在規(guī)定的 時間內(nèi)沒有返回結(jié)果胧辽,我們可以把超時設(shè)置長一些。記住公黑,它的單位是毫秒邑商。
installOPtions 它是用來設(shè)置 adb install安裝這個操作的設(shè)置項。比如要安裝到 SD 上凡蚜,還是要替換安裝等人断。
adb install 有 l、r番刊、t含鳞、s、d芹务、g 六個選項蝉绷。
l:鎖定該應(yīng)用程序
r:替換已存在的應(yīng)用程序鸭廷,也就是我們說的強(qiáng)制安裝
t:允許測試包
s:把應(yīng)用程序安裝到 SD 卡上
d:允許進(jìn)行降級安裝,也就是安裝的程序比手機(jī)上帶的版本低
g:為該應(yīng)用授予所有運(yùn)行時的權(quán)限
6.DEX操作選項配置
Android 中的Java 源碼被編譯成 class 字節(jié)碼后熔吗,在打包成 apk 的時候又被 dx 命令優(yōu)化成 Android 虛擬機(jī)可執(zhí)行的 Dex 文件辆床。
Android 默認(rèn)給 dx 分配的內(nèi)存是 1024M
Android Gradle 插件提供了 dexOptions{}閉包,讓我們可以對 dx 操作進(jìn)行一些配置桅狠。
dexOptions{}是一個DexOptions類型的閉包讼载,它的配置都是有DexOptions提供的。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
dexOptions{
incremental true
javaMaxHeapSize '4g'
jumboMode true
}
}
incremental 屬性中跌,這是一個 boolean 類型的屬性咨堤,用來配置是否啟用 dx 的增量模式,默認(rèn)值是 false漩符,表示不啟用一喘。增量的模式雖然速度更快一些,但目前還是有很多限制嗜暴,也可能會不工作凸克,所以要慎用。
javaMaxHeapSize 屬性闷沥,它是配置執(zhí)行 dx 命令時為其分配的最大堆內(nèi)存萎战,主要用來解決執(zhí)行 dx 時內(nèi)存不夠用的情況。它接受一個字符串格式的參數(shù)舆逃,比如 1024MB蚂维,代表 1GB。
jumboMode 屬性颖侄,boolean 類型鸟雏,它可以用來配置是否開啟 jumbo 模式。有時候我們的程序項目工程比較大览祖,代碼太多孝鹊,函數(shù)超過 65535 個,那么就需要強(qiáng)制開啟 jumbo 模式才可以構(gòu)建成功展蒂。
preDexLibraries 屬性又活,boolean 類型,用來配置是否預(yù)執(zhí)行 dex Libraries 庫工程锰悼,開啟后會大大提高增量的構(gòu)建速度柳骄,不過這可能會影響 clean 構(gòu)建速度。默認(rèn)值為 true箕般,是開啟的耐薯。
- threadCount 屬性,它是 integer 類型,用來配置 Android Gradle 運(yùn)行 dx 命令時使用的線程數(shù)量曲初,適當(dāng)?shù)木€程數(shù)量可以提高 dx 的效率体谒。
android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
dexOptions{
threadCount 2
}
}
7.多項目構(gòu)建
dimension是 ProductFlavor 的一個屬性,接受一個字符串臼婆,作為該P(yáng)roductFlavor的維度抒痒。
flavorDimensions 使我們使用的 android{}里的方法,它和ProductFlavors{}是平級的颁褂,一定要先使用flavorDimensions聲明維度故响,才能在ProductFlavors中使用。
android{
flavorDimensions "abi","version"
productFlavors{
free {
dimension 'version'
}
paid {
dimension 'version'
}
x86 {
dimension 'version'
}
arm {
dimension 'version'
}
}
}
-
示例中的 abi 和 version颁独,現(xiàn)在構(gòu)建產(chǎn)物 (variant)= BuildType+Abi+Version 所以會生成如下的 variant:
ArmFreeDebug
ArmFreeRelease
ArmPaidDebug
ArmPaidReleaseX86FreeDebug
X86FreeRelease
X86PaidDebug
X86PaidRelease 這種我們只根據(jù)維度去分組彩届、去配置,剩下的讓 Android Gradle 幫我們組合產(chǎn)生結(jié)果的 variant奖唯,實現(xiàn)了共性配置惨缆,也就是模塊化編程糜值,維護(hù)起來也很方便丰捷。