flutter release版編譯

ChenQuan發表於2019-05-18

在典型的開發週期中,您將使用flutter run命令列、Android Studio、VS Code中通過工具欄執行和除錯按鈕進行測試。預設情況下,Flutter構建應用程式的debug版本。

當您準備好為Android準備的release版時,例如要釋出到應用商店,請按照此頁面上的步驟操作。

檢查AppManifest

檢視預設應用程式清單檔案(位於<app dir>/android/app/src/main/中的AndroidManifest.xml檔案),並驗證這些值是否正確,特別是:

  • application: 編輯 application 標籤, 這是應用的名稱。
  • uses-permission: 如果您的應用程式程式碼不需要Internet訪問,請刪除android.permission.INTERNET許可權。標準模板包含此標記是為了啟用Flutter工具和正在執行的應用程式之間的通訊。

注意<app dir>為你的工程目錄。

檢視構建配置

檢視預設[Gradle 構建檔案][gradlebuild]”build.gradle”,它位於<app dir>/android/app/,驗證這些值是否正確,尤其是:

  • defaultConfig:
    • applicationId: 指定始終唯一的 (Application Id)appid
    • versionCode & versionName: 指定應用程式版本號和版本號字串。有關詳細資訊,請參考版本文件
    • minSdkVersion & targetSdkVersion: 指定最低的API級別以及應用程式設計執行的API級別。有關詳細資訊,請參閱版本文件中的API級別部分。

新增啟動圖示

當一個新的Flutter應用程式被建立時,它有一個預設的啟動器圖示。要自定義此圖示:

  1. 檢視Android啟動圖示 設計指南,然後建立圖示。
  2. <app dir>/android/app/src/main/res/目錄中,將圖示檔案放入使用配置限定符命名的資料夾中。預設mipmap-資料夾演示正確的命名約定。
  3. AndroidManifest.xml中,將application標記的android:icon屬性更新為引用上一步中的圖示(例如 <application android:icon="@mipmap/ic_launcher" ...)。
  4. 要驗證圖示是否已被替換,請執行您的應用程式並檢查應用圖示

app簽名

建立 keystore

如果您有現有keystore,請跳至下一步。如果沒有,請通過在執行以下命令來建立一個:

Linux/Unix:

$ keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
複製程式碼

其中 ~/key.jks 為生成keystore的儲存路徑

Win:

> C:
> cd C:\\Users\\ZERO //ZERO為當前使用者的使用者名稱
> keytool -genkey -v -keystore C:\\Users\\ZERO\\key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
複製程式碼

同樣其中 C:\\Users\\ZERO\\key.jks 為生成keystore的儲存路徑

注意:保持檔案私密; 不要將它加入到公共原始碼控制中。

注意: keytool可能不在你的系統路徑中。它是Java JDK的一部分,它是作為Android Studio的一部分安裝的。有關具體路徑,請百度。

引用應用程式中的keystore

建立一個名為<app dir>/android/key.properties的檔案,其中包含對金鑰庫的引用:

storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, e.g. /Users/<user name>/key.jks> # key.jks檔案的儲存路徑
複製程式碼

注意:

  • 保持檔案私密;
  • 不要將它加入公共原始碼控制中;
  • storeFile中的路徑是以<app dir>/android/app/開始的相對路徑,因此為了防止不必要的錯誤建議使用絕對路徑

在gradle中配置簽名

通過編輯<app dir>/android/app/build.gradle檔案為您的應用配置簽名

  1. 替換:

    android {
    複製程式碼

    為:

    def keystorePropertiesFile = rootProject.file("key.properties")
    def keystoreProperties = new Properties()
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
    android {
    複製程式碼
  2. 替換:

    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 file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            
            signingConfig signingConfigs.release
            
            ndk{ // 必須加入這部分,否則可能導致編譯成功的release包在真機中會閃退
                 abiFilters "armeabi-v7a"
             }
        }
        
        debug {
             ndk {
                 //這裡要加上,否則debug包會出問題,後面三個為可選,x86建議加上不然部分模擬器回報錯
                 abiFilters "armeabi", "armeabi-v7a", "arm64-v8a",  "x86"
             }
         }
    }
    複製程式碼

    現在,您的應用的release版本將自動進行簽名。

    $ flutter build apk
    Initializing gradle...                                              3.9s
    Resolving dependencies...                                          56.0s
    Running Gradle task 'assembleRelease'...
    Running Gradle task 'assembleRelease'... Done                     118.7s
    Built build\app\outputs\apk\release\app-release.apk (7.4MB).
    複製程式碼

注意

release包在真機中閃退可能是因為打包時沒有引入arm64的libflutterso檔案導致在arm64架構手機上出現“相容”問題。主要是引用so庫的問題arm64cpu架構是可以像下相容的,簡單點就是arm64架構的cpu可以使用arm32的.so檔案。出現問題真正原因是我們在引用so庫時(引用的三方庫中引用了so庫)。

開啟混淆

預設情況下 flutter 不會開啟 Android 的混淆。

如果使用了第三方 Java 或 Android 庫,也許你想減小 apk 檔案的大小或者防止程式碼被逆向破解。

配置混淆

建立 /android/app/proguard-rules.pro 檔案,並新增以下規則:

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
複製程式碼

上述配置只混淆了 Flutter 引擎庫,任何其他庫(比如 Firebase)需要新增與之對應的規則。

開啟混淆/壓縮

開啟 /android/app/build.gradle 檔案,定位到 buildTypes 塊。

release 配置中將 minifyEnableduseProguard 設為 true,再將混淆檔案指向上一步建立的檔案。

android {

    ...

    buildTypes {

        release {

            signingConfig signingConfigs.release

            minifyEnabled true
            useProguard true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}
複製程式碼

構建一個釋出版(release)APK

本節介紹如何構建釋出版(release)APK。如果您完成了前一節中的簽名步驟,則會對APK進行簽名。

使用命令列:

  1. cd <app dir> (<app dir> 為您的工程目錄).
  2. 執行flutter build apk (flutter build 預設會包含 --release選項).

打包好的釋出APK位於<app dir>/build/app/outputs/apk/app-release.apk

在裝置上安裝發行版APK

按照以下步驟在已連線的Android裝置上安裝上一步中構建的APK

使用命令列:

  1. 用USB您的Android裝置連線到您的電腦
  2. cd <app dir> .
  3. 執行 flutter install .

相關文章