受用不盡的Gradle使用方法與技巧
Gradle儘管比Android Studio早出現,但直到成了官方IDE之後,Gradle才逐漸流行起來。然而,我們是否將這個強大的自動化構建系統的優勢發揮地淋漓盡致了呢?
專案與build的特定全域性變數
用gradle可以自動生成BuildConfig類,其中能夠生成附加欄位。這對配置伺服器URL之類的工作十分有用,使用它也能輕鬆開啟或關閉功能。
defaultConfig {
buildConfigField "String", "TWITTER_TOKEN", '"SDASJHDKAJSK"'
}
buildTypes {
debug {
buildConfigField "String" , "API_URL", '"http://api.dev.com/"'
buildConfigField "boolean", "REPORT_CRASHES", "true"
}
release {
buildConfigField "String", "API_URL", '"http://api.prod.com/"'
buildConfigField "boolean", "REPORT_CRASHES", "false"
}
}
可以從BuildConfig的final類BuildConfig.TWITTER_TOKEN,BuildConfig.REPORT_CRASHES與BuildConfig.API_URL進行訪問,後兩個根據所在的build類不同也會有差異。
每個buildtype的名字、版本與app id都不同
這樣一來使用者就能同時安裝釋出版與debug版了(切記,在安卓系統中無法安裝同名的不同應用)。使用者可以在崩潰報告工具中以不同的版本名篩選問題與崩潰。通過檢視應用名很容易找到目前所執行的版本。
android {
buildTypes {
debug {
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
resValue "string", "app_name", "CoolApp (debug)"
signingConfig signingConfigs.debug
}
release {
resValue "string", "app_name", "CoolApp"
signingConfig signingConfigs.release
}
}
隱私資訊
在Android系統中,所有應用都必須經過證書數字簽名才能安裝,以便系統能夠識別應用的作者。而其中有些屬於敏感資訊,不應被別人看到。
使用者永遠不該將這類資訊check in到原始碼管理工具中。
有些人主張,每個人都應當有自己的本地配置檔案,甚至用全域性的~/.gradle/build.gradle,不過如果你要執行持續整合(CI)或部署,特別是沒有自己CI伺服器的情況下,不應在CVS系統裡存放任何型別的純文字憑證。
signingConfigs {
release {
storeFile "${System.env.COOL_APP_PRIVATE_KEY}"
keyAlias "${System.env.COOL_APP_ALIAS}"
storePassword "${System.env.COOL_APP_STORE_PW}"
keyPassword "${System.env.COOL_APP_PW}"
}
}
因此,可以通過環境變數將敏感資訊提供給自己的持續整合伺服器,而無需擔心將任何“危險”資訊check in到公司了。
自動生成版本名稱(versionName)與版本號(versionCode)
將你的版本拆分成邏輯元件,分別管理。不用再考慮版本號修改的是否正確,也不用擔心版本名更新的是否合適了。
def versionMajor = 1
def versionMinor = 0
def versionPatch = 0
android {
defaultConfig {
versionCode versionMajor * 10000 + versionMinor * 100 + versionPatch
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
}
}
給BuildConfig增加git hash與build時間
def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC"))
android {
defaultConfig {
buildConfigField "String", "GIT_SHA", "\"${gitSha}\""
buildConfigField "String", "BUILD_TIME", "\"${buildTime}\""
}
}
現在有兩個可用變數:BuildConfig.GIT_SHA和BuildConfig.BUILD_TIME,用來結合日誌與提交資訊或者build時間再好不過。
扣緊安全帶
想要快速完成部署,只需建立dev型別,將minSdkVersion設定為21。注意:這樣做的話,就無法獲得針對真實minSdk的合適linting了。因此很明顯只能用在日常工作中,而不能用在釋出時。這樣一來,安卓gradle外掛可以將應用程式的每個模組構建為不同的dex檔案(pre-dex),並生成可以在Android Lollipop及以上系統中測試的APK包,而無需再耗費大量時間進行dex合併程序。
android {
productFlavors
dev {
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion 14
}
}
直接將單元測試結果輸出到console中
使用這個小技巧,我們可以實時看到安卓單元測試的記錄結果。
android {
...
testOptions.unitTests.all {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
outputs.upToDateWhen { false }
showStandardStreams = true
}
}
}
現在執行測試時,輸出結果如下:
Gradle,tell me I’m pretty
全部放在一起的話,順序如下:
android {
...
buildTypes {
def BOOLEAN = "boolean"
def TRUE = "true"
def FALSE = "false"
def LOG_HTTP_REQUESTS = "LOG_HTTP_REQUESTS"
def REPORT_CRASHES = "REPORT_CRASHES"
def DEBUG_IMAGES = "DEBUG_IMAGES"
debug {
...
buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, TRUE
buildConfigField BOOLEAN, REPORT_CRASHES, FALSE
buildConfigField BOOLEAN, DEBUG_IMAGES, TRUE
}
release {
...
buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, FALSE
buildConfigField BOOLEAN, REPORT_CRASHES, TRUE
buildConfigField BOOLEAN, DEBUG_IMAGES, FALSE
}
}
}
作者:César Ferreira,Android軟體工程師
翻譯:孫薇
審校:唐小引
第一時間掌握最新移動開發相關資訊和技術,請關注mobilehub公眾微訊號(ID: mobilehub)。