在典型的开发周期中,您将使用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
.