目录
- Android 为什么要签名
- keystore的生成:
- keystore信息的查看
- 参数说明:
- Android 怎么签名
- 使用 jarsigner 签名
- 如何查找 jdk 位置
- 签名时遇到的问题
- 查看 apk 是否签名
- 查看 Apk 的MD5值以及MD5不显示时的解决办法
- 缺少 xx.RSA 文件的原因
- V1 vs V2
Android 为什么要签名
在安装 apk 时,需要确保 apk 来源的真实性,以及 apk 没有被第三方篡改。为了解决这一问题,Android官方要求开发者对 apk 进行签名,所谓的签名就是对apk进行加密的过程。
keystore的生成:
在签名之前要生成 keystore 文件来存储密钥
(1)分阶段生成:
keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore 指定路径/yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码)
回车输入相关信息即可;
keytool -genkey -alias test -keypass testmima -keyalg RSA -keysize 1024 -validity 365 -keystore /Users/xxx/Desktop/test.keystore
或者:
keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -validity 365 -storepass 123456
(2)一次性生成:
keytool -genkey -alias test -keypass test -keyalg RSA -keysize 1024 -validity 365 -keystore 指定路径/test.keystore -storepass 123456 -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)"
(中英文即可)
keystore信息的查看
keytool -list -v -keystore test.keystore -storepass 123456
参数说明:
- -genkey 【生成密钥对】
- -alias 【别名】
- -keypass 【私钥旧密码】
- -keyalg 【关键算法】
- -keysize 【密钥长度】
- -validity 【有效时长,以天为单位】
- -keystore 【密钥存储库位置】
- -storepass 【密钥库密码】
- -dname 【指定证书拥有者信息】
一般在公司会在项目中的 keystore 目录下创建一个 key.properties 文件,来记录 keystore 关键信息,里面的内容是:
key.store=keystore/test.keystore
key.store.password=123456
key.alias=test
key.alias.password= testmima
key.sigalg=RSA
Android 怎么签名
通过使用 Java 自带的 keytool 和 jarsigner 工具或 apksigner 工具(android 11)进行签名。
使用 jarsigner 签名
/Library/Java/JavaVirtualMachines/xxx.jdk/Contents/Home/bin
需要进入到 jarsigner 所在的位置,通过以下命令可以对名为 test 的 apk 签名:
jarsigner -verbose -keystore test.keystore【keystore路径】 test.apk 【apk 名称】test【别名】
如何查找 jdk 位置
java -version 可以查看 java 版本
java -verbose 可以查看 jdk 路径,和其他信息
java -verbose
签名时遇到的问题
在android 11的设备上安装时 可能会出现:
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary] 的问题
以上问题的原因:
是关于zip 4字节对齐,请参考zipalign
解决方法:
使用 apksigner 对其签名
假设需要被签名的文件为:source.apk
- 先进入 /Users/xxx/Library/Android/sdk/build-tools/30.0.3 路径中
- 先删除了客户的v1签名,即删除 META-INF目录(META-INF目录下存放的是签名信息,可能报找不到META-INF/* ,不重要)
zip -d source.apk META-INF/*
- 获取4KB对齐apk(source_4.apk 是对齐后的结果文件)
zipalign -v 4 source.apk source_4.apk
- 查看是否结果文件是否对齐 (成功后会报:Verification succesful)
zipalign -c -v 4 source_4.apk
- 然后通过 apksigner 签名,不能在使用 jarsigner 签名
apksigner sign --ks (签名地址) --ks-key-alias (别名) --out (签名后的apk地址) (待签名apk地址)
- 密码库短语是:keystore 的 password (上文的 123456)
查看 apk 是否签名
查看source_4.apk 是否签名,是什么类型的签名
apksigner verify -v source_4.apk
查看 Apk 的MD5值以及MD5不显示时的解决办法
- 将以 .apk 结尾的 APK 文件更换为 .zip 文件
- 解压 zip 文件找到 META-INF/xx.RSA 文件
- 命令查看 MD5 信息
keytool -printcert -file 【xx.RSA文件所在路径】
有的时候 看不到 MD5 值,可以使用命令行:
jadx-gui 目标文件.apk
中的 APK signature 查看MD5 签名、SHA-1 签名、SHA-256 签名信息
例如:
xx.RSA文件是签名文件,它的命名如果不指定名称则自动截取别名中前8个字符
一般上传到市场平台的时候,被提示解析失败,没有签名文件,可能就是缺少了这个文件。
缺少 xx.RSA 文件的原因
缺少 xx.RSA 文件的原因,大概率是因为没有选中 V1 这种签名方式。
V1 vs V2
V2这种签名方案是 Android 7.0引入的,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。具体请看 这里 。 而V1适用于所有android版本的机型,但在Android7.0及以上会缺少针对未授权 APK 文件更改的保护;所以只选V2,Android7.0以下的机型会报错,同时选V1,V2,适用所有机型。
命令行打包默认 V1,V2 是都选中的,如果不放心可以在 build.gradle 里做设置
在 app 的 build.gradle 的 android 标签下加入如下:
signingconfigs {
debug {
v1signingenabled true
v2signingenabled true
}
release {
v1signingenabled true
v2signingenabled true
}
}