flutter release版編譯

在典型的開發週期中,您將使用flutter run命令行、Android Studio、VS Code中經過工具欄運行和調試按鈕進行測試。默認狀況下,Flutter構建應用程序的debug版本。html

當您準備好爲Android準備的release版時,例如要發佈到應用商店,請按照此頁面上的步驟操做。android

檢查AppManifest

查看默認應用程序清單文件(位於<app dir>/android/app/src/main/中的AndroidManifest.xml文件),並驗證這些值是否正確,特別是:shell

  • application: 編輯 application 標籤, 這是應用的名稱。
  • uses-permission: 若是您的應用程序代碼不須要Internet訪問,請刪除android.permission.INTERNET權限。標準模板包含此標記是爲了啓用Flutter工具和正在運行的應用程序之間的通訊。

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

查看構建配置

查看默認[Gradle 構建文件][gradlebuild]」build.gradle」,它位於<app dir>/android/app/,驗證這些值是否正確,尤爲是:架構

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

添加啓動圖標

當一個新的Flutter應用程序被建立時,它有一個默認的啓動器圖標。要自定義此圖標:app

  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,請跳至下一步。若是沒有,請經過在運行如下命令來建立一個:ide

Linux/Unix:工具

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

其中 ~/key.jks 爲生成keystore的存儲路徑測試

Win:gradle

> 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 .
相關文章
相關標籤/搜索