# 構建類型
默認情況下,Android Plugin 會自動給項目構建 debug 和 release 版本。兩個版本的區別在于能否在安全設備上調試,以及 APK 如何簽名。
debug 版采用通用的 `name/password` 對來自動創建的密鑰證書進行簽名(為了防止在構建過程中出現認證請求)。release 版在構建過程中不進行簽名,需要稍后再進行簽名。
這些配置是通過 **BuildType** 對象來完成的。默認情況下,兩個實例都會被創建,分別是 **debug** 和 **release**
Android plugin 允許像創建其他*構建類型*一樣定制這兩個實例。可以在 **buildTypes** 的 DSL 容器中完成:
~~~
android {
buildTypes {
debug {
applicationIdSuffix ".debug"
}
jnidebug.initWith(buildTypes.debug)
jnidebug {
packageNameSuffix ".jnidebug"
jnidebugBuild true
}
}
}
~~~
上面的代碼片段實現了以下功能:
- 配置默認的 **debug** 構建類型:
- 設置包名為`<app appliationId>`.debug,以便能夠在同一個設備上安裝 *debug* 和 *release* 版的 apk
- 創建了名為 **jnidebug** 的新 *BuildType*,并且用 **debug** 構建類型的默認配置來初始化自身。
- 繼續配置 **jnidebug**,可以構建 JNI 組件,并添加了不一樣的包名后綴。
創建一個*新的構建類型*就是簡單的在 **buildTypes** 標簽下添加一個新的元素,并且通過調用 **initWith()** 或者直接使用閉包來配置它。
以下是一些可能使用到的屬性和默認值:
| 屬性名 | debug 類型的默認值 | release 或其他類型默認值 |
|-----|-----|-----|
| **debuggable** | true | false |
| **jniDebugBuild** | false | false |
| **renderscriptDebugBuild** | false | false |
| **renderscriptOptimLevel** | 3 | 3 |
| **applicationIdSuffix** | null | null |
| **versionNameSuffix** | null | null |
| **signingConfig** | android.signingConfigs.debug | null |
| **zipAlign** | false | true |
| **runProguard** | false | false |
| **proguardFile** | N/A (set only) | N/A (set only) |
| **proguardFiles** | N/A (set only) | N/A (set only) |
除了以上屬性外,*Build Types* 還會受項目源碼和資源影響。
對于每一個 Build Type 都會自動創建一個匹配的 *sourceSet*。默認的路徑為:
~~~
src/<buildtypename>/
~~~
這意味著 *BuildType* 名稱不能是 *main* 或者 *androidTest*(因為這兩個是由 plugin 強制實現的),并且他們都必須是唯一的。
跟其他 sourceSet 設置一樣,Build Type 的 source set 路徑也可以重新定向:
~~~
android {
sourceSets.jnidebug.setRoot('foo/jnidebug')
}
~~~
另外,每一個 *Build Type* 都會創建一個新的 `assemble<BuildTypeName>` 任務。
**assembleDebug** 和 **assembleRelease** 在上面已經提到過,這里要講的是它們從哪被創建。當 **debug** 和 **release** 構建類型被預創建的時候,它們的 tasks 就會自動創建。
上面提到的 *build.gradle* 代碼片段中也會實現 **assembleJnidebug** task,并且 **assemble** 會像依賴于 **assembleDebug** 和 **assembleRelease** 一樣依賴于 **assembleJnidebug**。
提示:你可以在終端下輸入 `gradle aJ` 去運行 **assembleJnidebug** task。
可能會使用到的情況:
- debug 模式下才用到的權限
- 自定義的 debug 實現
- 為 debug 模式使用不同的資源(例如,當資源的值由綁定的證書決定)
*BuildType* 的代碼和資源通過以下方式被使用:
- manifest 將被混合進 app 的 manifest
- 代碼只是換了一個資源文件夾
- 資源將疊加到 main 的資源中,并替換已存在的資源。
- 譯者序
- 簡介
- 新構建系統的目標
- 為什么使用 Gradle?
- 配置要求
- 基礎項目
- 構建文件示例
- 項目結構
- 配置項目結構
- 構建任務
- 通用任務
- Java 項目的 Task
- Android Tasks
- 基本的構建定制
- Manifest 屬性
- 構建類型
- 簽名配置
- 運行 ProGuard
- 清理資源
- 依賴、Library 和多項目
- 包依賴
- 本地包依賴
- 遠程包依賴
- 多項目設置
- Library 項目
- 創建 Library 項目
- 普通項目和 Library 項目的區別
- 引用 Library 項目
- Library 項目發布
- 測試
- 單元測試
- 基本知識和配置
- 運行測試
- 測試 Android Library 項目
- 測試報告
- 獨立項目
- 多項目報告
- Lint 支持
- 構建 Variants(變種)版本
- 產品定制
- 構建類型+產品定制=構建變種版本
- 產品定制的配置
- 源組件和依賴
- 構建和任務
- 測試
- 多定制的變種版本
- 高級構建的自定義
- 構建選項
- Java 編譯選項
- aapt 選項
- dex 選項
- 操作 task
- 構建類型和產物定制的屬性引用
- 使用sourceCompatibility 1.7
- 附錄
- ApplicationId 與 packageName