在 Flutter 中打包 Android APK 并使用自定义签名,可以通过以下步骤实现:
- 使用 keytool 生成签名证书,placement certificate
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
这会生成 my-release-key.keystore 和 my-key-alias。
- 将 my-release-key.keystore 文件放到 android/app/ 目录下。
- 编辑 android/app/build.gradle,添加 signingConfigs:
android {
...
signingConfigs {
release {
keyAlias 'my-key-alias'
keyPassword '***'
storeFile file('my-release-key.keystore')
storePassword '***'
}
}
buildTypes {
...
release {
signingConfig signingConfigs.release
}
}
}
填入 keystore 的密码。
- 最后使用 flutter build apk --release 进行签名打包。
这样 Flutter 打包出的 APK 将使用我们自定义的签名和证书了。
每次打包都需要提供相同的签名,否则会提示签名不匹配。
自定义签名可以避免 DEBUG 证书的限制,并可用于发布到应用商店。
Flutter在构建和签名Release版本的Android APK时,默认是使用的jarsigner工具,而不是apksigner。
在Android Studio/Gradle构建系统中,负责对APK进行签名的任务是SignApk,执行过程大致如下:
- 通过Zip任务生成未签名的APK文件
- 调用jarsigner命令对APK进行签名,生成签名后的APK
- 调用zipalign对签名后的APK进行对齐优化
所以实际签名工具是jarsigner。
而apksigner是Android新推出的签名工具,需要Gradle插件3.0+和Android SDK Build-tools 28+才支持。
Flutter目前还没有迁移到使用apksigner,所以生成的APK默认是用jarsigner签名的。
如果要使用新版apksigner,需要在app/build.gradle里配置:
android {
...
signingConfigs {
release {
storeFile file('mykey.jks')
storePassword '***'
keyAlias 'myalias'
keyPassword '***'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
bundle {
...
signing {
useApkSigner true
}
}
}
并更新Gradle插件和build-tools版本。
那么Flutter就会用apksigner对APK进行v2签名。