Android Build Types (構建型別)
Build Types(構建型別)
預設情況下,Android Plugin會自動給專案設定同時構建應用程式的debug和release版本。 兩個版本之間的不同主要圍繞著能否在一個安全裝置上除錯,以及APK如何簽名。
Debug版本採用使用通用的name/password鍵值對自動建立的數字證書進行簽名,以防止構建過程中出現請求資訊。Release版本在構建過程中沒有簽名,需要稍後再簽名。
這些配置通過一個BuildType
物件來配置。預設情況下,這兩個例項都會被建立,分別是一個debug
版本和一個release
版本。
Android plugin允許像建立其他構建型別一樣定製debug
release
例項。這需要在buildTypes
的DSL容器中配置:
android {
buildTypes {
debug {
applicationIdSuffix ".debug"
}
jnidebug.initWith(buildTypes.debug)
jnidebug {
packageNameSuffix ".jnidebug"
jnidebugBuild true
}
}
}
以上程式碼片段實現了以下功能:
- 配置預設的
debug
構建型別- 將debug版本的包名設定為.debug以便能夠同時在一臺裝置上安裝debug和release版本的apk。
- 建立了一個名為
jnidebug
的新構建型別,並且這個構建型別是debug
構建型別的一個副本。 - 繼續配置
jnidebug
構建型別,允許使用JNI元件,並且也添加了不一樣的包名字尾。
建立一個新的構建型別就是簡單的在buildType
標籤下新增一個新的元素,並且可以使用initWith()
或者直接使用閉包來配置它。
以下是一些可能使用到的屬性和預設值:
Property name | Default values for debug | Default values for release / other |
---|---|---|
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 Type還會受專案原始碼和資源影響: 對於每一個Build Type都會自動建立一個匹配的sourceSet。預設的路徑為:
src/<buildtypename>/
這意味著BuildType名稱不能是main或者androidTest(因為這兩個是由plugin強制實現的),並且他們互相之間都必須是唯一的。
跟其他sourceSet設定一樣,Build Type的source set路徑可以重新被定向:
android {
sourceSets.jnidebug.setRoot('foo/jnidebug')
}
另外,每一個Build Type都會建立一個新的assemble任務。
assembleDebug
和assembleRelease
兩個Task在上面已經提到過,這裡要講這兩個Task從哪裡被建立。當debug
和release
構建型別被預建立的時候,它們的tasks就會自動建立對應的這個兩個Task。
上面提到的build.gradle程式碼片段中也會實現assembleJnidebug
task,並且assemble
會像依賴於assembleDebug
和assembleRelease
一樣依賴於assembleJnidebug
。
提示:你可以在終端下輸入gradle aJ去執行assembleJnidebug task
。
可能會使用到的情況:
- release模式不需要,只有debug模式下才使用到的許可權
- 自定義的debug實現
- 為debug模式使用不同的資源(例如當資源的值由繫結的證書決定)
BuildType的程式碼和資源通過以下方式被使用:
- manifest將被混合進app的manifest
- 程式碼行為只是另一個資原始檔夾
- 資源將疊加到main的資源中,並替換已存在的資源。