關于gradle下Android{}的配置字段說明如下:
defaultConfig{}默認配置胡控,是PriductFlavor類型,它共享給其他ProductFlavor使用
sourceSets{}源文件目錄設置宪郊,是AndroidSourceSet類型
buildtypes{} buildtype類型
sigingConfigs{}簽名配置,signingConfig類型
productFlavors{} 產品風格配置拖陆,ProductFlavor類型
testOptions{} 測試配置 testOptions類型
aaptOptions{}? aapt配置? AaptOptions類型
lintOtions{} lint配置 lintOptons類型
dexOptions{} dex配置弛槐,DexOptions類型
compileOptions{} 編譯配置,CompileOptions類型
packagingOptions{} PackagingOptions類型
jacoco{} jacocoExtension類型 用于設定jacoco版本
splits{} Splits類型
腳本構建工作如下
關于gradle配置編譯APK相關簽名如下依啰;
signingConfigs {
? ? ? ? release {
? ? ? ? ? ? storeFile file('E:\Gsafty\keystoreName.keystore') //絕對路徑
? ? ? ? ? ? storePassword "12345678"
? ? ? ? ? ? keyAlias "alias"
? ? ? ? ? ? keyPassword "12345678"
? ? ? ? }
? ? }
構建類型(開發(fā)過程中會不斷的提交測試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-buildtye.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執(zhí)行相關命令如下:
注:在使用編譯命令之前請確保gradle已經加入環(huán)境變量闷旧,如果沒加入可以通過./gradlew代替gradle(只能在項目更目錄下使用)
1編譯所有productFlavor及對應所有buildType的apk
$gradle assemble //僅僅執(zhí)行項目打包所必須的任務集
$gradle build? //執(zhí)行項目打包所必須的任務及长豁,以及執(zhí)行自動化測試,所以會較慢
如果缺失某參數忙灼,則會把該參數的所有配置都進行編譯蕉斜,即如果運行gradle assembleFlavor,則會編譯出flavor所有buildType的apk
? ? ? ? 例如:
$gradle assemble
$gradle assembleflavorRelease
$gradle assembleflavorDebug
注:gradle支持命令縮寫缀棍,上面兩個命令也可以寫成如下格式
$gradle a
$gradle ass
$gradle aR
$gradle assflavorR
$gradle aD
$gradle assflavorD
在項目跟目錄下創(chuàng)建一個指定的文件夾(用于編譯跑腳本用),例如.config,然后在該目錄下分別創(chuàng)建.bat文件(win7上批處理后綴文件)和簽名文件
批處理文件如下build.bat
注意:這里可能會在cmd窗口出現中文亂碼机错,這是由于便于問題爬范,不會影響編譯。
快速編譯打包apk腳本
echo 打包開始
sleep 1
執(zhí)行打包命令前弱匪,需要先定位到項目更目錄
cd
執(zhí)行打包命令
gradle a
echo -e? 打包完成
桌面右上角彈出通知
notify-send build.sh 打包完成
創(chuàng)建簽名文件sign.txt
簽名文件之所以放在外邊這里是為了更好的保護簽名文件青瀑,盡量少的給其他人知道《安全考慮》
android {
? ? signingConfigs {
? ? ? ? release {
? ? ? ? ? ? storeFile file('E:\Gsafty\keystoreName.keystore') //絕對路徑
? ? ? ? ? ? storePassword "12345678"
? ? ? ? ? ? keyAlias "alias"
? ? ? ? ? ? keyPassword "12345678"
? ? ? ? }
? ? }
}
將簽名文件應用到app的buid.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
? ? ? ? }
? ? }
最后就是給開發(fā)人員的福利,在window機器上直接點擊.bat文件執(zhí)行批處理命令萧诫,即可在項目build目錄下的apk目錄下的到對應的apk包斥难。