自定義構(gòu)建出的文件名
在android代碼塊下,使用注入替換的方式,可以自定義構(gòu)建出的文件名,比每次都出來默認的app-debug.apk或者app-release.apk要友好且清晰。具體代碼如下:
//自定義生成的apk名稱
applicationVariants.all { variant ->
variant.outputs.each { output ->
if (!variant.buildType.name.equals('debug')) {
def outputFile = output.outputFile
//這里修改文件名
def fileName = "GradleDemo-V"+defaultConfig.versionCode+"-"+buildTime()+"-"+getSvnRevision()+".apk"
output.outputFile = new File(rootProject.buildDir.path, fileName)
}
}
}
效果如圖:
多渠道打包
我個人不建議在gradle里用最古老的多渠道打包方法(清單文件里建meta-data,再用productFlavors里面配各種渠道值來動態(tài)替換清單文件里的渠道號占位變量。)
原因很明顯:配置麻煩,構(gòu)建非常非常慢,打出來20個包估計得半小時。
我個人也不建議在gradle里直接配 packNg或者walle,因為我個人認為打包生成的文件,本質(zhì)上是一個壓縮包,對于一個壓縮包的處理或者生成一堆壓縮包,不應(yīng)該是gradle的工作。我們應(yīng)該把 構(gòu)建出安裝包 和 一個包分身出多個 這兩個作為不同類型的任務(wù)(比如我們可以把多渠道分身的任務(wù)交給運營或者測試,哈哈哈,可以減輕我們?nèi)蝿?wù)節(jié)約我們的時間啦,也不用每次給他們花好長時間發(fā)幾十個包)
我個人建議使用packNg、AndroidMultiChannelBuildTool 或者 walle 的命令行工具在電腦上單獨做分身多渠道的任務(wù)。團隊分享內(nèi)我已經(jīng)寫了相關(guān)教程以及批處理腳本。(另外隨著Android7.0的出現(xiàn),我們推薦使用walle,因為它速度快,使用方便,支持對v2簽名包的分身多渠道打包)
多模塊組件化配置
在gradle.properties配置一個isModule配置項,取值為true或false。
true代表使用組件化模式,有些獨立的模塊可以單獨拎出來編譯打包或者單獨做單元測試,不同模塊可以分開維護。
false代表集成模式,還是以app模塊作為工程的主模塊,主模塊依賴各個業(yè)務(wù)模塊(都作為library)。
在獨立出業(yè)務(wù)模塊的build.gradle里,讀取isModule配置值,做不同的模塊配置選項
對于各模塊的build.gradle除了讀取isModule做不同配置外,還有一個比較方便的方案是:把各個模塊的build.gradle公共配置,抽到一個公共配置文件里,方便統(tǒng)一修改和統(tǒng)一管理,在各模塊的build.gradle中使用apply from:讀取(缺點:必須使用AS的Project視圖,才能查看到我們的公共配置文件)。
我們在項目更目錄下新建CommonConf文件夾,添加modulesCommonConfig.gradle,在modules2中apply。
實際運行效果圖:
打開不同模塊的app:
關(guān)于組件化模式和集成模式清單文件的問題:
當(dāng)獨立模塊作為一個獨立組件編譯運行時(com.android.application),它是要有入口activity的;相反如果用集成模式編譯它將作為主模塊依賴的庫(com.android.library),它的清單文件和資源將會在編譯打包時做混合,如果有了不同的application屬性或者多個入口activity,就會沖突報錯。
但是我們?nèi)绻看味既ナ謩有薷那鍐挝募?,這將是很麻煩的,我們可以創(chuàng)建兩個有差異的清單文件,一個給組件化模式用,一個給集成模式用。然后在模塊的build.gradle中,根據(jù)isModule標志,設(shè)定使用不同的清單文件。
例子如下(可以把這個代碼塊寫在每個模塊的build.gradle里,也可以寫在各模塊的公共配置文件里,然后用apply from:讀取使用):
我會把Demo地址添加在文章的最后。
一些雜項配置
compileOptions {
//指定編譯用的java版本
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
dexOptions {
//讓它不要對Lib做preDexing
preDexLibraries = false
//開啟incremental dexing,優(yōu)化編譯效率,這個功能android studio默認是關(guān)閉的
incremental true
//增加java堆內(nèi)存大小
javaMaxHeapSize "4g"
}
//默認的一些文件路徑的配置
sourceSets {
main {
assets.srcDirs = ['assets'] //資源文件
jni.srcDirs 'src/main/jni' //jni文件
jniLibs.srcDir 'src/main/jniLibs' //jni庫
}
}
packagingOptions {
//打包排除掉,不想添加到apk中的文件
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/ASL2.0'
}
dependencies代碼塊
dependencies稱作依賴配置,一般可以配置三種:依賴本地庫文件,依賴遠程庫文件,依賴本地工程模塊
分別示例如下:
compile fileTree(dir: 'libs', include: '*.jar')
provided fileTree(dir: '../honjane-demo-library/libs', include: '*.jar')//依賴本地jar
compile(name: 'liblivenessdetector2-release', ext: 'aar')
compile(name: 'lib-1.1', ext: 'aar')//依賴本地aar
compile 'com.jakewharton:butterknife:8.2.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'//依賴遠程庫
if (isModule.toBoolean()) {
compile project(':mylibrary')
} else {
compile project(':module2')
compile project(':module3')
compile project(':module4')
compile project(':module5')
}//依賴本地工程模塊
關(guān)于Gradle的介紹就到這里啦,歡迎大家一起討論。
項目地址:github
項目地址:github
項目地址:github
重要的事情說三遍
謝謝大家。完結(jié)撒花
