建置和發布 Android 應用程式

在典型的開發週期中,您會使用命令列中的 flutter run 測試應用程式,或使用 IDE 中的執行偵錯選項。預設情況下,Flutter 會建置應用程式的偵錯版本。

當您準備好要準備應用程式的發行版本時,例如要發佈到 Google Play 商店,此頁面可以提供協助。在發佈之前,您可能想要為應用程式進行一些最後的潤飾。此頁面涵蓋以下主題

新增啟動器圖示

當建立新的 Flutter 應用程式時,它有一個預設的啟動器圖示。若要自訂此圖示,您可能想要查看 flutter_launcher_icons 套件。

或者,您可以使用下列步驟手動執行

  1. 檢閱 Material Design 產品圖示 指南以取得圖示設計的說明。

  2. [project]/android/app/src/main/res/ 目錄中,將您的圖示檔案放置在使用 組態限定詞 命名之資料夾中。預設的 mipmap- 資料夾示範了正確的命名慣例。

  3. AndroidManifest.xml 中,更新 application 標籤的 android:icon 屬性,以參照前一步驟的圖示(例如,<application android:icon="@mipmap/ic_launcher" ...)。

  4. 若要驗證圖示是否已取代,請執行您的應用程式並檢查啟動器中的應用程式圖示。

啟用 Material Components

如果您的應用程式使用 平台檢視,您可能想按照 Android 入門指南 中所述的步驟啟用 Material Components。

例如

  1. <my-app>/android/app/build.gradle 中加入 Android Material 的相依性
dependencies {
    // ...
    implementation 'com.google.android.material:material:<version>'
    // ...
}

如需找出最新版本,請參閱 Google Maven

  1. <my-app>/android/app/src/main/res/values/styles.xml 中設定淺色主題
-<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+<style name="NormalTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
  1. <my-app>/android/app/src/main/res/values-night/styles.xml 中設定深色主題
-<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
+<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">

簽署應用程式

要在 Play 商店上發布,您需要使用數位憑證簽署您的應用程式。

Android 使用兩個簽署金鑰:上傳應用程式簽署

  • 開發人員會上傳一個使用 上傳金鑰 簽署的 .aab.apk 檔案到 Play 商店。
  • 最終使用者會下載一個使用 應用程式簽署金鑰 簽署的 .apk 檔案。

如需建立您的應用程式簽署金鑰,請按照 官方 Play 商店文件 中所述使用 Play 應用程式簽署。

如需簽署您的應用程式,請使用下列說明。

建立上傳金鑰儲存區

如果您有現有的金鑰儲存區,請跳到下一步。如果沒有,請使用下列其中一種方法建立一個

  1. 遵循 Android Studio 金鑰產生步驟
  2. 在命令列中執行下列命令

    在 macOS 或 Linux 上,使用下列命令

    keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
            -keysize 2048 -validity 10000 -alias upload
    

    在 Windows 上,在 PowerShell 中使用下列命令

    keytool -genkey -v -keystore %userprofile%\upload-keystore.jks ^
            -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 ^
            -alias upload
    

    此命令會將 upload-keystore.jks 檔案儲存在您的主目錄中。如果您想要儲存在其他位置,請變更傳遞給 -keystore 參數的引數。不過,請將 keystore 檔案設為私人;不要將其提交至公開的原始碼控管!

從應用程式參照 keystore

建立一個名為 [project]/android/key.properties 的檔案,其中包含對您的 keystore 的參照。不要包含尖括號 (< >)。它們表示文字用於作為您值的佔位符。

storePassword=<password-from-previous-step>
keyPassword=<password-from-previous-step>
keyAlias=upload
storeFile=<keystore-file-location>

storeFile 可能位於 macOS 上的 /Users/<user name>/upload-keystore.jks 或 Windows 上的 C:\\Users\\<user name>\\upload-keystore.jks

在 gradle 中設定簽署

透過編輯 [project]/android/app/build.gradle 檔案,設定 gradle 在發行模式下建置應用程式時使用上傳金鑰。

  1. android 區塊之前,加入屬性檔案中的金鑰儲存資訊

       def keystoreProperties = new Properties()
       def keystorePropertiesFile = rootProject.file('key.properties')
       if (keystorePropertiesFile.exists()) {
           keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
       }
    
       android {
             ...
       }
    

    key.properties 檔案載入 keystoreProperties 物件。

  2. 找到 buildTypes 區塊

       buildTypes {
           release {
               // TODO: Add your own signing config for the release build.
               // Signing with the debug keys for now,
               // so `flutter run --release` works.
               signingConfig signingConfigs.debug
           }
       }
    

    並用下列簽署設定資訊取代它

       signingConfigs {
           release {
               keyAlias keystoreProperties['keyAlias']
               keyPassword keystoreProperties['keyPassword']
               storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
               storePassword keystoreProperties['storePassword']
           }
       }
       buildTypes {
           release {
               signingConfig signingConfigs.release
           }
       }
    

