Flutter 打包 android端 apk
本次所记录的打包流程全部都是在Android Studio上完成,建议不要直接参考官方文档的打包流程,不然很大几率会出错
android studio终端生成签名文件
keytool -genkey -v -keystore <存放的路径>/文件名字.jks -keyalg RSA -keysize 2048 -validity 有效时间 -alias 别名
例:keytool -genkey -v -keystore D:/flutterPackageSignature/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign
- genkey : 产生密钥
- keystore :
- <存放的路径>/key.jks :证书的存放路径和名字
- keyalg RSA -keysize 2048 :使用 2048 位 RSA 算法对签名加密
- validity 10000 :有效期时间,这里是 10000天
- alias sign : 别名 sign
输入正确命令然后回车,即会请求输入密码(密码不要忘记)
此时运行正确的命令不出意外会在D:/flutterPackageSignature中生成一个key.jks文件,注意此文件不要上传分享给别人
项目配置
-
导入签名文件key.jks
在Flutter工程中/android/app目录下创建key文件夹,然后把sign.jks复制进来(注意保存在电脑本地的文件夹中还得有存在key.jks文件)
-
配置/android/app/build.gradle文件
在flutter的/android/app/build.gradle文件中的android前加入; 如果你的signingConfigs里面使用的是绝对路径,则不需要加这个
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
在android里的signingConfigs加入release
signingConfigs {
release {
keyAlias 'sign' //别名
keyPassword '生成签名时输入的密码'
storeFile file('D:/flutterPackageSignature/signfile.jks') //签名文件路径
storePassword '生成签名时输入的密码'
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true //移除未使用的资源
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
}
}
-
创建 key.properties 文件
- storePassword= 刚刚创建密钥库时的密码
- keyPassword= 刚刚创建密钥的密码
- keyAlias=sign(别名)
- storeFile=D:/flutterPackageSignature/key.jks
减小APK包的体积(推荐使用第二种)
一:在主工程的AndroidManifest.xml
配置中,在application
标签,添加android:extractNativeLibs=true
属性
android:extractNativeLibs=true
或者
二:在 android/app/build.gradle
增加对应内容:
对于 Android Gradle Plugin 8 以上,增加 packaging
:
android {
packaging {
dex {
useLegacyPackaging true
}
jniLibs {
useLegacyPackaging true
}
}
}
其他版本增加 packagingOptions
:
android {
packagingOptions {
dex {
useLegacyPackaging true
}
jniLibs {
useLegacyPackaging true
}
}
}
原因:android:extractNativeLibs = true
或者useLegacyPackaging true
时,gradle打包时会对工程中的so库进行压缩,最终生成apk包的体积会减小。但用户在手机端进行apk安装时,系统会对压缩后的so库进行解压,从而造成用户安装apk的时间变长。
生成apk
配置完成后在项目终端输入生成apk命令
flutter build apk --target-platform android-arm --split-per-abi
(apk包)
flutter build apk --target-platform android-arm --split-per-abi --debug
(apk debug包)
或者
flutter build apk
(相对上面那个命令,此命令打包的apk相对大一些)
或者
flutter build appbundle
(aab包)
当出现如图所示即打包成功,Build后为apk存放的路劲
查看生成的签名文件里面的信息
keytool -list -v -keystore key.jks
注:1. key.jks是我本地的文件名,需替换你的文件名才可以
2. 该命令需要在key.jks所在的文件夹里面打开终端运行
生成apk过程遇到的一些坑
BUG1
如图,当出现图中bug时我们就检查项目的/android/gradle.properties文件,看是否存在android.enableR8=true(最好不要加上android.enableR8这行,但有时候默认会生成的,所以我们讲true改成false就可以解决此bug)
BUG2
综上,当我们把true改为false时解决bug1,但是会出现图中的bug2
解决方法:将下图中的old部分换成new部分即可
BUG3
项目中换取使用阿里镜像时buildscript repositories和allprojects repositories都需要更改,不然会出错
啊里镜像
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
BUG 4
BUG 5
问题所在:此类基本上就是Gradle的配置需要改 解决方法:
- 参考BUG3,更换镜像
- 翻墙开全局模式
隔绝密钥方法
为了实现每个人都有一套签名的目标,你可以考虑以下几种方法:
-
Git 忽略敏感信息: 在提交代码之前,你可以在项目的根目录下创建一个名为
.gitignore
的文件,并将包含密码别名的配置文件添加到该文件中。这样,Git 在提交代码时会自动忽略这些文件,确保它们不会被上传到远程仓库中。其他人在克隆项目时将无法看到这些文件。 -
使用本地配置文件: 将密码别名和其他敏感信息存储在本地配置文件中,而不是直接在
build.gradle
文件中配置。可以在项目根目录下创建一个名为local.properties
的文件,并在其中添加类似以下内容的配置:
keystore.password=your_password
key.alias=your_alias
key.password=your_key_password
然后在 build.gradle
文件中引用这些属性,如下所示:
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
// ...
signingConfigs {
release {
storeFile file('your_keystore_file.jks')
storePassword project.properties['keystore.password']
keyAlias project.properties['key.alias']
keyPassword project.properties['key.password']
}
}
// ...
}
这样,你可以将 local.properties
添加到 .gitignore
文件中,确保敏感信息不会被上传到 Git。
- 使用环境变量: 可以在本地设置环境变量来存储密码别名等敏感信息,并在
build.gradle
文件中引用这些环境变量。例如,在 Windows 上,你可以使用以下命令设置环境变量:
setx KEYSTORE_PASSWORD your_password
setx KEY_ALIAS your_alias
setx KEY_PASSWORD your_key_password
然后在 build.gradle
文件中使用这些环境变量:
android {
// ...
signingConfigs {
release {
storeFile file('your_keystore_file.jks')
storePassword System.getenv('KEYSTORE_PASSWORD')
keyAlias System.getenv('KEY_ALIAS')
keyPassword System.getenv('KEY_PASSWORD')
}
}
// ...
}
这样,每个人可以在自己的环境中设置适合自己的环境变量,从而实现每人一套签名的目标。
无论使用哪种方法,请确保在版本控制系统中不存储包含敏感信息的文件,以保护你的应用程序的安全性。
引用参考
Flutter打包apk: wcdxg.com/2020/04/29/…
Flutter打包apk:www.jianshu.com/p/fabcfd621…
Flutter Andorid 真机或打包 APK 杂症记录:xie.infoq.cn/article/e85…
转载自:https://juejin.cn/post/6944000831465193480