每個「建構變化版本」都代表您可以建構的不同應用程式版本。例如,您可能想建構兩個應用程式版本:一個是包含有限內容的免費版應用程式,另一個則是提供更多內容的付費版應用程式。您也可以根據API級別或其他裝置變化版本,為應用程式建構針對各種裝置所設計的不同版本。
Gradle透過一組特定規則,結合建構類型和變種版本中設定的各項設定、程式碼及資源後,就會產生建構變化版本。雖然您無法直接設定建構變化版本,但可以設定組成這類變化版本的建構類型和變種版本。
舉例來說,「demo」的「變種版本」可能會指定某些功能和裝置需求,例如自訂原始碼、資源和最低API級別;「debug」的「建構類型」則會套用不同的建構與封裝設定,例如偵錯選項及簽署金鑰。兩者結合後的建構變化版本即為應用程式的「demoDebug」版本,當中包含「demo」變種版本、「debug」建構類型和main/來源集所含設定與資源的組合。
所有變種版本都必須屬於已命名的版本維度,也就是一組變種版本。您必須將所有變種版本指派給版本維度,否則會收到下列建構錯誤訊息:
Error:Allflavorsmustnowbelongtoanamedflavordimension.Theflavor'flavor_name'isnotassignedtoaflavordimension.如果某個模組只指定一個版本維度,AndroidGradle外掛程式就會自動將此模組的所有變種版本指派給該維度。
建立及設定變種版本後,請按一下通知列中的「SyncNow」。同步處理完成後,Gradle會根據您的建構類型和變種版本自動建立建構變化版本,並依照
android{defaultConfig{applicationId="com.example.myapp"}productFlavors{create("free"){applicationIdSuffix=".free"}create("pro"){applicationIdSuffix=".pro"}}}Groovyandroid{defaultConfig{applicationId"com.example.myapp"}productFlavors{free{applicationIdSuffix".free"}pro{applicationIdSuffix".pro"}}}這樣一來,「free」變種版本的應用程式ID即為「com.example.myapp.free」。
android{...buildTypes{getByName("debug"){applicationIdSuffix=".debug"}}}Groovyandroid{...buildTypes{debug{applicationIdSuffix".debug"}}}由於Gradle會在變種版本之後套用建構類型設定,因此「freedebug」建構變化版本的應用程式ID為「com.example.myapp.free.debug」。若希望同一部裝置同時具有debug和release建構類型,這項功能就很實用,因為兩個應用程式無法使用相同的應用程式ID。
在某些情況下,您可能會想結合多種變種版本的設定。舉例來說,您可能想針對以API級別為依據的「full」和「demo」變種版本,建立不同設定,AndroidGradle外掛程式即可用來建立多組變種版本做為版本維度。
Gradle建構應用程式時,會將您定義的各種版本維度中的變種版本設定,結合建構類型設定,以便建立最終的建構變化版本。Gradle不會結合同一版本維度的不同變種版本。
以先前的建構設定為例,Gradle共建立12個採用下列命名配置的建構變化版本:
除了可以為個別變種版本和建構變化版本建立來源集目錄外,您也可以為每個變種版本「組合」建立來源集目錄。舉例來說,您可以建立Java來源並添加至src/demoMinApi24/java/目錄,只有在建立結合這兩種變種版本的變化版本時,Gradle才會使用這些來源。
Gradle會針對您設定的變種版本與建構類型的所有可能組合,建立建構變化版本。不過,某些建構變化版本可能並不符合您的需求,或者對您的專案沒有意義。如要移除特定建構變化版本設定,請在模組層級build.gradle.kts檔案中建立變化版本篩選器。
舉例來說,您可以在main/來源集中定義基本功能,並使用變種版本來源集變更不同用戶端的應用程式品牌資訊,或者只針對使用debug建構類型的建構變化版本,加入特殊權限和記錄功能。
與main/來源集類似,Gradle會預期以特定方式整理來源集檔案和目錄。舉例來說,Gradle會預期「debug」建構類型專屬的Kotlin或Java類別檔案位於src/debug/kotlin/或src/debug/java/目錄中。
AndroidGradle外掛程式提供實用的Gradle工作,展示如何整理每個建構類型、變種版本和建構變化版本的檔案。例如,下列工作輸出內容中的範例說明Gradle預期在哪裡找到「debug」建構類型的某些檔案:
------------------------------------------------------------Project:app------------------------------------------------------------...debug----Compileconfiguration:debugCompilebuild.gradlename:android.sourceSets.debugJavasources:[app/src/debug/java]Kotlinsources:[app/src/debug/kotlin,app/src/debug/java]Manifestfile:app/src/debug/AndroidManifest.xmlAndroidresources:[app/src/debug/res]Assets:[app/src/debug/assets]AIDLsources:[app/src/debug/aidl]RenderScriptsources:[app/src/debug/rs]JNIsources:[app/src/debug/jni]JNIlibraries:[app/src/debug/jniLibs]Java-styleresources:[app/src/debug/resources]如要查看此輸出內容,請按照下列步驟操作:
建立新的建構變化版本時,AndroidStudio不會為您建立來源集目錄,但會為您提供幾個實用選項。舉例來說,如果只要建立「debug」構建類型的java/目錄,請按照以下步驟操作:
AndroidStudio會為您的debug建構類型建立來源集目錄,然後在其中建立java/目錄。或者,當您在專案中新增特定建構變化版本的檔案時,AndroidStudio也可以為您建立目錄。
舉例來說,如要為「debug」建構類型建立值的XML檔案,請按照以下步驟操作:
由於「debug」建構類型是指定為目標來源集,因此AndroidStudio會在建立XML檔案時自動建立必要目錄。產生的目錄結構如圖1所示。
圖1:「debug」建構類型的新來源集目錄。
來源集在圖示中顯示的綠色指標代表有效狀態。debug來源集後方會加上[main],表示本身將合併至main來源集中。
下列程式碼範例會將app/other/目錄中的來源對應至main來源集的某些元件,並變更androidTest來源集的根目錄:
您可以使用來源集目錄,在當中加入只想與某些設定一起封裝的程式碼和資源。舉例來說,如果您打算建立的「demoDebug」建構變化版本是「demo」變種版本和「debug」建構類型的交叉產品,Gradle會檢視這些目錄,並設定以下優先順序:
為變種版本組合建立的來源集必須包含所有版本維度。舉例來說,建構變化版本來源集必須是建構類型與所有版本維度的組合。若程式碼和資源涉及涵蓋多個(但非全部)版本維度的資料夾,系統並不支援合併這類程式碼與資源。
當Gradle結合程式碼和資源時,上述順序將決定優先順序較高的來源集。demoDebug/來源集目錄可能含有建構變化版本專屬的檔案,因此如果demoDebug/包含debug/中一併定義的檔案,Gradle就會使用demoDebug/來源集中的檔案。同樣地,針對建構類型與變種版本來源集中的檔案,Gradle會為其指定高於main/中相同檔案的優先順序。Gradle套用下列建構規則時,會考量這個優先順序:
AndroidGradle外掛程式3.0.0以上版本包含新的依附元件機制,可在使用程式庫時自動比對變化版本。這表示應用程式的debug變化版本會自動採用程式庫的debug變化版本,以此類推。此機制也適用於變種版本:應用程式的freeDebug變化版本會使用程式庫的freeDebug變化版本。
舉例來說,假設應用程式設定了名為「staging」的建構類型,但其中一個程式庫依附元件並未設定該類型。當外掛程式嘗試建構「staging」版應用程式時,將無法得知要使用的程式庫版本,這時系統會顯示類似下方的錯誤訊息:
Error:Failedtoresolve:Couldnotresolveproject:mylibrary.Requiredby:project:app解決關於比對變化版本的建構錯誤應用程式與依附元件之間若無法直接比對變化版本,這個外掛程式包含的DSL元素可協助控管Gradle解決這個狀況。
如要透過Gradle建構設定,手動指定release建構類型的簽署設定,請按照下列步驟操作:
注意:最好不要在建構檔案中加入發布金鑰和KeyStore的密碼,因為這並不安全。請改為設定建構檔案,從環境變數取得這些密碼,或者讓建構程序提示您輸入這些密碼。