目录
[8、Android build.gradle.kts过滤配置的演进与优化](#8、Android build.gradle.kts过滤配置的演进与优化)
[现代趋势:专注于 64 位架构](#现代趋势:专注于 64 位架构)
[为什么 Flutter 默认只包含 arm64-v8a 和 armeabi-v7a](#为什么 Flutter 默认只包含 arm64-v8a 和 armeabi-v7a)
[为什么只使用 arm64-v8a](#为什么只使用 arm64-v8a)
1、参考文档
|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| API文档 | 链接 |
| Build and release an Android app官网地址 | Android | Flutter |
| Flutter快速上手,入门教程 | Flutter快速上手,入门教程_flutter教程-CSDN博客 |
2、简易打包
默认是debug,如果需要打release包时,TODO: Add your own signing config for the release build.

3、生成应用程序签名
在 macOS 或者 Linux 系统上,执行下面的命令
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
在 Windows 系统上,执行下面的命令:
keytool -genkey -v -keystore D:/key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
如果报错 ,java的jdk环境变量可能配置的有问题,keytool命令前面加上jdk环境变量的路径试试,注意空格需要用反引号

输入flutter doctor -v
,查看java的jdk的安装路径

新的命令:
/Applications/Android\ Studio.app/Contents/jre/Contents/Home/bin/keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

4、项目中引用秘钥库
创建一个名为/android/key.properties 的文件,内如如下:
storePassword=<password-from-previous-step>
keyPassword=<password-from-previous-step>
keyAlias=upload
storeFile=<keystore-file-location>

注意:这个文件一般不要提交到代码仓库
5、在build.gradle中配置签名
通过编辑 /android/app/build.gradle
文件来为我们的 app 配置签名,在android{...}这一行前面,加入如下代码
import java.util.Properties
import java.io.FileInputStream
plugins {
...
}
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
...
}
android {
// ...
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
storePassword = keystoreProperties["storePassword"] as String
}
}
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.getByName("debug")
signingConfig = signingConfigs.getByName("release")
}
}
...
}

全部代码展示:
// 在文件顶部添加这些导入语句
import java.io.FileInputStream
import java.util.Properties
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
namespace = "com.flutter.test"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.wyze.skystream"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
ndk {
abiFilters += listOf("arm64-v8a") // 只包含 64 位 ARM 架构
// 如果需要支持更多架构,可以添加多个过滤器
// abiFilters 'arm64-v8a', 'armeabi-v7a' // 同时支持 64 位和 32 位 ARM
}
}
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
storePassword = keystoreProperties["storePassword"] as String
}
}
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.getByName("debug")
signingConfig = signingConfigs.getByName("release")
}
}
}
flutter {
source = "../.."
}
// 正确的 Kotlin 语法
dependencies {
// 其他依赖...
implementation("androidx.core:core-splashscreen:1.0.1")
}
6、打包应用程序
打包APK
# 运行 flutter build apk (flutter build 默认带有 --release 参数)
flutter build apk
打包AAB
# 运行 flutter build appbundle。 (运行 flutter build 默认构建一个发布版本。)
flutter build appbundle
7、测试安装包
直接把该包复制后发到手机,安装即可
adb命令:
1.安装apk到手机上 adb install 路径/apk文件
2.卸载app从手机上 adb uninstall 包名
3.查看应用的启动时间 adb shell am start -W
flutter devices 查看设备

然后,你会发现这安装包咋这么大,重点来了,仔细看下面介绍...
8、Android build.gradle.kts过滤配置的演进与优化
Android 打包中的 ABI (Application Binary Interface) 过滤配置是一个重要的性能和兼容性权衡点。我来解释为什么会有这些变化以及为什么现代应用倾向于只支持 64 位架构。
历史背景
早期 Android 设备主要使用 32 位处理器,因此默认配置通常包含以下 ABI:
-
armeabi-v7a
(32 位 ARM) -
x86
(32 位 x86) -
arm64-v8a
(64 位 ARM) -
x86_64
(64 位 x86)
现代趋势:专注于 64 位架构
这种配置确保应用能在尽可能多的设备上运行,但会显著增加 APK 大小。
现代趋势:专注于 64 位架构
近年来,Google 一直在推动 Android 生态系统向 64 位迁移:
-
Google Play 要求:从 2021 年 8 月起,Google Play 要求所有新应用必须包含 64 位版本
-
设备市场份额:64 位设备已经占据了绝大多数市场份额,特别是在高端设备中
-
性能优势:64 位架构提供更好的性能和内存管理
-
应用体积优化:移除 32 位支持可以显著减小 APK 大小
为什么 Flutter 默认只包含 arm64-v8a
和 armeabi-v7a
从 Flutter 3.3 开始,默认的 ABI 配置变为:
abiFilters += listOf("arm64-v8a", "armeabi-v7a")
这是因为:
-
x86 设备市场份额极低:x86 设备(主要是模拟器和少数低端设备)的市场份额已经非常小
-
兼容性与体积的平衡 :保留
armeabi-v7a
是为了支持仍在使用的少量 32 位设备,同时提供 64 位版本以满足 Google Play 要求 -
App Bundle 支持:Flutter 推荐使用 App Bundle (AAB) 格式,它会根据用户设备自动提供正确的 ABI 版本,进一步优化下载大小
为什么只使用 arm64-v8a
如果你只配置:
abiFilters += listOf("arm64-v8a")
这意味着:
-
最小化应用体积:只支持 64 位 ARM 设备,应用体积最小
-
高端设备优先:专注于性能更好的现代设备
-
简化维护:减少需要测试的设备组合
-
放弃 32 位兼容性:你的应用将无法在任何 32 位设备上运行
代码展示:
// 修复:使用双引号而非单引号
ndk {
abiFilters += listOf("arm64-v8a") // 只包含 64 位 ARM 架构
// 或者更简洁的写法
// abiFilters.add("arm64-v8a")
// 如果需要支持更多架构
// abiFilters += listOf("arm64-v8a", "armeabi-v7a")
}
