1. 程式人生 > >Android Build Types (構建型別)

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以便能夠同時在一臺裝置上安裝debugrelease版本的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任務。

assembleDebugassembleRelease兩個Task在上面已經提到過,這裡要講這兩個Task從哪裡被建立。當debugrelease構建型別被預建立的時候,它們的tasks就會自動建立對應的這個兩個Task。

上面提到的build.gradle程式碼片段中也會實現assembleJnidebug task,並且assemble會像依賴於assembleDebugassembleRelease一樣依賴於assembleJnidebug

提示:你可以在終端下輸入gradle aJ去執行assembleJnidebug task

可能會使用到的情況:

  • release模式不需要,只有debug模式下才使用到的許可權
  • 自定義的debug實現
  • 為debug模式使用不同的資源(例如當資源的值由繫結的證書決定)

BuildType的程式碼和資源通過以下方式被使用:

  • manifest將被混合進app的manifest
  • 程式碼行為只是另一個資原始檔夾
  • 資源將疊加到main的資源中,並替換已存在的資源。