v1与v2区别
-
Android7.0开始,google添加新签名方案
v2 Scheme(APK Signatur)
, 而Android7.0
以下,则使用旧方案v1 Scheme(JAR Signing)
-
v1签名: jarsigner, 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), V1签名是对压缩包中单个文件签名验证。
-
v2签名:apksigner, 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign), 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, V2签名是对整个APK签名验证。
-
apksigner工具默认同时使用v1和v2签名,兼容android7.0以前版本。
签名工具
-
jarsigner
:JAR 签名和校验工具,位于位于jdk/bin/jarsigner.exe
-
apksigne
: 对Android apk签名及验证的专用工具, 位于Android\sdk\build-tools\28.0.3\apksigner.bat
ZipAlign优化
zipalign是一个归档对齐工具,确保所有未压缩的数据都以相对于文件开始的特定对齐方式开始, 减少了运行应用程序时消耗的RAM数量。
- 如果使用apksigner对APK文件签名,则在签名前使用zipalign进行归档对齐优化,否则签名无效。
- 如果使用jarsigner对APK文件签名,则只能在APK签名之后进行归档优化。
zipalign用法:
- 归档对齐优化:
zipalign [-f] [-v] 4 infile.apk outfile.apk
- 确认对齐:
zipalign -c -v 4 existing.apk
- 参数:
-
-f
: overwrite existing outfile.zip -
-v
: verbose output -
-p
: outfile.zip should use the same page alignment for all shared object files within infile.zip -
-c
: confirm the alignment of the given file
-
对APK进行手动签名
-
创建密钥:
$ keytool -genkeypair -v -keystore <filename>.keystore -alias <key-name> -keyalg RSA -keysize 2048 -validity 30000
-
若要列出密钥存储中存储的密钥:
$ keytool -list -keystore <filename>.keystore
-
使用Zipalign优化APK
$ zipalign -f -v 4 sample_unsigned.apk sample_zipalign.apk
-
对APK进行签名(apksigner)
$ apksigner sgin -ks <filename>.keystore --ks-key-alias <key-name> --ks-pass pass:<password> --key-pass pass:<password> --out sample_signed.apk sample_zipalign.apk
-
查看签名信息
$ apksigner verify -v --print-certs sample_signed.apk
-
使用美团Walle多渠道打包
$ java -jar walle-cli-all.jar batch -c yingyongbao,baidu,qh360 sample_signed.apk
-
查看apk信息
$ aapt dump badging sample_signed.apk
网友评论