版本说明:Flutter 2.8.1+ Dart 2.15.1
1.检查 App Manifest
进入项目目录android>app>src>main>AndroidMainfest.xml,该文件可以配置应用名称,描述组件等
注意配置这四个,否则可能没网络
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
详情可以看 https://www.jianshu.com/p/3b5b89d4e154
2.查看构建配置
你需要编辑applicationId,minSdkVersion
等
配置文件位于android>app>build.gradle,下面我摘取了部分配置
android {
// 编译的安卓sdk版本,不是最终打包的版本,当使用的sdk版本与组件版本对照,提示开发者那些功能已经过时
compileSdkVersion flutter.compileSdkVersion // 用于编译的SDK版本
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.huyu.org.flutter_trip2"
minSdkVersion 24 // 应用支持的最小的SDK版本,低于此版本,应用将无法安装
targetSdkVersion 24 // 目标版本,这个是最终打包的版本
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
}
3.添加启动图标
当一个新的Flutter应用程序被创建时,它有一个默认的启动器图标。要自定义此图标:
-
查看Android启动图标 设计指南,然后创建图标。
-
在
<app dir>/android/app/src/main/res/
目录中,将图标文件放入使用配置限定符命名的文件夹中。默认mipmap-
文件夹演示正确的命名约定。 -
在
AndroidManifest.xml
中,将application
标记的android:icon
属性更新为引用上一步中的图标(例如<application android:icon="@mipmap/ic_launcher" ...
)。 -
要验证图标是否已被替换,请运行您的应用程序并检查应用图标
4.app签名
打开cmd,输入
flutter doctor -v
进入下图标红处的路径的bin文件夹下
此文件下有一个keytool.exe文件,此文件将用于生成签名
在此文件夹下打开cmd,运行以下命令
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
输入完成后,将在此文件夹下生成一个key.jws文件。
然后在android文件夹下新建一个文件夹用于存放签名文件,我这里新建了一个key_store文件夹用于存放文件
在android文件夹下,新建一个key.properties文件,内容如下:
storePassword=你输入的口令
keyPassword=你输入的口令
keyAlias=你输入的别名
storeFile=../key_store/flutter_trip_key.jks 存放文件的路径
在buid.gradle文件中配置签名
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystorePropertiesFile = rootProject.file("key.properties")// 新增的配置项
def keystoreProperties = new Properties()// 新增的配置项
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))// 新增的配置项
android {
signingConfigs { // 新增的配置项
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
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
signingConfig signingConfigs.release // 新增的配置项
}
}
5.开启混淆
创建 /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
,再将混淆文件指向上一步创建的文件。
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
完整的配置文件
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// 用于打包的配置
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
compileSdkVersion flutter.compileSdkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.huyu.org.flutter_trip2"
minSdkVersion 24
targetSdkVersion 24
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
// 用于打包
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
debug {
}
}
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
signingConfig signingConfigs.release
minifyEnabled true // 压缩代码,减少体积
useProguard true // 添加混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
//直接是用"armeabi-v7a",此so可以兼容大部分的手机/设备,也是为了减少打包体积
abiFilters "armeabi-v7a"
}
}
// 可以配置debug下的应用
debug {
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
6.打包应用
命令行运行
flutter build apk
打包好的发布APK位于<app dir>/build/app/outputs/apk/app-release.apk
。
当然你如果使用Android Studio,可以直接在工具栏找到build选项
评论列表
已有0条评论