標籤:variant custom 等於 欄位 ase 中文 手動 with font
最近一年來的工作最讓我深有感悟的就是測試動不動就是問我要測試包,弄的我實在是叫苦不堪。今天正好有個工作空檔期,也有些意外看到過些類似的博文,正好在這個工作空檔期實現了Window上跑Gradle指令碼自動構建Android項目。
首先,開發環境:
系統:Win7
Gradle版本:4.2
Android Studio: 2.2.2
關於Gradle下android{}的配置欄位說明如下:
defaultConfig{} 預設配置,是ProductFlavor類型。它共用給其他ProductFlavor使用
sourceSets{ } 源檔案目錄設定,是AndroidSourceSet類型。
buildTypes{ } BuildType類型
signingConfigs{ } 簽名配置,SigningConfig類型
productFlavors{ } 產品風格配置,ProductFlavor類型
testOptions{ } 測試組態,TestOptions類型
aaptOptions{ } aapt配置,AaptOptions類型
lintOptions{ } lint配置,LintOptions類型
dexOptions{ } dex配置,DexOptions類型
compileOptions{ } 編譯配置,CompileOptions類型
packagingOptions{ } PackagingOptions類型
jacoco{ } JacocoExtension類型。 用於設定 jacoco版本
splits{ } Splits類型
指令碼構建工作如下:
關於Gradle配置編譯Apk相關簽名如下:
android { signingConfigs { release { storeFile file(‘E:\Gsafty\keystoreName.keystore‘) //絕對路徑 storePassword "12345678" keyAlias "alias" keyPassword "12345678" } }}
構建類型(開發過程中會不斷的提交測試debug包到測試人員去測試)
如下代碼僅做參考:
buildTypes { release { minifyEnabled false shrinkResources false zipAlignEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.txt‘ } debug { minifyEnabled false shrinkResources false zipAlignEnabled false } custom { minifyEnabled false shrinkResources false zipAlignEnabled false } sourceSets { main { jni.srcDirs = [] } } }
多渠道打包構建不同渠道的多個類型apk
這裡不同的渠道會根據構建類型產生對應的apk,其對應關係為渠道種類數*構建編譯類型數等於編譯出的APK數。
/*多渠道包*/ productFlavors{ tencent{ applicationId "com.domin.armn" versionCode "1.0" versionName "1.2.0" manifestPlaceholders = [appName: "tencent"] } baidu{ applicationId "com.domin.armn" versionCode "1.0" versionName "1.2.0" manifestPlaceholders = [appName: "baidu"] } }
自訂產生的APK包名稱
例如:module_flavor-version-time-buildtype.apk
在APP下的build.gradle根目錄下聲明如下:
//擷取目前時間def getCurrentTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))}
在Android{}目錄下聲明如下:
/*apk重新命名*/ android.applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { def buildType = variant.buildType.name //這裡修改apk檔案名稱,格式為 module_flavor-version-time-buildtype.apk def fileName = "Gsafety_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk" output.outputFile = new File(outputFile.parent, fileName) } } }
進階配置項
以上所有的設定尚且不能夠完全滿足自動化編譯,仍然需要使用者手動輸入命令去運行編譯APK包,這當然不是我們最想要的結果。
Gradle執行相關命令如下:
註:在使用編譯命令之前請確保gradle已經加入環境變數,如果沒加入可以通過./gradlew替代gradle(只能在項目根目錄下使用)
1編譯所有productFlavor及對應所有buildType的apk.
$gradle assemble //僅僅執行項目打包所必須的任務集
$gradle build //執行項目打包所必須的任務集,以及執行自動化測試,所以會較慢
如果當前Project包含多個Module,在Project根目錄執行gradle assemble會編譯所有的Module
2編譯指定productFlavor及buildType的apk
$gradle assemble[productFlavor][buildType]
如果缺失某參數,則會把該參數的所有配置都進行編譯,即如果運行gradle assembleflavor,則會編譯出flavor所有buildType的apk
例如:
$gradle assemble
$gradle assembleflavorRelease
$gradle assembleflavorDebug
注:gradle支援命令縮寫,上面兩個命令也可以寫成如下格式
$gradle a
$gradle ass
$gradle aR
$gradle assflavorR
$gradle aD
$gradle assflavorD
在項目根目錄下建立一個指定的檔案夾(用於編譯跑指令碼用),例如.config,然後在該目錄下分辨建立.bat檔案(win7上批處理尾碼檔案)和簽名檔案
批次檔如下build.bat:
注意:這裡可能會在CMD視窗出現中文亂碼,這是由於便於問題,不會影響編譯。
#快速編譯打包apk指令碼echo " **************************打包開始 ************************** "sleep 1#執行打包命令前,需要先定位到項目根目錄cd ..#執行打包命令gradle aecho -e "**************************打包完成************************** "#案頭右上方彈出通知notify-send build.sh "打包完成!"
建立簽名檔案sign.txt:
簽名檔案之所以放到外邊這裡是為了更好的保護簽名檔案,盡量少的給其他人知道<安全考慮>。
android { signingConfigs { release { storeFile file(‘E:\Gsafty\keystoreName.keystore‘) //絕對路徑 storePassword "12345678" keyAlias "alias" keyPassword "12345678" } }}
將簽名檔案應用到app的build.gradle檔案下的android{}:
//載入簽名資訊 File configFile = file(‘../.config/sign.txt‘) if (configFile.exists()) { def signGradlePath = configFile.newReader().readLine().trim() println ‘lucher, path:‘ + signGradlePath if (file(signGradlePath).exists()) { apply from: signGradlePath } }
最後就是開發人員的福利了,在window機器上直接點擊.bat檔案執行批處理命令,即可在項目build目錄下的apk目錄下得到對應的apk包.
Android Studio之Gradle自動化構建打包