您的位置:首页 > 移动开发 > Android开发

android 应用签名的问题

2016-12-19 10:42 369 查看
之前在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,这种应该是不可能添加签名成功的吧)

我都被这个问题搞晕了,后面希望能弄清楚是怎么回事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: