为方便Robotium自动测试需要对apk用本地安卓sdk中的debug.keystore进行重新签名

参考 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。

 
为方便Robotium自动测试需要对apk用本地安卓sdk中的debug.keystore进行重新签名
 将图中的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

相关推荐