Gradle系列之Android Gradle高階配置
阿新 • • 發佈:2020-09-21
本篇文章主要在之前學習的基礎上,從實際開發的角度學習如何對 Android Gradle 來進行自定義以滿足不同的開發需求,下面是 Gradle 系列的幾篇文章:
- [Gradle系列之初識Gradle](https://juejin.im/post/6844903874629730318)
- [Gradle之Groovy基礎篇](https://juejin.im/post/6844903876177428494)
- [Gradle系列之構建指令碼基礎](https://juejin.im/post/6844903878199099405)
- [Gradle系列之認識Gradle任務](https://juejin.im/post/6844903879872610311)
- [Gradle系列之Gradle外掛](https://juejin.im/post/6844903881671966727)
- [Gradle系列之Java Gradle外掛](https://juejin.im/post/6844903887078424590)
- [Gradle系列之Android Gradle外掛](https://juejin.im/post/6844903891931234312)
- [Gradle系列之Android Gradle基礎配置](https://juejin.im/post/6844903925804449799)
下面是主要內容:
1. 修改生成的Apk檔名
2. 版本資訊統一管理
3. 隱藏簽名檔案資訊
4. 動態配置AndroidManifest檔案
5. 自定義BuildConfig
6. 動態新增自定義資源
7. Java編譯選項
8. adb操作選項配置
9. DEX選項配置
10. 自動起立未使用的資源
11. 突破65535方法限制
#### 修改生成的Apk檔名
修改打包輸出的 Apk 的檔名主要用到三個屬性:
```java
applicationVariants //Android應用Gradle外掛
libraryVariants //Android庫Gradle外掛
testVariants //上述兩種外掛都適用
```
下面是修改打包生成的 Apk 檔名的程式碼,參考如下:
```java
android{
//...
/**
* 修改打包生成的apk的檔名
*/
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (output.outputFile != null && output.outputFile.name.endsWith('.apk') &&
'release' == variant.buildType.name) {
//輸出檔名
outputFileName = "AndroidGradleProject_v${variant.versionName}_${buildTime()}.apk"
}
}
}
}
//當前時間
def static buildTime() {
def date = new Date()
return date.format("yyyMMdd")
}
```
此時,執行 release 模式構建 Apk 的任務,生成的 Apk 的名字就修改了,當然還可以配置在 debug 模式下生成對應的檔名等。
#### 版本資訊統一管理
每個應用都有一個版本,版本一般由三部分組成:major.minor.patch,第一個是主版本號,第二個是副版本號,第三個是補丁號,如 1.0.0 這種格式的版本號,在 Android 開發中最原始的版本配置方式就是在 build.gradle 中在 defaultConfig 中配置對應的版本號和版本名稱,參考如下:
```java
//最原始的版本配置方式
android{
defaultConfig {
versionCode 1
versionName "1.0"
//...
}
}
```
實際開發中一般將這種版本相關的資訊單獨定義在一個獨立的版本管理檔案中進行統一管理,定義 version.gradle 檔案如下:
```java
ext{
//應用版本號、版本名稱
appversionCode = 1
appVersionName = "1.0"
//其他版本號...
}
```
然後在 build.gradle 中使用 version.gradle 檔案中定義的版本號、版本名稱即可,參考如下:
```java
//引入version.gradle檔案
apply from: "version.gradle"
android {
//...
defaultConfig {
//使用version.gradle裡定義的版本號
versionCode appversionCode
//使用version.gradle裡定義的版本名稱
versionName appVersionName
//...
}
}
```
當然不只是應用的版本號,還有使用到的一些第三方的庫的版本也可以使用這樣的方式來統一管理。
#### 隱藏簽名檔案資訊
簽名檔案資訊是非常重要的資訊,如果將簽名檔案資訊直接配置到專案中將是不安全的,那麼簽名檔案如何能夠安全呢,簽名檔案放在本地是不安全的,那麼只能放在伺服器上才是安全的,打包的時候從伺服器上讀取簽名檔案資訊即可,當然這個伺服器也可以是一臺專門用於打包正式 Apk 的電腦,將簽名檔案和金鑰資訊配置成環境變數,打包是直接從環境變數中讀取簽名檔案和金鑰資訊即可。
配置四個環境變數 STORE_FILE、STORE_PASSWORD、KEY_ALIAS、KEY_PASSWORD 分別對應簽名檔案、簽名檔案密碼、簽名檔案金鑰別名、簽名檔案金鑰密碼,環境變數的配置就不具體說了,程式碼參考如下:
```java
android {
//簽名檔案配置
signingConfigs {
//讀取配置的與簽名檔案資訊對應的環境變數
def appStoreFile = System.getenv('STORE_FILE')
def appStorePassword = System.getenv('STORE_PASSWORD')
def appKeyAlias = System.getenv('KEY_ALIAS')
def appKeyPassword = System.getenv('KEY_PASSWORD')
//如果獲取不到相關簽名檔案資訊,則使用預設的簽名檔案
if(!appStoreFile || !appStorePassword || !keyAlias || !keyPassword){
appStoreFile = "debug.keystore"
appStorePassword = "android"
appKeyAlias = "androiddebugkey"
appKeyPassword = "android"
}
release {
storeFile file(appStoreFile)
storePassword appStorePassword
keyAlias appKeyAlias
keyPassword appKeyPassword
}
debug {
//預設情況下,debug模式下的簽名已配置為Android SDK自動生成的debug簽名檔案證書
//.android/debug.keystore
}
}
}
```
注意一點,配置好環境變數後,如果不能讀取到新配置的環境變數,重啟電腦後就能讀取到了,至於如何使用專用的伺服器進行打包、讀取簽名檔案資訊實踐後再來介紹。
#### 動態配置AndroidManifest檔案
動態配置 AndroidManifest 配置就是動態的去修改 AndroidManifest 檔案中的一些內容,如友盟等第三方統計平臺分析統計的時候,一般會要求要在 AndroidManifest 檔案中指定渠道名稱,如下所示: