最近一年來的工做最讓我深有感悟的就是測試動不動就是問我要測試包,弄的我實在是叫苦不堪。今天正好有個工做空檔期,也有些意外看到過些相似的博文,正好在這個工做空檔期實現了Window上跑Gradle腳本自動構建Android項目。android
首先,開發環境:安全
系統:Win7app
Gradle版本:4.2dom
Android Studio: 2.2.2測試
關於Gradle下android{}的配置字段說明以下:gradle
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類型ui
腳本構建工做以下:spa
關於Gradle配置編譯Apk相關簽名以下: debug
android { signingConfigs { release { storeFile file('E:\Gsafty\keystoreName.keystore') //絕對路徑 storePassword "12345678" keyAlias "alias" keyPassword "12345678" } } }
構建類型(開發過程當中會不斷的提交測試debug包到測試人員去測試)code
以下代碼僅作參考:
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 a echo -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包.