程式碼研究室簡介
1. 簡介
上次更新時間:2022 年 4 月 14 日
建構變化版本很適合用來建立不同的應用程式版本。舉例來說,您可能想為應用程式建立兩個版本,一個是內容受限的免費版本,另一個是含有更多內容的付費版本。您也可以根據 API 等級或其他裝置變化因素,為應用程式建立適用於不同裝置的版本。
在本程式碼實驗室中,您將修改在「單元 1:Kotlin 基本概念」中建構的 Dice Roller 應用程式,使它產生兩個版本:「demo」和「full」版。「full」版會提供額外的文字方塊,其中會用文字顯示擲骰子的結果,讓使用者不必只靠骰子的圖片來判斷擲出的結果。
必備知識
您應該:
- 已完成 Android 基本概念學習課程 1 到 4。如要瞭解程式碼實驗室的必備概念,請參閱「單元 1:Kotlin 基本概念」課程。
- 大致瞭解 Android 建構系統。如要深入瞭解主要元件,請參閱「建構總覽」。
課程內容
- 什麼是建構變化版本。
- 什麼是來源集。
- 如何使用建構變化版本和來源集建構不同版本的應用程式。
- 如何為應用程式變化版本指定唯一的應用程式 ID。
建構項目
在本程式碼實驗室中,您會從在「單元 1:Kotlin 基本概念」學習課程中建構的 DiceRoller 應用程式開始操作。DiceRoller 應用程式包含一張骰子的圖片,圖片下方顯示一個「ROLL」按鈕。使用者點擊「ROLL」時,骰子會擲出,圖片也會根據擲骰子的結果而變更。
您可以建立其他專案檔案並新增程式碼,以便實現以下目標:
- 為應用程式建立「demo」和「full」變種版本。
- 建立與變種版本對應的「demo」和「full」版來源集。
- 在「full」版應用程式的版面配置中加入一個方塊。
- 對「full」版方塊進行程式設計,以便在使用者點擊「ROLL」時顯示結果。
- 自訂應用程式「demo」和「full」版的應用程式名稱。
- 為應用程式的「demo」和「full」版提供唯一應用程式 ID。
「full」版應用程式如下圖所示:
軟硬體需求
2. 設定環境
取得程式碼
如果您尚未透過「單元 1:Kotlin 基本概念」取得可立即使用的 DiceRoller 應用程式,請從 GitHub 下載應用程式的程式碼。
如要下載應用程式的程式碼並在 Android Studio 中並開啟,請按照下列步驟操作:
- 在
android-basics-kotlin-dice-roller-with-images-app-solution
GitHub 存放區首頁中,依序點擊「Code」>「Download ZIP」。 - 下載 ZIP 檔案後,在 Android Studio 中開啟專案,然後依序點擊「File」>「Open」。您可以使用「Empty Activity」新建專案,也可以在出現系統提示時開啟先前專案。由於我們會開啟已下載的專案,因此不論何種選擇皆不會有太大影響。
- 前往 ZIP 檔案下載的位置 (可能位於
Downloads
資料夾),選取該檔案,然後點擊「Open」。
使用「Project」檢視畫面
處理建構變化版本時,您必須在「Project」檢視畫面中使用專案檔案,才能查看不同變化版本的所有目錄。為此,請在 Android Studio 中開啟「Project」窗格,點擊檢視畫面類型選單 (預設為「Android」 檢視畫面),然後選取「Project」檢視畫面。
3. 瞭解建構變化版本
建構變化版本是以不同方式組合「變種版本」和「建構類型」的結果。您可以將變種版本視為更符合使用者需求的屬性,建構類型則是更符合開發人員需求的屬性。事實上,您並不直接設定建構變化版本,而是設定一組變種版本和一組建構類型,進而決定建構變化版本。
具體來說,建構變化版本代表各項變種版本和建構類型的組合,並相應地命名為 <product-flavor><build-type>
。舉例來說,如果您的建構類型為 debug
和 release
,而變種版本為 demo
和 full
,則產生的建構變化版本為:
demoDebug
demoRelease
fullDebug
fullRelease
我們來為 DiceRoller 應用程式設定變種版本和建構類型。
4. 設定變種版本
變種版本是更符合使用者需求的應用程式屬性,因為這類版本通常代表可供使用者使用的應用程式版本。要建立應用程式的「demo」和「full」版,您必須新增兩個變種版本,並將其指派至一個「版本維度」。如要新增變種版本,請開啟應用程式層級的 build.gradle
檔案 (位於「Project」檢視畫面中的「app」>「build.gradle」),然後將這段程式碼貼到 android {}
區塊。
flavorDimensions "app_type"
productFlavors {
demo {
dimension "app_type"
}
full {
dimension "app_type"
}
}
這段程式碼將執行以下動作:
- 建立名為
app_type
的版本維度。 - 建立兩個以
demo {}
和full {}
區塊代表的變種版本。 - 將兩個變種版本指派至
app_type
維度 (如果只有一個版本維度,此項為可選操作)。
這是定義變種版本所需的基本程式碼。稍後,您會在這個程式碼實驗室中使用一些其他選項。
5. 設定建構類型
建構類型是更符合開發人員需求的屬性,這類屬性通常代表開發階段 (例如偵錯、Beta 版和發布)。Android Studio 會自動為您設定兩種建構類型:debug
和 release
。debug
建構類型用於偵錯,release
建構類型用於發布。
您可以透過編輯應用程式層級 build.gradle
檔案中的 buildTypes {}
區塊,來建立建構類型並修改其設定。預設的 buildTypes {}
區塊如下所示:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
您可以看到 release
建構類型的預設設定 (我們在本程式碼實驗室中並未涵蓋 minifyEnabled
或 proguardFiles
屬性)。根據預設,debug
建構類型不會顯示在版本設定檔中,但您可以新增 debug {}
區塊,用來新增或變更某些設定。預設設定可滿足我們的需求,因此可以保持不變。
6. 使用「Build Variants」工具視窗
現在您有了兩個變種版本和兩種建構類型,接下來我們就看看它們能產生哪些建構變化版本。如要在 Android Studio 中查看新的建構變化版本,請按照下列步驟操作:
- 在工具列中,點擊「Sync Project with Gradle Files」圖示
。每當您變更建構設定檔時,Studio 都會提示您同步檔案,以便儲存新的建構設定,並檢查是否有建構錯誤。
- 點擊「Build」>「Build Variant」(或依序前往「View」>「Tool Windows」>「Build Variants」),系統會顯示「Build Variants」視窗。
- 在「Active Build Variant」欄位中點擊「demoDebug」,開啟包含您所有建構變化版本的選單:「demoDebug」、「demoRelease」、「fullDebug」和「fullRelease」。使用此選單選取要執行及測試的各種建構變化版本。
執行 demoDebug
和 fullDebug
變化版本 (以 release
建構類型為基礎的變化版本需要執行更多設定,我們不會在本程式碼實驗室中介紹)。到目前為止,從使用者的角度來看,demoDebug
和 fullDebug
變化版本是無法區分的。
7. 為不同變化版本建立不同功能
現在您有了「demo」和「full」版應用程式,我們接下來為「full」版應用程式新增一些功能。
使用來源集新增付費功能
對於 full
變種版本,我們將新增一個方塊,用來顯示擲骰子的結果,這樣使用者就不用只靠骰子的圖片來判斷擲出的結果。如要新增這項付費功能,請使用「來源集」。來源集是一個目錄,包含特定建構類型、變種版本和建構變化版本的內容。預設的 main
來源集 (「app」>「src」>「main」) 中具有要在所有建構變化版本之間共用的內容。其他來源集中的內容可能會覆寫這個預設內容。
如何覆寫 main
來源集中的內容,並確定您需要新增哪些來源集,取決於您要變更的內容。
如要變更資源,例如版面配置或圖片 (位於「main」>「res」),請按照以下一般步驟操作:
- 為您要變更的變種版本建立來源集或目錄 (我們會在下一節說明來源集的建立位置和建立方式)。
- 將您要變更的資源檔案貼到這個新的來源集中,然後進行更新。當 Android Gradle 外掛程式 (AGP) 根據新的來源集建立了建構變化版本時,新來源集中的來源程式碼會覆寫
main
中的來源程式碼。
如要覆寫 Java 或 Kotlin 類別中的行為 (位於「main」>「java」),請按照下列一般步驟操作:
- 為您要變更的變種版本「以及所有位於相同版本維度中的其他變種版本」建立來源集或目錄。
- 將您要變更的檔案貼到所有變種版本來源集中,然後修改您要變更的複本。
- 從
main
來源集中刪除原始檔案。
如要在應用程式「full」版中加入動態方塊,建議您將付費功能視為兩個主要的編輯項目:
- 自訂版面配置:修改
activity_main.xml
檔案來新增方塊。 - 自訂應用程式行為:修改
MainActivity.kt
檔案,讓方塊根據擲骰子的結果變更顯示內容。
在下一節中,您將瞭解建立來源集的位置和方式。
決定建立新來源集的位置
Android Gradle 外掛程式 (AGP) 會展示如何為各個建構類型、變種版本和建構變化版本組織檔案。如要在 full
變種版本中新增付費功能 (包括對 MainActivity.kt
檔案進行的變更),請一併為 full
和 demo
變種版本建立來源集。如要瞭解這些來源集的建立位置,請在 Android Studio 中按照下列步驟操作:
- 點擊 IDE 視窗中的「Gradle」。
- 依序前往「MyApplication」>「Tasks」>「android」,然後按兩下「sourceSets」。如果沒看到「Tasks」資料夾,請依序點擊「File」>「Settings」>「Experimental」並且取消勾選「Do not build Gradle task list during Gradle sync」,讓 Gradle 在同步處理期間建立工作清單 (如果是 Mac 作業系統,請依序前往「Android Studio」>「Preferences」>「Experimental」)。Gradle 執行工作後,「Run」視窗應隨即顯示輸出內容。
- 如果顯示畫面不是如下所示的文字模式,請點擊「Run」視窗中的「Toggle view」
。
在「Run」視窗中,您應該會看到以下輸出內容:
------------------------------------------------------------
Project ':app'
------------------------------------------------------------
...
debug
-----
Compile configuration: debugCompile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Kotlin sources: [app/src/debug/kotlin, app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]
...
full
----
Compile configuration: fullCompile
build.gradle name: android.sourceSets.full
Java sources: [app/src/full/java]
Kotlin sources: [app/src/full/kotlin, app/src/full/java]
Manifest file: app/src/full/AndroidManifest.xml
Android resources: [app/src/full/res]
Assets: [app/src/full/assets]
AIDL sources: [app/src/full/aidl]
RenderScript sources: [app/src/full/rs]
JNI sources: [app/src/full/jni]
JNI libraries: [app/src/full/jniLibs]
Java-style resources: [app/src/full/resources]
「debug」下的檔案路徑清單說明了在預設情況下,AGP 會在哪裡尋找「debug」變種版本的應用程式程式碼和資源。同樣,「full」下的檔案路徑清單說明了在預設情況下,AGP 會在哪裡尋找「full」變種版本的內容。
記下「Java sources」(例如 Java 和 Kotlin 類別的檔案) 以及「Android resources」(例如版面配置和圖片檔案) 的檔案路徑。現在您已經知道建立新來源集的位置,可以建立這些來源集,並為付費功能新增程式碼了。
自訂「full」版的版面配置
如要在「full」版應用程式中新增方塊,請按照下列步驟操作:
首先,建立 full
來源集和 Java 資源目錄:
- 開啟「Project」窗格,然後選取「Project」檢視畫面。
- 前往
DiceRoller/app/src/
目錄。 - 在
src
目錄上按一下滑鼠右鍵,然後依序選取「New」>「Directory」。 - 從「Gradle Source Sets」下方的選單中選取「full/resources」,然後按
Enter
鍵。
接下來,將 activity_main.xml
檔案從 main
來源集貼到 full
來源集。
- 前往
DiceRoller/app/src/main/res/
- 在
activity_main.xml
檔案上按一下滑鼠右鍵,然後點擊「Copy」。 - 前往
DiceRoller/app/src/full/res/
- 在
res
目錄上按一下滑鼠右鍵,然後點擊「Paste」。
接下來,如要為應用程式的 full
變種版本新增方塊,請在 full
來源集的 activity_main.xml
檔案中加入以下程式碼:
<TextView
android:id="@+id/resultTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="Result"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/imageView" />
執行應用程式的 fullDebug
和 demoDebug
建構變化版本 (在「Build Variants」工具視窗中選取要執行的建構變化版本,然後點擊「Run」)。您應該只會看到 fullDebug
變化版本的新方塊。不過,目前這個方塊還無法執行任何操作,因此我們要進行程式設計,讓方塊內容根據擲骰子的結果變更。
自訂「full」版的行為
如果是「full」版應用程式,方塊應該要用文字顯示擲骰子的結果。如要對這個行為進行程式設計,請按照下列步驟操作:
首先,建立 full
來源集 Java 來源目錄。
- 在「Project」檢視畫面的「Project」窗格中,前往
DiceRoller/app/src/full
目錄。 - 在
full
目錄上按一下滑鼠右鍵,然後依序選取「New」>「Directory」。 - 在「Gradle Source Sets」選單中,選取「java」,然後按
Enter
鍵。
接著,建立 debug
來源集和 Java 來源目錄。
- 在「Project」檢視畫面的「Project」窗格中,前往
DiceRoller/app/src
目錄。 - 在
src
目錄上按一下滑鼠右鍵,然後依序選取「New」>「Directory」。 - 在「Gradle Source Sets」選單中,點選「debug/java」,然後按
Enter
鍵。
接下來,前往 DiceRoller/app/src/main/java
目錄。
- 將
MainActivity.kt
檔案貼到full/java
和debug/java
目錄中。 - 從主要來源集中刪除
java
目錄 (包括MainActivity.kt
檔案)。(在java
目錄上按一下滑鼠右鍵,然後點擊「Delete」。) - 在「full」來源集
MainActivity.kt
檔案中,將下列程式碼新增至rollDice()
方法:
// Update the result text view
val resultTextView: TextView = findViewById(R.id.resultTextView)
resultTextView.text = when (diceRoll) {
1 -> "One"
2 -> "Two"
3 -> "Three"
4 -> "Four"
5 -> "Five"
else -> "Six"
}
再次執行 fullDebug
和 demoDebug
建構變化版本。「full」版中的方塊應該會包含擲骰子的結果。
變更應用程式名稱
為求明確,我們要在應用程式名稱中指定您目前使用的應用程式版本。事實上,這類變更無需來源集即可完成。應用程式名稱由 AndroidManifest.xml
檔案中的 label
屬性定義 (「app」>「manifests」>「AndroidManifest.xml」)。如要讓 label
值根據執行中的變化版本進行變更,請開啟 AndroidManifest.xml
檔案,並將標籤行變更為:
android:label="${appLabel}"
這個程式碼會指派 appLabel
變化版本做為應用程式名稱。
接著,如要設定 appLabel
的值或變更「demo」版應用程式的名稱,請將 manifestPlaceholders
行新增至您先前建立的 demo {}
區塊:
demo {
dimension "version"
manifestPlaceholders = [appLabel: "Dice Roller - Demo"]
applicationIdSuffix ".demo"
}
同樣,如要變更應用程式 full
變種版本的名稱,請將另一行 manifestPlaceholders
新增至 full {}
區塊:
full {
dimension "version"
manifestPlaceholders = [appLabel: "Dice Roller - Full"]
applicationIdSuffix ".full"
}
接著,再次執行 demoDebug
和 fullDebug
變化版本。現在不同的建構變化版本應該會顯示不同的名稱。
8. 為建構變化版本指定專屬應用程式 ID
當您建立應用程式的 APK 或 AAB 時,建構工具會使用應用程式 ID 標記應用程式,這個 ID 是由應用程式層級 build.gradle
檔案中的 defaultConfig {}
區塊所定義 (如下所示)。不過,如果想建立「demo」或「full」版等不同版本的應用程式,在 Google Play 商店中以獨立商店資訊顯示各版本,就必須為每個版本提供不同的應用程式 ID。您可以重新定義 productFlavors {}
區塊中各變種版本的 applicationId
屬性,也可以使用 applicationIdSuffix
,在預設的應用程式 ID 後方附加片段,如下所示:
defaultConfig {
applicationId "com.example.diceroller"
...
}
flavorDimensions "version"
productFlavors {
demo {
dimension "version"
manifestPlaceholders = [appLabel: "Dice Roller - Demo"]
applicationIdSuffix ".demo"
}
full {
dimension "version"
manifestPlaceholders = [appLabel: "Dice Roller - Full"]
applicationIdSuffix ".full"
}
}