Android 应用签名的问题

之前在http://blog.csdn.net/myvest/article/details/53486701一文中, 简介了android 增加自己的应用签名校验的方法,最近遇到一个问题,就是如何给APK多重签名。

1、重新签名

重新签名是很简单的,如果你的APK本身就有签名,那可以把APK先用rar工具打开,把下面的META-INF文件夹里的东西删掉,再用命令重新签名一次即可。
这种我是没遇到什么问题

2、多重签名

一个应用想要有多个签名,类似这样,如果是一个我们自己编译出来的APK,那就用命令,用不同的key进行多次签名即可,最后会看到确实有多个签名。如果是别人的APK,先像1说的去掉签名,再添加我们2个自己的签名,这两种也都没遇到什么错误。
这里写图片描述

3、添加签名

遇到问题的是在给一个已经有签名的应用,再添加签名,也就是让他同时持有两个签名。有时候能成功,有时候不行。

这里写图片描述

第一个遇到的问题是:原本APK签名的JDK版本和我们签名的JDK版本不同,特别是别人如果是JDK1.6签名,我们使用JDK1.7签名的话,安装时会提示原本的签名有问题。
这个原因是因为JDK1.6和1.7默认的签名算法不一样,一个是SHA1,一个是SHA256,这样签名之后,会使得原来的签名校验值对应不上。
像这样,签名前还要先看下APK原本的签名是什么算法,要用相同的算法来签名自己的签名。
例如原本是SHA1withRSA,使用jarsigner签名,就要加上 -digestalg SHA1 -sigalg SHA1withRSA
这里写图片描述
然后发现可以正确使用。即给在保持安兔兔自己签名的情况下,增加自己的签名,而且能签名成功,让其拥有两个签名。

4、签名异常

但是很奇怪的是,有些APK,用3说的这种方式签名,会报错:

jarsigner: 无法对 jar 进行签名:java.util.zip.ZipException:invalid entry compressed size (expected 639 but got 642 bytes)

其实这个应该是因为已经签过名导致我们再去签名发现APK大小不对,但是搞不懂的是为什么上面签名安兔兔是OK的,而且我试了不止安兔兔APK签名成功了。

另外我用和原本签名同样的JDK版本,也可以一些APK增加签名,但是换一个JDK,并且指定算法,签名出来的却不对。发现一个很奇怪的问题,对于同一个APK的文件,使用不同的JDK版,用同一种算法,同一个加密keystore,签名出来得到的SHA会不一样?这种也是我在这次签名过程中很无法理解的事情。。。

最后,我很怀疑是不是本来这种做法在APK原本已经有签名的情况下,再去给他签名就是一种不对的行为(例如原本的APK是DSA,我们自己的keystore是RSA,这种应该是不可能添加签名成功的吧)
我都被这个问题搞晕了,后面希望能弄清楚是怎么回事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值