Android Gradle 經常使用使用場景實現方式的總結

Gradle 做爲一款靈活多變的構建插件,與 Android Studio 的結合,可以解決過去使用 Eclipse 開發 App 時所遇到的諸多問題。同時,基於 Groove 這樣一款 DSL 語言的腳本特性,記住各類語法顯然又是一件比較困難的事情。html

事實上,Gradle 插件的經常使用使用場景並非不少,也不須要死記硬背,或者徹底學會 Groove 的全部使用方式。這裏將 Android 開發中較爲經常使用的 Gradle 使用場景總結出來,用於未來須要的時候有個參考。android

多渠道打包

舉一個最多見的多渠道使用場景,友盟統計,看看最基本的 Gradle 多渠道打包方式的用法。git

修改 Manifest 文件中友盟統計的渠道名爲引用變量(變量名自取):程序員

<meta-data android:name="${UMENG_CHANNEL_VALUE}" android:value="Channel_ID" />複製代碼

而後在 build.gradle 文件 productFlavors 配置項中添加渠道名,並統一設置到上面提到的變量名:github

android {
    productFlavors {
        xiaomi {}
        yingyongbao {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}複製代碼

執行打包 Task 的命令語句便可:安全

./gradle assembleRelease複製代碼

或者有針對性的只打特定渠道包,如:bash

./gradle assembleXiaomiRelease複製代碼

備註:在 Gradle projects 窗口中可以查看全部可執行的 Tasks 列表。這種原生態打包方式適合渠道名比較少的使用場景。當渠道多達數十個甚至上百個時,打包時間就會比較長,推薦其餘打包方案,如:服務器

自定義輸出 APK 文件名

能夠修改打包輸出的 apk 文件名,添加時間戳、編譯類型、版本信息等關鍵字,是 apk 文件更具識別性,如:

apply plugin: 'com.android.application'

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent, rootProject.getName()
                    + "-" + buildType.name
                    + "-" + releaseTime()
                    + "-v" + defaultConfig.versionName
                    + "-" + defaultConfig.versionCode
                    + ".apk");
        }
    }
}複製代碼

這裏將項目名稱添加到 apk 文件名中,也可使用 applicationId 等,結果以下:

YFSample-release-2017-09-12-v1.0-1.apk複製代碼

Debug 和 Release 相同簽名

android {
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "DEBUG_MODE", "true"
            signingConfig signingConfigs.config
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "DEBUG_MODE", "false"
            signingConfig signingConfigs.config
        }
    }
}複製代碼

這一步操做能夠經過圖形化界面操做,更方便一些。右鍵項目,點擊 Open Module Settings,打開 Project Structure 窗口,在 Build Types 選項卡中設置。

隱藏簽名信息

簽名信息做爲項目裏最爲私密的一部份內容,若是直接暴露在 build.gradle 文件中,顯然不夠安全。尤爲是須要上傳到 GitHub 等託管平臺時。

比較穩當的作法是,在項目根目錄下新建一個專門用來存儲簽名信息的文件,而且將其添加到 ignore 文件配置當中。具體操做過程以下:

第一步,新建一個 keystore.properties 文件:

ReleaseKeyPassword=sampleKeyPwd
ReleaseKeyAlias=sampleAlias
ReleaseStorePassword=sampleStorePwd
ReleaseStoreFile=../sample.jks複製代碼

第二步,在 build.gradle 文件的最外層引入簽名信息:

allprojects {
    afterEvaluate { project ->
        def propsFile = rootProject.file('keystore.properties')
        def configName = 'config'

        if (propsFile.exists() && android.signingConfigs.hasProperty(configName)) {
            def props = new Properties()
            props.load(new FileInputStream(propsFile))
            android.signingConfigs[configName].storeFile = file(props['ReleaseStoreFile'])
            android.signingConfigs[configName].storePassword = props['ReleaseStorePassword']
            android.signingConfigs[configName].keyAlias = props['ReleaseKeyAlias']
            android.signingConfigs[configName].keyPassword = props['ReleaseKeyPassword']
        }
    }
}複製代碼

如此便可。其中第二步還有一種縮減版的寫法,也能夠直接使用:

def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    signingConfigs {
        config {
            storeFile file(keystoreProperties['ReleaseStoreFile'])
            storePassword keystoreProperties['ReleaseStorePassword']
            keyAlias keystoreProperties['ReleaseKeyAlias']
            keyPassword keystoreProperties['ReleaseKeyPassword']
        }
    }
}複製代碼

固然,隱藏簽名信息的方式還有不少。好比配置在本地環境變量中,或者 build.gradle 文件中,或者編譯時從命令行中動態讀取輸入內容等,設置不一樣,讀取方式有所不一樣。

日誌開關

在 app/build.gradle 文件中分別定義 debug 和 release 不一樣編譯模式的控制變量,變量名可自由更改:

buildTypes {
    debug {
        buildConfigField "boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "boolean", "DEBUG_MODE", "false"
    }
}複製代碼

從新編譯後,自動生成的 BuildConfig 類中包含上面定義的 DEBUG_MODE 屬性,便可使用。

Log 日誌開關更多解決方案,可參考:Android 中可以做爲 Log 開關的一些操做以及安全性淺談

環境分離

開發中測試服務器和生產服務器的同時使用也是很常見的場景之一,如何在一臺設備中同時安裝配置測試環境的 debug 包和生產環境的 release 包,也是須要面對的問題。不妨參考個人這篇文章:

Android 利用 Gradle 實現 app 的環境分離

參考連接

學習有關 Android、Gradle 和 Groove 更多詳細信息,除了訪問 Gradle 官方網站,推薦你閱讀這些文章:

END

關於我:亦楓,博客地址:yifeng.studio/,新浪微博:IT亦楓

微信掃描二維碼,歡迎關注個人我的公衆號:安卓筆記俠

不只分享個人原創技術文章,還有程序員的職場遐想

相關文章
相關標籤/搜索