受用不盡的Gradle使用方法與技巧

jopen 8年前發布 | 36K 次閱讀 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
    }
  }
}

現在運行測試時,輸出結果如下:

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軟件工程師

翻譯:孫薇

審校:唐小引

文章來源: Gradle tips & tricks to survive the zombie apocalypse

來自: http://www.iteye.com/news/31260

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!