此次完整打包流程教的会比较详细点(windows环境),让小白更容易入手,废话不多说,直接上菜!
基础环境准备
首先你先尝试在终端中,输入keytool命令,看看是否有此命令,如果没有会提示,就接着看基础环境配置(如果有此环境的可以跳过此步)
1、找到安装的java1.8的目录文件夹路径,默认flutter是有安装java的,如果没有就自己网上下载安装一下java8(Java 8又称为jdk 1.8)
终端输入以下命令找到flutter内置的java安装目录
1 |
flutter doctor -v |
然后会输入类似以下内容,可以看到java目录位置,稍后会用到,第一步就是找到到安装目录
PS:注意目录到bin即可,最后java结尾是执行文件名而已
2、配置全局环境,在桌面上》我的电脑(右键选择属性)》高级系统设置》环境变量(顶部高级tab切换栏内)》系统变量,找到path变量编辑
添加刚刚的java目录,例如我的目录是
1 2 |
D:\Program Files\Android\Android Studio\jre\bin\ // 目录判定标准,你可以看当前目录内是否有keytool文件 |
配置好后建议重启一下电脑生效一下全局环境变量参数。
3、重启电脑好后,在终端输入keytool,此时应该就有命令可以操作了
tips: keytool工具主要是生成签名文件的工具,所以提前准备好环境。
flutter签名apk配置流程
完成了之前的基础环境配置后,下面正式开始操作apk打包配置签名了。
生成密钥文件
1、生成密钥文件,默认密钥文件没有指定路径的话,就是在当前文件夹下生成的。
在终端输入以下命令按回车
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 创建一个debug.keystore文件密钥,别名为androiddebugkey keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 // 语法介绍 keytool -genkeypair -keystore 密钥库名 -alias 密钥别名 -validity 天数 -keyalg RSA // 参数介绍 -genkeypair 生成一条密钥对(由私钥和公钥组成) -keystore 密钥库名字以及存储位置(默认当前目录) -alias 密钥对的别名(密钥库可以存在多个密钥对,用于区分不同密钥对) -storepass keystore 文件存储密码 -keypass 私钥加解密密码 -keypass 111111 -storepass 111111 \ -validity 密钥对的有效期(单位: 天) -keyalg 生成密钥对的算法(常用RSA/DSA,DSA只用于签名,默认采用DSA) -keysize 密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA) |
然后会要求你输入密码,这密码你要记住,以后使用此密钥文件都是需要密码的。
密码输入完成后,还有其它信息要求你输入,这些你可以完全跳过去,按回车即可(按六下回车),最后会询问你是否正确,按y回车。
2、查看当前密钥的相关信息,比如sha1值等,在终端输入以下命令
1 2 3 4 5 |
keytool -list -v -keystore debug.keystore // 输入后会查看到此密钥的很详细信息 // 语法介绍 keytool -list -v -keystore <密钥文件> |
有了密钥详细信息到时候就可以对比你打包的apk签名是否一致性,以及打包是否正确。
配置flutter项目签名
1、在android目录下新增key.properties文件,并且写入以下信息,里面是创建签名时的密码及另名信息等
1 2 3 4 |
storePassword=111111 # 存储密码 keyPassword=111111 # 密钥密码 keyAlias=androiddebugkey # 密钥别名 storeFile=D:\key\debug.keystore # 密钥路径 |
2、打开android/app/build.gradle文件,此文件名有二处都有,不要找错目录位置了。
找到android {位置,添加如下内容
1 2 3 4 5 6 7 8 9 |
// 添加部份 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } // 找到android{此位置 android { |
然后在android{}里面配置相关打包参数如下。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
android { // 忽略了部份参数,显示关键核心参数 signingConfigs { // release配置完全替换成此,主要是读取key.properties文件内容 release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } // 像此debug模式你可以设置为另外的密钥文件,如果你只是一个密钥的话,可以把debug配置完全注释不去配置 debug { keyAlias "androiddebugkey" keyPassword "111111" storeFile file('../my_debug.keystore') storePassword "111111" } } buildTypes { release { signingConfig signingConfigs.release // 替换成release模式 // 开启混淆/压缩 minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } // 同理,如果你上面配置了debug密钥文件,那么这也配置指定一下,否则建议注释掉 debug { signingConfig signingConfigs.debug } } } |
3、开启混淆/压缩,上面配置中已经加入了混淆功能代码,然后去配置一下混淆规则。
创建android/app/proguard-rules.pro 文件,写入以下内容
1 2 3 4 5 6 7 |
-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.** { *; } -dontwarn io.flutter.embedding.** |
4、执行打包flutter build apk,等待打包文件后开始验证apk签名是否正确
进入打包好的apk文件夹内(在当前文件夹内快速打开终端方法:shift
+ 鼠标右键
,选择在此处打开PowerShell窗口)。
在终端输入以下命令
1 2 |
keytool -printcert -jarfile app-release.apk |
验证你的apk签名,会输出一堆相关签名信息,你可以对比一下MD5,SHA1等信息是否一样,如果一样那么恭喜你打包apk签名完成。
要是输出信息为:未签名jar之类,那么就是apk签名未成功
PS:建议不要手动去修改你的flutter项目的包名,那样会导致你在使用flutter打包命令的时候,不会给你把apk签名带上,或是加密的很混乱,以导致第三方应用商店无法检查到你apk已经签名过。
像修改包名引起签名后第三方应用平台商店不认的情况,你可以尝试新建立一个flutter项目,把文件移入过去在打包签名一次即可。