受用不盡的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軟件工程師
翻譯:孫薇
審校:唐小引