apk签名详细原理及jarsigner版本问题

1.首先了解你的keystore是啥。

keytool -list -v -keystore /Users/mac/.android/debug.keystore 

别名: androiddebugkey
创建日期: 2013-11-30
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Android Debug, O=Android, C=US
发布者: CN=Android Debug, O=Android, C=US
序列号: 565bb50d
有效期开始日期: Mon Nov 30 10:31:41 CST 2013, 截止日期: Wed Nov 22 10:31:41 CST 2099
证书指纹:
     MD5: A4:4A:9F:CA:5B:F9:BB:4C:04:5B:B7:FF:35:70:F3:13
     SHA1: 80:E5:B2:E4:DC:16:AB:B8:79:70:59:CD:0F:ED:F3:3B:CB:66:CA:6A
     SHA256: 0A:8W:64:74:69:0A:D7:R4:C6:72:86:67:35:9D:DC:BA:D2:CB:45:D7:04:E0:81:7F:70:A3:0C:CF:E4:93:B2:BF
     签名算法名称: SHA1withRSA
     版本: 3

这个是自动生成的debug签名keystore,对apk进行签名后,其中的指纹信息会包含进apk中,每个apk对应一套信息。

2.在手机上更新apk,应用检验等多种情况会使用到这些指纹信息。

PackageManager pm = getContext().getPackageManager();
PackageInfo packageInfo = pm.getPackageInfo("com.xxx.xxx", 64);
Signature[] signatures = packageInfo.signatures;
byte[] bytes = signatures[0].toByteArray();
String md5 = MD5(bytes);

获得的md5串就等于上面的MD5的值,为a44a9fcaxxxxxxxx.....

3.签名过程中命令需要写的完整,否则使用jdk6和jdk7会造成结果有些许差别。

jarsigner -keystore debug.keystore -storepass 123456 -signedjar output.apk -digestalg SHA1 -sigalg MD5withRSA input.apk myalias

上面是完整命令。我之前在使用jdk7时没有指定digest和sign算法,造成apk无法安装。

嗯,命令很长,推荐写个sh脚本调用。注意,工具都要在 PATH 中能找到啊。

apksigner.sh :

#!/bin/bash
if [ $# != 2 ] 
  then
  echo "usages:" $0 "inputFile" "outputFile"
  exit 1
fi

jarsigner -keystore /to/your/path/debug.keystore -storepass 123456 -signedjar $2 -digestalg SHA1 -sigalg MD5withRSA $1 myalias

加入PATH后,随意调用:

apksigner.sh input.apk output.apk

完美!

最后,不要忘了zipalign一下

zipalign -v 4 infile.apk outfile.apk

转载于:https://my.oschina.net/asay/blog/676803

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值