Robotium 《Robotium 专栏》------(一) Android 应用程序签名步骤

candice · 2017年10月09日 · 最后由 @zsmjluo 回复于 2017年10月10日 · 3643 次阅读

最近在学习有关 Robotium 对安卓 APP 进行自动化测试的内容,现将遇到的问题和重点进行归纳和总结,大家一起学习!有问题欢迎指出。

Robotium 进行自动化有两种模式可以选择,一个是基于源码,一个是基于 Apk。基于 Apk 测试的话,需要对被测程序进行重签名。

所以首先学习下 Android 应用程序的签名

1)准备工作
apk 的签名工作可以通过两种方式来完成:
1)通过 ADT 提供的图形化界面完成 apk 签名;
2)完全通过 DOS 命令来完成 apk 签名
我比较喜欢第 2)种方式,所以下面将讲解如何通过命令的方式完成 apk 签名。
给 apk 签名一共要用到 3 个工具,或者说 3 个命令,分别是:keytool、jarsigner 和 zipalign,下面是对这 3 个工具的简单介绍:
1)keytool:生成数字证书,即密钥,也就是上面说到的扩展名为.keystore 的那类文件;
2)jarsigner:使用数字证书给 apk 文件签名;
3)zipalign:对签名后的 apk 进行优化,提高与 Android 系统交互的效率 (Android SDK1.6 版本开始包含此工具)
从这 3 个工具的作用也可以看出,这 3 个工具的使用顺序。通常我们自己所开发的所有应用程序,都是使用同样的签名,即使用同一个数字证书,这就意味着:如果你是第一次做 Android 应用程序签名,上面的 3 个工具都将用到;但如果你已经有数字证书了,以后再给其它 apk 签名时,只需要用到 jarsigner 和 zipalign 就可以完成。
为了方便使用上面 3 个命令,首先需要将上面 3 个工具所在路径添加到环境变量 path 中(我说的是为了方便使用,没有说必须要这么做)。怎么配置环境变量就不在此讲解了,这里需要说一下这 3 个工具默认所在的路径:
1)keytool:该工具位于 jdk 安装路径的 bin 目录下;
2)jarsigner:该工具位于 jdk 安装路径的 bin 目录下;
3)zipalign:该工具位于 android-sdk-windows/tools/目录下
不知道大家是否注意到 keytool 和 jarsigner 两个工具是 jdk 自带的,也就意味着生成数字证书和文件签名不是 Android 的专利;另外从字面上理解 jarsigner 也能猜得出该工具主要是用来给 jar 文件签名的。
2)生成未经签名的 apk 文件
既然我们要自己对 apk 进行签名,就不再需要 ADT 默认帮我们签名了。如何得到一个未经签名的 apk 文件呢?打开 Eclipse,在 Android 工程名称上点击右键,依次选择 “Android Tools” - “Export Unsigned Application Package ...”,然后选择一个存储位置保存即可。这样就得到了一个未经签名的 apk 文件。
3)使用 keytool 工具生成数字证书
keytool -genkey -v -keystore candice.keystore -alias candice.keystore -keyalg RSA -validity 20000
说明:
1)keytool 是工具名称,-genkey 意味着执行的是生成数字证书操作,-v 表示将生成证书的详细信息打印出来,显示在 dos 窗口中;
2)-keystore candice.keystore 表示生成的数字证书的文件名为 “candice.keystore”;
3)-alias candice.keystore 表示证书的别名为 “candice.keystore”,当然可以不和上面的文件名一样;
4)-keyalg RSA 表示生成密钥文件所采用的算法为 RSA;
5)-validity 20000 表示该数字证书的有效期为 20000 天,意味着 20000 天之后该证书将失效
在执行上面的命令生成数字证书文件时,会提示你输入一些信息,包括证书的密码,示例如下:

  • 注意记录秘要库密码和密钥口令
  • 这里生成的密钥文件在当前目录

4)使用 jarsigner 工具为 Android 应用程序签名------使用手机百度 apk 测试
jarsigner -verbose -keystore candice.keystore -signedjar shoujibaidu_signed.apk shoujibaidu.apk candice.keystore
说明:
1)jarsigner 是工具名称,-verbose 表示将签名过程中的详细信息打印出来,显示在 dos 窗口中;
2)-keystore candice.keystore 表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;
3)-signedjar shoujibaidu_signed.apk shoujibaidu.apk 表示给 shoujibaidu.apk 文件签名,签名后的文件名称为 shoujibaidu_signed.apk;
4)最后面的 candice.keystore 表示证书的别名,对应于生成数字证书时-alias 参数后面的名称
JDK 版本不同,可能需要的参数不同,可以查看 jarsigner 命令帮助

5)使用 zipalign 工具优化已签名的 apk(非必须但建议这么做)
zipalign -v 4 shoujibaidu_signed.apk shoujibaidu_signed_aligned.apk
说明:
1)zipalign 是工具名称,-v 表示在 DOS 窗口打印出详细的优化信息;
2)shoujibaidu_signed.apk shoujibaidu_signed_aligned.apk 表示对已签名文件 shoujibaidu_signed.apk 进行优化,优化后的文件名为 shoujibaidu_signed_aligned.apk

说明:如果你以前的程序是采用默认签名的方式(即 debug 签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。因为程序覆盖安装主要检查两点:

1)两个程序的入口 Activity 是否相同。两个程序如果包名不一样,即使其它所有代码完全一样,也不会被视为同一个程序的不同版本;
2)两个程序所采用的签名是否相同。如果两个程序所采用的签名不同,即使包名相同,也不会被视为同一个程序的不同版本,不能覆盖安装。
另外,可能有人可能会认为反正 debug 签名的应用程序也能安装使用,那也没有必要自己签名了嘛。千万不要这样想,debug 签名的应用程序有这样两个限制,或者说风险:
1)debug 签名的应用程序不能在 Android Market 上架销售,它会强制你使用自己的签名;
2)debug.keystore 在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行 apk 版本升级,那么将会出现上面那种程序不能覆盖安装的问题。不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大问题了,就相当于软件不具备升级功能!

*什么是应用签名? *
详细介绍:http://www.cnblogs.com/keke-xiaoxiami/articles/4299619.html

共收到 2 条回复 时间 点赞

不错的文章,

—— 来自 TesterHome 官方 安卓客户端

robotium 真的够经典,非常好用。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册