受用不盡的Gradle使用方法與技巧
Gradle 盡管比 Android Studio 早出現,但直到成了官方IDE之后,Gradle才逐漸流行起來。然而,我們是否將這個強大的自動化構建系統的優勢發揮地淋漓盡致了呢?
項目與build的特定全局變量用gradle可以自動生成BuildConfig類,其中能夠生成附加字段。這對配置服務器URL之類的工作十分有用,使用它也能輕松開啟或關閉功能。
defaultConfig {
buildConfigField "String", "推ter_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.推ter_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
}
}
} 現在運行測試時,輸出結果如下:
全部放在一起的話,順序如下:
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軟件工程師
翻譯:孫薇
審校:唐小引