能方便地在CI服務器配置每一個build的版本和簽名信息linux
不須要在commit中包含keystore, key密碼等東西android
每一個release build有一致且單調遞增的版本號git
以上設定都是可選的,其餘人仍然能夠clone代碼後馬上在IDE運行bash
用CI服務器的build script生成版本號服務器
簽名信息只寫在build scriptgradle
用環境變量傳遞版本號和簽名信息ui
沒有環境變量時使用默認設置設計
// 從環境變量中讀取字符串或整數 def env = { System.getenv it } def envInt = { Integer.parseInt(env(it)) } android { defaultConfig { if (env("ANDROID_VERSION_CODE")) { versionCode envInt("ANDROID_VERSION_CODE") versionName env("ANDROID_VERSION_NAME") } else { // 沒有環境變量時的默認設置 versionCode 1 versionName "1.0" } } } if (env("ANDROID_SIGN_APK")) // 有環境變量時 才設置apk簽名信息 android { signingConfigs { releaseSigning { storeFile file(env("ANDROID_KEYSTORE_PATH")) storePassword env("ANDROID_KEYSTORE_PASS") keyAlias env("ANDROID_KEY_ALIAS") keyPassword env("ANDROID_KEY_PASS") } } buildTypes { release { signingConfig signingConfigs.releaseSigning } } }
#!/bin/bash # JDK/SDK路徑 export ANDROID_HOME=/somewhere/android-sdk-linux export JAVA_HOME=/somewhere/jdk1.8.0_65 # 簽名信息 export ANDROID_KEYSTORE_PATH=/somewhere/keys.jks export ANDROID_SIGN_APK=yes export ANDROID_KEYSTORE_PASS=secret export ANDROID_KEY_ALIAS=secret export ANDROID_KEY_PASS=secret # versionCode: 從當前commit可到達的commit數量 === 祖先commit數量+1 # 若是release build都在一個固定分支, versionCode會單調增長 (可是未必是連續整數) export ANDROID_VERSION_CODE="$(git rev-list HEAD --count)" # versionName: 當前commit的sha1的開頭8字符 export ANDROID_VERSION_NAME="${GIT_COMMIT:0:8}" exec sh gradlew clean aR