apk签名

作者: yin_xin | 来源:发表于2018-12-27 22:57 被阅读6次

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.shshell脚本,简化平时的操作。

#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]

相关文章

网友评论

    本文标题:apk签名

    本文链接:https://www.haomeiwen.com/subject/ooljlqtx.html