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 文件更具識別性,如:
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複製代碼
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亦楓
微信掃描二維碼,歡迎關注個人我的公衆號:安卓筆記俠
不只分享個人原創技術文章,還有程序員的職場遐想