Robotium Robotium 专题 (一):Robotium 测试---正确地为安装包重新签名

风吹麦浪 · 2014年12月02日 · 最后由 恒温 回复于 2016年09月08日 · 4888 次阅读
本帖已被设为精华帖!

各位同学,今天专门开辟个 Robotium 的专题,主要是我自己在学习和研究 Robotium 过程中遇到的一些问题以及解决方法,有些资料的内容是来源于网络的,但都是为了更好地学习和工作,所以,请大家给点鼓励!
最近一直在看有关 Robotium 对安卓 APP 进行自动化测试的内容,结合网上所说的 APK 重新签名的问题,现将个人的实际操作汇总如下:

1、去除签名

将 apk 文件后缀改为.zip,然后从 winrar 中删除 META-INF 文件夹,删除后重新将文件名改成 apk 的后缀,这样就去除签名了。

2、JDK 为 1.6,

手动去除签名后然后用下面的命令进行签名:
注意下面的部分内容需要根据自己的 debug.keystore 的位置,和待签名 apk 的位置进行设置

jarsigner -keystore D:\Android\avd.android\debug.keystore -storepass android -keypass android D:\Android\apk\02-AndroidCalculator-unsign.apk androiddebugkey
zipalign 4 D:\Android\apk\02-AndroidCalculator-unsign.apk D:\Android\apk\02-AndroidCalculator-sign.apk
zipalign 能够使 apk 文件中未压缩的数据在 4 个字节边界上对齐(4 个字节是一个性能很好的值)

3、JDK 为 1.7(含 1.7)以上,签名稍有区别,需要加上参数:-digestalg SHA1 -sigalg MD5withRSA

jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore D:\Android\avd.android\debug.keystore -storepass android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey
zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
由于我装的是 JDK1.7 版本,故上述 “ -digestalg SHA1 -sigalg MD5withRSA” 的命令必须加上,这点非常重要,一定要看清楚本机安装的 JDK 版本!

这些是我在做 Robotium 时的一些经验总结,希望对大家能有所帮助!

共收到 26 条回复 时间 点赞

不用删除文件也可以重签名吧?

#1 楼 @seveniruby 可以,用 re-sign.jar 也可以,这是另外的方式。

#2 楼 @bill 也许是我 out 了, 我一直以为 jarsigner 是自动重签的, 没认证研究过。 你试过是必须删除文件才能重签是吗?

#3 楼 @seveniruby 我文章里说的,是删除了签名文件后再用命令进行的重签名,re-sign.jar 的方式,是不需要删除任何文件的,只是在 JDK1.7 的时候会出现不成功的情况,所以我又着重说了 1.7 的情况。呵呵,可能也有遗漏。

#4 楼 @bill re-sign.jar 我用的时候只是帮我去除了签名生成了一个叫-debug 的 apk,然后我还是要用命令重签名的

#5 楼 @chin 这个就可以了,不需要重新签名

没有收藏帖子的功能吗?

#7 楼 @paris_love_u 什么意思?

#6 楼 @bill 我用过 re-sign.jar,光拖进去生成的那个是不行的,必须重新签

#9 楼 @chin 你说的重新签,指的是什么?re-sign.jar 这个签名工具,签名后是 debug 的,如果你需要正式签名的,那肯定需要重新签名。如果只是使用 robotium 测试,那么 debug 这个签名的就可以了!我曾经尝试过很多种签名,所以 re-sign.jar 签名后的 APP 直接装到机器或者虚拟机中即可通过 robotium 进行测试。

resigner.jar 是可以重签名的,只是它默认使用的 key 在 user/.android/debug.keystore,如果这个地址没有这个文件,就只会去签名而已。adt-bundle 的包在某个版本后,它包含的 eclipse 默认的 debug 签名位置变成了 bundle 的位置,所以造成了很多人使用 resigner.jar 不成功。

#12 楼 @bill 期待你的系列文章!

#13 楼 @shixue33 谢谢!我也是在学习当中,大家互相学习,互相进步!

#11 楼 @shixue33 原来是这样!点赞!

我尝试过我们公司自己的 apk 包,改成 zip 文件后删除签名文件,然后重新签名安装后会有问题,其实在 linux 环境下可以用 aapt 命令删除 apk 文件中的内容,然后添加进去进行重新签名,不知道有人尝试过吗

17楼 已删除

@bill ,楼主你好,麻烦问下,我这边按你提供的方式改签名的时候为什么提示 “只能指定一个别名” 呢,谢谢

