在典型的開發週期中,您將使用flutter run
命令行、Android Studio、VS Code中經過工具欄運行和調試按鈕進行測試。默認狀況下,Flutter構建應用程序的debug版本。html
當您準備好爲Android準備的release版時,例如要發佈到應用商店,請按照此頁面上的步驟操做。android
查看默認應用程序清單文件(位於<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
:
當一個新的Flutter應用程序被建立時,它有一個默認的啓動器圖標。要自定義此圖標:app
<app dir>/android/app/src/main/res/
目錄中,將圖標文件放入使用配置限定符命名的文件夾中。默認mipmap-
文件夾演示正確的命名約定。AndroidManifest.xml
中,將application
標記的android:icon
屬性更新爲引用上一步中的圖標(例如 <application android:icon="@mipmap/ic_launcher" ...
)。若是您有現有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的一部分安裝的。有關具體路徑,請百度。
建立一個名爲<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/
開始的相對路徑,所以爲了防止沒必要要的錯誤建議使用絕對路徑經過編輯<app dir>/android/app/build.gradle
文件爲您的應用配置簽名
替換:
android {
複製代碼
爲:
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
複製代碼
替換:
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
的libflutter
的so文件
致使在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
配置中將 minifyEnabled
和 useProguard
設爲 true
,再將混淆文件指向上一步建立的文件。
android {
...
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
複製代碼
本節介紹如何構建發佈版(release)APK。若是您完成了前一節中的簽名步驟,則會對APK進行簽名。
使用命令行:
cd <app dir>
(<app dir>
爲您的工程目錄).flutter build apk
(flutter build
默認會包含 --release
選項).打包好的發佈APK位於<app dir>/build/app/outputs/apk/app-release.apk
。
按照如下步驟在已鏈接的Android設備上安裝上一步中構建的APK
使用命令行:
cd <app dir>
.flutter install
.