Never let success get to your head and never let failure get to your heart.
不要让成功冲昏了头脑,也不要把失败记在心里。
在实际开发过程中,经常遇到会对一个空包APK进行重签名的情况,例如第三方加固平台,或者应用认领等,APK签名众所周知存在V1和V2两种方式的,对apk签名可以使用一下两种方式:
- jarsigner是JDK提供的针对jar包签名的通用工具,只支持V1方式的签名,不推荐。
- apksigner是针对Android apk签名专用工具,在7.0前只有V1方式的签名,而在7.0以上默认是同时进行v1和v2签名(目的是为了向下兼容),推荐
如上面所有APK文件的签名是分v1和v2的区别,jarsigner方式只支持V1签名,apksigner方式支持两种签名方式,那么v1和v2有什么区别呢?
v1与v2区别
APK文件其实是一个ZIP压缩文件,分为三部分,头文件、中央目录、结尾内容,V1签名和V2签名主要区别如下。
- V1签名只会检验第一部分的所有压缩文件,而不理会后两部分内容缺少对APK的完整性校验,V2签名是针对整个APK进行校验(不包含签名块本身)。
- V1中的数据摘要是基于原始未压缩文件计算的。因此在校验时,需要先解压出原始文件,这无疑是耗时的,而V2是对APK本身进行数据摘要计算,不存在解压APK的操作。
jarsigner
在签名命令格式:
cd到jdk的bin目录或者直接应用jarsgner完整路径
jarsgner -verbose -keystore [keystorePath] -singnedjar [apkOut] [apkln] [alias]
- keystorePath,签名证书文件路径。
- apkOut,签名后的apk文件路径。
- apkln,需要签名的apk文件路径。
- alias,签名证书的别名。
apksigner
cd Android SDK/build-tools/SDK版本, 输入命令或者直接引用apksigner
apksigner sign --ks [keystorePath] --ks-key-alias [alias] --out [apkOut] [apkln]
- keystorePath,签名证书文件路径。
- apkOut,签名后的apk文件路径。
- apkln,需要签名的apk文件路径。
- alias,签名证书的别名。
我将apksigner签名命令整理成一个signer.sh
shell脚本,简化平时的操作。
#signer命令的路径
signer=$"/Users/xxxx/Library/Android/sdk/build-tools/27.0.3/apksigner"
ks=$1
alias=$2
inApk=$3
outApk=${inApk%.*}$"_signed.apk"
${signer} sign --ks ${ks} --ks-key-alias ${alias} --out ${outApk} ${inApk}
使用signer.sh [keystorePath][alias] [apkln]
网友评论