19楼 已删除
20楼 已删除

#3 楼 @seveniruby 麻烦问下,我按照步骤来,总是提示 “只能指定一个别名”,这个是什么意思呢。另外 使用 re-sign.ja 这个工具重新签名的效果和楼主提供的方法,效果一样吗?为什么我用 re-sign.jar 重新签名后的 apk 无法安装到手机,只能装到模拟器上呢,谢谢

#11 楼 @shixue33 又救我一命...不了解的真不知道那个位置没签名的话就签不了。

#9 楼 @chin 正解,re-sign.jar 只能去掉之前的签名,如果不重新签名在真机或者模拟器上就安装不上,报错 INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION

如果是 linux 系统,命令要怎么写呢?

#4 楼 @bill 我用 re-sign.jar 签名后提示成功,但实际上没有生成 debug.apk 安装包,很奇怪。。。

#24 楼 @jinmincn
linux 下的签名实现,我自己调试的时候一直用的,在实际运行环境下,是需要对我们的测试程序采用被测程序的签名,否则容易出现微博等之类的无法登陆,如下请参考:
#!/bin/sh
echo "开始删除产品中已有的签名文件:META_INF 文件"

appName=basename $1 .apk
packageName=basename $1
TMPDIR=KM_Android_Resign

cp $1 /tmp && cd /tmp
unzip -o ${packageName} -d ${TMPDIR}
cd ${TMPDIR}
rm -rf META-INF
zip -r ${TMPDIR}.apk *
mv ${TMPDIR}.apk ../
cd ..
rm -rf ${TMPDIR}
echo "删除签名完成"
#keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 20000

echo "开始对文件进行重新签名"
jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -signedjar ${appName}_signed.apk ${TMPDIR}.apk androiddebugkey

echo "签名成功,开始优化安装包"
zipalign -v 4 ${appName}_signed.apk ${appName}-resigned.apk
echo "优化完成,尝试清理手机中的测试程序和 K 米安装包"
adb uninstall com.evideo.MobileKTV.test
adb uninstall com.evideo.MobileKTV
echo "清理完成,开始安装重新签名的安装包"
adb wait-for-device install -r ${appName}-resigned.apk
echo "安装成功,开始清理临时文件"
rm -rf ${appName}-resigned.apk
rm -rf ${appName}_unsigned.apk
rm -rf ${appName}_signed.apk
rm -rf ${TMPDIR}.apk
echo "清理完成欢迎使用,哇咔咔"

#24 楼 @jinmincn
这里提供 windows 自动签名脚本:记得添加:winrar 的环境变量
REM @ECHO OFF

REM ②重新签名下载的 K 米 APP
winrar d KM_Android.apk META-INF

REM 使用 JARSIGNER 命令对 apk 文件使用统一的 key 进行重签名操作
REM 第一步:生成 keystore
REM keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 20000

REM 第二步:jarsigner 签名 apk
jarsigner -verbose -keystore ./debug.keystore -storepass android -signedjar KM_Android_signed.apk KM_Android.apk androiddebugkey

REM ③zipalign 命令对重签名后的文件进行优化
zipalign -v 4 KM_Android_signed.apk KM_Android_signed_zipalign.apk

REM ④卸载安装 K 米 APP
echo "开始安装最新的 K 米 APP"
adb uninstall com.evideo.MobileKTV
adb wait-for-device install -r ./KM_Android_signed_zipalign.apk

echo "最新安装包部署完成"

REM 清理环境
del KM_Android.apk
del KM_Android_signed.apk
del KM_Android_signed_zipalign.apk

PAUSE
REM @ECHO ON

#26 楼 @aizaimenghuangu 首先谢谢你,说得这么详细,其次,抱歉好多天了才看到你的回复,嘿嘿。上周把签名的问题搞定了,基本上跟你讲的差不多,但是第三步 zipalign -v 4 ${appName}_signed.apk ${appName}-resigned.apk 一直没走通,zipalign 这个命令总是出错,有些网友说这一步只是优化,所以我想不做这一步也行吧,所以拿着签名但未优化的 APK 的在 robotium 里做测试,目前一切正常。不过,还是担忧没有第三步,后期会不会出现啥问题,嘿嘿,如你知道,帮忙解答,谢谢啦!

#28 楼 @jinmincn 执行 zipalign 出现什么错误?

恒温 [该话题已被删除] 中提及了此贴 09月08日 18:41
恒温 《Robotium 专题》 合集 中提及了此贴 12月02日 18:24
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册