現在,應用程式的發行建置將自動簽署。

如需有關簽署應用程式的更多資訊,請查看 developer.android.com 上的 簽署您的應用程式

使用 R8 縮減程式碼

R8 是 Google 推出的新程式碼縮減器,在建置發行 APK 或 AAB 時預設啟用。若要停用 R8,請將 --no-shrink 旗標傳遞給 flutter build apkflutter build appbundle

啟用 multidex 支援

撰寫大型應用程式或使用大型外掛程式時,當目標最低 API 為 20 或以下時,您可能會遇到 Android 的 64k 方法 dex 限制。在使用未啟用縮減的 flutter run 執行應用程式的偵錯版本時,也可能會遇到此問題。

Flutter 工具支援輕鬆啟用 multidex。最簡單的方法是在提示時選擇加入 multidex 支援。此工具會偵測 multidex 建置錯誤,並在對您的 Android 專案進行變更之前詢問。選擇加入後,Flutter 便能自動依賴 androidx.multidex:multidex,並使用產生的 FlutterMultiDexApplication 作為專案的應用程式。

當您嘗試在 IDE 中使用執行偵錯選項建置並執行您的應用程式時,您的建置可能會失敗,並顯示以下訊息

screenshot of build failure because Multidex support is required

若要從命令列啟用 multidex,請執行 flutter run --debug 並選擇 Android 裝置

screenshot of selecting an Android device

在提示時,請輸入 y。Flutter 工具會啟用 multidex 支援並重新嘗試建置

screenshot of a successful build after adding multidex

您也可以選擇手動支援 multidex,方法是遵循 Android 指南並修改專案的 Android 目錄組態。必須指定 multidex 保留檔案 以包含

io/flutter/embedding/engine/loader/FlutterLoader.class
io/flutter/util/PathUtils.class

此外,請包含應用程式啟動中使用的任何其他類別。如需有關手動新增多重 dex 支援的更詳細指南,請查看官方 Android 文件

檢閱應用程式清單

檢閱預設 應用程式清單 檔案,AndroidManifest.xml。此檔案位於 [project]/android/app/src/main。驗證下列值

應用程式
編輯 application 標籤中的 android:label 以反映應用程式的最終名稱。
使用權限
如果您的應用程式程式碼需要網路存取,請新增 android.permission.INTERNET 權限。標準範本不包含此標籤,但允許在開發期間存取網路,以啟用 Flutter 工具與正在執行的應用程式之間的通訊。

檢閱 Gradle 建置設定

檢閱預設 Gradle 建置檔案 (build.gradle,位於 [project]/android/app),以驗證值是否正確。

defaultConfig 區塊下

應用程式 ID
指定最終、唯一的 應用程式 ID
minSdkVersion
指定您設計應用程式執行的 最低 API 層級。預設為 flutter.minSdkVersion
targetSdkVersion
指定您設計應用程式執行的目標 API 層級。預設為 flutter.targetSdkVersion
versionCode
用作內部版本號碼的正整數。此號碼僅用於判斷一個版本是否比另一個版本新,數字越大表示版本較新。此版本不會顯示給使用者。
versionName
用作顯示給使用者的版本號碼的字串。此設定可以指定為原始字串或字串資源的參照。
buildToolsVersion
Gradle 外掛會指定專案使用的建置工具的預設版本。您可以使用此選項指定不同版本的建置工具。

android 區塊下方

compileSdkVersion
指定 Gradle 應使用來編譯應用程式的 API 等級。預設為 flutter.compileSdkVersion

如需更多資訊,請查看 Gradle 建置檔案中的模組層級建置區段。

建置應用程式以供發布

發布到 Play 商店時,您有兩種可能的發布格式。

  • 應用程式組合 (建議)
  • APK

建置應用程式組合

此區段說明如何建置發布應用程式組合。如果您已完成簽署步驟,則會簽署應用程式組合。此時,您可能會考慮 混淆您的 Dart 程式碼,以讓反向工程更困難。混淆您的程式碼包括在您的建置指令中加入幾個旗標,並維護額外的檔案以還原堆疊追蹤的混淆。

從命令列

  1. 輸入 cd [project]
  2. 執行 flutter build appbundle
    (執行 flutter build 預設為發布版本組建。)

應用程式的發布版本組建建立在 [project]/build/app/outputs/bundle/release/app.aab

