这几日研究了下二次打包,最后的时候需要对apk进行签名替换,二次签名,然后才能重新安装。第一次接触,感觉有点杂,所以写篇文章捋一下过程,方便理解。关于二次打包的实践,可参考:http://www.jianshu.com/p/6bcc42542997
话不多说,直接看我们二次签名的整体流程步骤,本次实践还是以二次打包时的某应用为例:
一、前提准备
- 1.首先到应用市场下载某应用的官方apk文件到电脑
- 2.使用JDK自带的apktool工具生成自己的签名文件demo.keystore
keytool -genkey -alias androidauto.keystore -keyalg RSA -validity 20000 -keystore android.keystore
二、具体实践步骤
-
1.将下载的某应用的apk文件格式进行修改为.zip后缀,并进行解压,查看目录,将其中的META-INF目录删除。解释:META-INF目录中xx.RSA,xx.SF和MANIFEST.MF三个文件,这三个文件中存放的就是一些关于签名的信息。
- 2.后退工作目录,将修改过后的解压目录重新进行压缩生成新的.zip包文件,然后修改后缀名为.apk文件。
- 3.使用之前生成好的demo.keystore文件对新的zip包进行签名,具体如下:
jarsigner -keystore demo.keystore -storepass password -signedjar demo.apk demo_signed.apk demo.keystore
有一个问题,如果是使用的jdk1.7版本的话,中间签名过程可能会因报一个警告而失败,警告信息如下:
当初楼主遇到该问题时还小曲折了一下,将英文警告信息进行google,只说时jdk1.7版本会有警告,具体如何解决没找到。最后是翻译了之后在csdn上找到的解决方案,链接:http://blog.csdn.net/changcsw/article/details/45643607
修改后的命令如下:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore demo.keystore -storepass password -signedjar demo.apk demo_signed.apk demo.keystore
使用如上命令警告信息问题解决。然后不出意外,签名就能成功,生成经过自己二次签名的新签名包。
- 4.接下来就是安装验证。正确的验证方式是先确保相同包名的应用已卸载,然后再安装,最后安装官方签名的发现签名冲突,安装失败,达到验证效果。即:
//先卸载原来安装的包
adb uninstall packageName
//安装使用自己签名文件签名的包
adb install packageName
//最后安装官方签名包 安装失败 验证成功
三、安装验证的过程可能会出现的问题
- 1.INSTALL_FAILED_INVALID_APK 出现这个错误多半是签名包没有签名成功;回去仔细检查下签名过程。
- 2.INSTALL_FAILED_UPDATE_INCOMPATIBLE 出现这个问题很可能是系统中同包名的应用还没有卸载所导致的。当处我测试实践的时候,我自己手动删除/data/data目录下的包,/data/local/tmp下的包删掉,修改了packages.xml文件。安装还是报这个错误。最后还是先试用了adb uninstall 命令进行卸载,然后重新安装才成功。
我在测试验证的时候就遇到了这两个问题,如果有其他问题,欢迎大家继续补充提出,一起讨论学习进步。