1. 工具介绍
jarsigner 是JDK提供的针对jar包签名的通用工具,
位于 JDK/bin/jarsigner
apksigner 是Google官方提供的针对Android apk 签名验证的专用工具
位于 Android SDK/build-tools/SDK version/apksigner.bat
在Android Studio 中点击菜单 Build -> Generate signed apk … 可以打包签名
不管是apk 包,还是jar 包,本质都是zip 格式的压缩包,所以他们的签名过程都差不多(仅限V1签名),
以上两个工具都可以对Android apk 包进行签名
2.1 V1 和V2签名的区别
V1 签名是 jar signature
- 来自JDK (jarsigner), 对zip 压缩包的每一个文件进行验证, 签名后还能对压缩包进行修改(移动/重新压缩文件)
- 对 V1 签名的apk/jar 解压,在meta-INF 存放签名的文件(MANIFEST.MF, CERT.SF, CERT.RSA)
- 其中 MANIFEST.MF 文件保存所有文件的SHA1 指纹(除了META-INF文件), 由此可知, V1 签名是对压缩包中单个文件签名验证
V2 签名是 Full apk signature
来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),
对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证
V2签名优点很明显:
签名更安全(不能修改压缩包)
签名验证时间更短(不需要解压验证),因而安装速度加快
从Android 7.0 开始,谷歌增加了新的签名发方式 V2 signature (APK signature )
但 Android 7.0 以下的版本,只能用旧的签名方案, V1 scheme (JAR signature)
2.2 zipalign和V2签名
位于Android SDK/build-tools/SDK版本/zipalign.exe
zipalign 是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗
zipalign -v 4 in.apk out.apk //4字节对齐优化
zipalign -c -v 4 in.apk //检查APK是否对齐
zipalign可以在V1签名后执行
但zipalign不能在V2签名后执行,只能在V2签名之前执行
3. 签名步骤
1. 生成密钥对
如果已经有密钥库了,这一个步骤是可以忽略的.
我们可以用同一个密钥库对一堆app 进行签名,为什么呢,这个想想也很简单,假设我开发了一堆APP, 我肯定是用同一个密钥对它们进行加密的呀.
Eclipse或Android Studio在Debug时,对App签名都会使用一个默认的密钥库