一、重签名:
步骤:
1、直接运行re-sign.jar进行签名
注意事项:
(1)官网直接搜就行:
(2)对Android 4.4.2(API19)的好像签名有问题,从表象看能够签名成功,去程序里run as android junit test的时候就会提示类似这样的Error:
Test run failed: Permission Denial: starting instrumentation ComponentInfo{com.filemanager.test/com.zutubi.android.junitreport.JUnitReportTestRunner} from pid=6072, uid=6072 not allowed because package com.filemanager.test does not have a signature matching the target com.estrongs.android.pop ——针对这个问题,就只能通过命令行来签名了,下面的2中会讲到
对Anroid 4.2(API17)和Android 4.3(API18)可以成功签名,以官方提供的例子(notepad.apk)为例,它本身的例子是有源码的,我们重签名apk,按照没有源码的例子来讲解。
好,接下来直接双击运行re-sign.jar,出现了以下提示:(第一种可能出现的问题)
原因是:运行re-sign.jar需要配置ANDROID_HOME的环境变量,应该是程序写死的需要从这个环境变量找到文件目录,然后调用其下面的zipalign.exe程序
解决方案:
配置环境即可:直接我的电脑右键-系统属性-高级属性设置-环境变量-新建环境变量名称:ANDROID_HOME,value是:“D:\Program Files\adt-bundle-windows-x86-20130717\sdk”(这是我的sdk路径,个人安装路径不同,需要请自寻)
之后重新双击re-sign.jar,就不会再出现上面的提示,然后将apk直接拖放到re-sign.jar的运行界面上,会出现一个提示,提示保存生成的重签名后的文件
直接点击保存即可。。。
这里的重签名用的其实也是debug_keystore的这个签名,所以签名带了一个debug,这是猜的哈。。。。
然后re-sign.jar会弹窗提示重签名后的apk文件的包名和MainActivity:
2、命令行签名
用aapt badging 命令查看重签名后的PackageName和MainActivity
原理:robotium为什么需要对程序重签名?
(1)什么是签名?安卓程序为什么要签名
签名就是为了标志自己,为自己的程序打上标记,让别人看到签名的时候知道这个是跟你有关的(不管是程序,还是其他的签名都是如此的作用)
安卓程序签名是Android系统要求,Android系统要求每一个应用程序必须要经过数字签名才能安装到应用系统中,如果不进行数字签名,是没有办法安装到应用系统中的!Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,Android由应用程序的作者完成,并不需要权威认证,只是用来让应用程序包自我认证的。
(2)如何进行签名?(debug模式和release模式)
debug模式:调试模式下,程序不用专门签名,就能够在手机和模拟器上运行,ADT会自动的使用debug密钥为应用程序签名(debug密钥全称:dedug.keystore,具体位置:C:\Documents and Settings\xxx\.android\debug.keystore)
自己使用不同的PC机生成的debug.keystore,发现根本不同,所以如果更换了机器,就会导致签名不同,因此下面会说到,robotium的这个程序,如果testapk是在其他机子上做了修改的,必须重新对原来的待测程序进行重签名,否则就会出现签名不匹配的问题
(具体例见:在A机器上对notepad进行签名作为待测程序,在B机器上编写testcase,直接在eclipse中Run as Android Junit Test,就会出现crash的问题,还是提示签名不匹配?,但还是需要验证一下!!!)
release模式的签名包含两种方式:
1)Eclipse+ADT方式
这个是最简单且常用的方式,步骤如下:
A: Project -> 取消Build Automatically
B: Project -> Clean
C: Project -> Build
D: 右击项目->android tools->Export signed Application package
第一次运行可以使用 Create new keystore,以后签名就可以使用 User existing keystore。按照说明一步步操作即可,很容易就能打包签名成功。
注意:请妥善保管生成的签名文件,不要丢失,以保证应用发布可重复使用,以免不能进行应用的无缝持续升级。2)命令行方式:详见(转载文章:【转载】关于签名——Android应用程序签名详解 http://www.cnblogs.com/keke-xiaoxiami/articles/4299619.html)
(3)被测程序为什么要进行重签名?
签名的好处:
(1)有利于程序升级。
当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
(2)有利于程序的模块化设计和开发。
Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。
Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享该功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。