預設情況下,應用程式組建包含您的 Dart 程式碼和針對 armeabi-v7a (ARM 32 位元)、arm64-v8a (ARM 64 位元) 和 x86-64 (x86 64 位元) 編譯的 Flutter 執行時期。

測試應用程式組建

應用程式組建可以使用多種方式進行測試。本節說明兩種方式。

使用組建工具離線

  1. 如果您尚未下載,請從 GitHub 儲存庫 下載 bundletool
  2. 從應用程式組建產生一組 APK
  3. 將 APK 部署到已連接的裝置。

使用 Google Play 線上

  1. 將您的組建上傳到 Google Play 以進行測試。您可以在發布之前使用內部測試軌跡、alpha 或 beta 頻道來測試組建。
  2. 按照 這些步驟將您的組建上傳 到 Play 商店。

組建 APK

儘管應用程式組建比 APK 更受青睞,但仍有一些商店不支援應用程式組建。在這種情況下,請為每個目標 ABI (應用程式二進位介面) 建立一個發布 APK。

如果您已完成簽署步驟,APK 將會被簽署。在這個時候,您可能會考慮 混淆您的 Dart 程式碼,以增加逆向工程的難度。混淆您的程式碼包括在您的組建指令中新增幾個旗標。

從命令列

  1. 輸入 cd [project]

  2. 執行 flutter build apk --split-per-abi。(flutter build 指令預設為 --release。)

此指令會產生三個 APK 檔案

  • [project]/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
  • [project]/build/app/outputs/apk/release/app-arm64-v8a-release.apk
  • [project]/build/app/outputs/apk/release/app-x86_64-release.apk

移除 --split-per-abi 旗標會產生一個 fat APK,其中包含針對所有目標 ABI 編譯的程式碼。此類 APK 的大小會比分割對應項大,導致使用者下載不適用於其裝置架構的原生二進位檔。

在裝置上安裝 APK

請按照下列步驟在連接的 Android 裝置上安裝 APK。

從命令列

  1. 使用 USB 線將 Android 裝置連接到電腦。
  2. 輸入 cd [project]
  3. 執行 flutter install

發佈到 Google Play 商店

有關將應用程式發佈到 Google Play 商店的詳細說明,請查看 Google Play 發佈文件。

更新應用程式的版本號碼

應用程式的預設版本號碼為 1.0.0。若要更新,請移至 pubspec.yaml 檔案並更新下列行

版本:1.0.0+1

版本號碼為三個以句點分隔的數字,例如上述範例中的 1.0.0,後接一個選用組建號碼,例如上述範例中的 1,並以 + 分隔。

版本和組建號碼都可以在 Flutter 的組建中覆寫,分別指定 --build-name--build-number

在 Android 中,build-name 用作 versionName,而 build-number 用作 versionCode。如需進一步瞭解,請查看 Android 文件中的 為應用程式設定版本

當您為 Android 重新建置應用程式時,pubspec 檔案中的版本號碼的任何更新都會更新 local.properties 檔案中的 versionNameversionCode

Android 發行常見問題

以下是關於 Android 應用程式部署的一些常見問題。

我應該在什麼時候建置應用程式套件相對於 APK?

Google Play 商店建議您部署應用程式套件而不是 APK,因為它們允許更有效率地將應用程式傳遞給您的使用者。但是,如果您透過 Play 商店以外的方式分發應用程式,APK 可能會是您唯一的選項。

什麼是 fat APK?

一個 fat APK 是單一的 APK,其中包含嵌入其中的多個 ABI 的二進位檔。這有以下好處:單一的 APK 可以執行於多個架構,因此具有更廣泛的相容性,但缺點是其檔案大小大得多,導致使用者在安裝應用程式時下載和儲存更多位元組。在建置 APK 而不是應用程式套件時,強烈建議建置分割 APK,如 建置 APK 中所述,使用 --split-per-abi 旗標。

支援的目標架構有哪些?

在發佈模式中建置應用程式時,Flutter 應用程式可以編譯為 armeabi-v7a (ARM 32 位元)、arm64-v8a (ARM 64 位元) 和 x86-64 (x86 64 位元)。Flutter 支援透過 ARM 模擬建置 x86 Android。

如何簽署 flutter build appbundle 建立的應用程式套件?

請參閱 簽署應用程式

如何從 Android Studio 中建置發佈版本?

在 Android Studio 中,開啟應用程式資料夾下的現有 android/ 資料夾。然後,在專案面板中選取 build.gradle (模組:應用程式)

screenshot of gradle build script menu

接著,選取建置變異。在主選單中按一下 建置 > 選取建置變異。在 建置變異 面板中選取任何變異(預設為偵錯)

screenshot of build variant menu

產生的應用程式套件或 APK 檔案位於應用程式資料夾中的 build/app/outputs