参考 http://blog.sina.com.cn/s/blog_6abda9bc01015zoc.html
为进行Robotium自动测试需要对apk用本地安卓sdk中的debug.keystore进行重新签名
操作主要用的工具为jarsigner
jarsigner工具位于电脑java sdk安装目录中的bin目录下
例如,在我的mac电脑上是:
/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/bin
下面提到的 /Users/zjq/Documents/temp/Calculator.apk 是我测试使用的demo。
第1步:查看apk签名信息
jarsigner -verify -verbose -certs /Users/zjq/Documents/temp/Calculator.apk
执行结果如下:
s 713 Fri Jun 13 00:08:12 CST 2014 META-INF/MANIFEST.MF X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] 875 Fri Jun 13 00:08:14 CST 2014 META-INF/ANDROIDD.SF 1211 Fri Jun 13 00:08:14 CST 2014 META-INF/ANDROIDD.RSA sm 1856 Thu Jan 27 01:01:34 CST 2011 res/layout/main.xml X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 1456 Thu Jan 27 01:01:34 CST 2011 AndroidManifest.xml X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 1588 Thu Jan 27 01:01:34 CST 2011 resources.arsc X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 3966 Thu Jan 27 01:01:34 CST 2011 res/drawable-hdpi/icon.png X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 1537 Thu Jan 27 01:01:34 CST 2011 res/drawable-ldpi/icon.png X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 2200 Thu Jan 27 01:01:34 CST 2011 res/drawable-mdpi/icon.png X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] sm 3716 Thu Jan 27 01:01:34 CST 2011 classes.dex X.509, CN=Android Debug, O=Android, C=US [证书的有效期为14-1-13 下午2:44至44-1-6 下午2:44] [CertPath 未验证: Path does not chain with any of the trust anchors] s = 已验证签名 m = 在清单中列出条目 k = 在密钥库中至少找到了一个证书 i = 在身份作用域内至少找到了一个证书 jar 已验证。 警告: 此 jar 包含证书链未验证的条目。
说明:这个 apk已经存在签名信息了。
第2步: 删掉apk中的签名信息
将 Calculator.apk 复制1个取名为 Calculator_unsign.apk
然后将 Calculator_unsign.apk 改名为 Calculator_unsign.zip
然后用winrar工具打开Calculator_unsign.zip,找到里面的META-INF目录,把这个META-INF目录删除,然后退出winrar。
将图中的META-INF目录删掉,然后将Calculator_unsign.zip 重新改名为 Calculator_unsign..apk
再次查看 Calculator_unsign.apk的签名信息,执行命令:
jarsigner -verify -verbose -certs /Users/zjq/Documents/temp/Calculator_unsign.apk
执行结果:
jarsigner -verify -verbose -certs /Users/zjq/Documents/temp/Calculator_unsign.apk s = 已验证签名 m = 在清单中列出条目 k = 在密钥库中至少找到了一个证书 i = 在身份作用域内至少找到了一个证书 没有清单。 jar 未签名。(缺少签名或无法对签名进行语法分析)
第3步 对apk包重新签名
执行命令:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore /Users/zjq/.android/debug.keystore -storepass android -keypass android /Users/zjq/Documents/temp/Calculator_unsign.apk androiddebugkey
如果使用的是jdk1.7以下的版本,则命令中不需要加上参数 -digestalg SHA1 -sigalg MD5withRSA
/Users/zjq/.android/debug.keystore 是你电脑上android中的debug.keystore 。
为了方便我们开发调试程序,ADT会自动的使用debug密钥为应用程序签名。debug密钥?它在哪?debug密钥是一个名为debug.keystore的文件,它的位置: Ubuntu: ~/.android/debug.keystore (win7:c:/user/.Android/debug.keystore; xp: C:/Documents and Settings/user/.Android/debug.keystore),“user”对应于你自己的windows操作系统用户名,这也就意味着,如果我们想拥有自己的签名,而不是让ADT帮我们签名的话,我们也要有一个属于自己的密钥文件(*.keystore)
第4步 用zipalign工具修正刚签名的apk包
zipalign工具位置:/Users/zjq/Documents/adt-bundle-mac-x86_64-20131030/sdk/tools
即在你的android sdk的tools目录中。
zipalign能够使apk文件中未压缩的数据在4个字节边界上对齐(4个字节是一个性能很好的值)
执行命令:
./zipalign 4 /Users/zjq/Documents/temp/Calculator_unsign.apk /Users/zjq/Documents/temp/Calculator_sign.apk
到此,新的apk包就生成了
Calculator_sign.apk