Android 開發(fā)之 Gradle那些事兒(三)

自定義構(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:


app主模塊
module2模塊

關(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é)撒花

這里寫圖片描述
這里寫圖片描述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • 這一章主要針對項目中可以用到的一些實用功能來介紹Android Gradle,比如如何隱藏我們的證書文件,降低風(fēng)險...
    acc8226閱讀 7,961評論 3 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 小燕子是我們這群師奶中,自認為嫁的最好的。老公帥氣,斯文,白凈,年輕有為,體貼,顧家。用她的話講,就是婚前婚后一個...
    瀟小姐遇見你閱讀 713評論 0 3
  • 你坐在我旁邊說了好久好久 你說家門口的樹葉掉了 秋天快來了 你說隔壁家的大黃生了一群小狗狗 你細細的講述給我聽 我...
    江瀟然閱讀 160評論 0 0

友情鏈接更多精彩內(nèi)容