Android 7.0 中引入了 APK 签名方案 v2,以更加重要地保护 apk 文件。之后,在 Android 9.0 中引入了 APK Signature Scheme v3,在 Android 11.0 中引入了 APK Signature Scheme v4。
~ 谷歌的签名验证过程 ~
在 APK Signature Scheme v2 之前,签名是基于 Signed JAR 使用 jarsigner,从 v2 开始开始基于 apksigner。
那么,在哪些情况下我们使用 apksigner 进行签名呢?
- 如果在构建应用程序时选择了 Signature Versions v2 选项。(APK 签名方案 v2)
- 如果在构建应用程序时将 targetSdkVersion 设置为高于 30
对于上述情况,必须使用 apksigner 进行签名。使用 jarsigner 签名时,应用程序安装和运行没有大问题,但在 Google Play Console 上上传应用程序时可能会出现错误。
如何检查应用程序的签名方案版本
1.从Android工作室检查
如果在“生成签名包或 APK”中选中“V2(完整 APK 签名)”,则为 V2 版本
~Androidstudio 中的签名版本选择~
2.从命令检查它
java -jar [apksigner.jar 路径] verify -v --print-certs [应用LIAPP之前的Apk路径]
例如)C:>java -jar D:\android\sdk\build-tools\28.0.0\lib\apksigner.jar verify -v --print-certs C:\app-release.apk
如果使用 v2 方案(APK 签名方案 v2)验证为真,则为 V2,为假则为 V1。
zipalign
重要的一点是,如果您使用 apksigner,则只能在 APK 文件签名之前执行 zipalign。如果您使用 apksigner 对 APK 进行签名并对 APK 进行进一步更改,则其签名将失效。因此,zipalign 只能在签署 apk 之前执行。
zipalign -f -v 4 “需要压缩对齐的apk文件路径” “压缩对齐后要保存的apk文件路径”
~windows cmd 中的-zipalign 命令~
使用 apksigner 签名
在完成的 zipalign 文件上使用 apksigner 签名很简单,如下所示。
[视窗]
java -jar [APKSIGNER_PATH] 符号 -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
[ 苹果电脑 ]
[APKSIGNER_PATH] 符号 -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
[APKSIGNER_PATH] 是 apksigner 所在的位置。apksigner 工具,在 Android SDK Build Tools 的 24.0.3 及更高版本中可用,您可以按如下方式检查它。
在Android Studio Tool菜单中检查SDK路径=> SDK Manager => Android SDK Location path check
从SDK目录检查Apksigner文件 SDK目录=> build-tools目录=>buildToolsVersion目录=>lib目录=>检查apksigner.jar文件如果是MAC,从buildToolsVersion目录检查apksigner文件
执行命令后,将出现一条输入密钥库密码的消息。
签名者 #1 的密钥库密码:
键入 keystore 密码时,密码字符不会显示在屏幕上,而是实际输入。输入正确的密钥库密码后,您可以继续下一步。如果密钥库密码和密钥密码相同,则签名将立即进行。如果密钥库密码和密钥密码不同,系统会提示您输入密钥密码。
签名者 #1 的密钥“KEY_NAME”密码:
输入正确的密钥密码后,将继续进行签名并“签名”。签名完成后会显示。
~windows cmd中的apksigner命令~
如果在命令行中使用-ks-pass pass: 和-key-pass:pass 选项,可以预先设置密码和命令。如果使用此选项,则不会显示输入密码的消息,而是自动输入。
[视窗]
java -jar [APKSIGNER_PATH] 符号 -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:“keystore_password” --key-pass pass:“key_password” --ks-key-alias [ALIAS_NAME ] [APP_FILE_PATH]
[ 苹果电脑 ]
[APKSIGNER_PATH] 符号 -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:“keystore_password” --key-pass pass:“key_password” --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH ]