1. 程式人生 > >受用不盡的Gradle使用方法與技巧

受用不盡的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)。

圖片描述