V1 V2(7.0) apk文件重签名

来源:互联网 发布:高华讲座视频全集知乎 编辑:程序博客网 时间:2024/06/17 01:50

build-tools大于25.0.0以后再lib文件夹多了个apksigner.jar,并且studio打包时候会有两个选项一个是V1,一个是V2。这里面的区别是什么呢?首先介绍一下V1,然后说一下V2,再然后做一下实验。

--------------------------------------------------------------我的萌萌哒分割线-----------------------------------------------------------

需要删除apk包中的签名文件,META-INF(更改apk格式为压缩包形式,删除META-INF文件夹,改回.apk格式);
将证书(debug.keystore)复制到与需要重新签名的apk文件相同的目录下(如:复制到D:\Sign);
进入cmd模式,进入D:\Sign目录;
运行下面的命令 jarsigner -verbose -keystore debug.keystore -storepass android -signedjar PhoneBook_signed.apk -digestalg SHA1 -sigalg MD5withRSA PhoneBook.apk androiddebugkey
/*解释:jarsigner是Java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示使用当前目录中的debug.keystore签名证书文件
-storepass android表示Keystore密码:
“android”-signedjar PhoneBook_signed.apk表示签名后生成的APK名称
PhoneBook.apk表示未签名的APK Android软件
-digestalg SHA1 -sigalg MD5withRSA:这就是必须加上的参数,如果你是jdk 1.6也不受影响
-androiddebugkey表示Key别名

在签名后执行下ZipAlign操作

zip对齐,因为APK包的本质是一个zip压缩文档,经过边界对齐方式优化能使包内未压缩的数据有序的排列,从而减少应用程序运行时的内存消耗 ,通过空间换时间的方式提高执行效率(zipalign后的apk包体积增大了100KB左右)。
打开cmd,把目录切换到SDK的build-tools目录下(例如 E:\SDK\build-tools\25.0.2\),执行:

.\zipalign.exe -v -p 4 input.apk output.apk

zipalign命令选项不多:
-f : 输出文件覆盖源文件
-v : 详细的输出log
-p : outfile.zip should use the same page alignment for all shared object files within infile.zip
-c : 检查当前APK是否已经执行过Align优化。
另外上面的数字4是代表按照4字节(32位)边界对齐。

--------------------------------------------------------------我的萌萌哒分割线-----------------------------------------------------------

从草稿箱里翻出来的,下面的我就直接从笔记粘贴了,凑合着看吧

http://blog.csdn.net/abc6368765/article/details/69948926
根据上面的blog得出结论,建议两个选项都选,如果出错的话,就直选第一个。

重签名:
http://www.jianshu.com/p/e1e2fd05bb62
v2重签名
先执行ZipAlign的操作
cd D:\sdk\build-tools\25.0.2
.\zipalign.exe -v -p 4 D:\keystore\aaa.apk D:\keystore\input.apk
然后执行签名操作
java -jar apksigner.jar sign //执行签名操作 --ks 你的jks路径 //jks签名证书路径 --ks-key-alias 你的alias //生成jks时指定的alias --ks-pass pass:你的密码 //KeyStore密码 --key-pass pass:你的密码 //签署者的密码,即生成jks时指定alias对应的密码 --out output.apk //输出路径 input.apk //被签名的apk
如果没有.jks文件咋办,把.keystore后缀改了就行了
cd lib
java -jar apksigner.jar sign --ks D:\keystore\SinaAndroid2.jks --ks-key-alias sina --ks-pass pass:123456 --key-pass pass:123456 --out D:\keystore\output.apk D:\keystore\input.apk
验证是否签名成功:
java -jar apksigner.jar verify -v D:\keystore\output.apk

看到这里,其实我自己是有疑问的,因为之前做重签名的时候,要删除掉已签名文件META-INF,然后执行重签名,然后才是ZipAlign。那就是说如果我的apk在刚开始签名的时候选择的是两个都选,那么我这个时候如果要做重签名的话,是不是要做两次,一次V1一次V2呢。
1 其实我们可以发现当你验证签名是否成功的时候
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1
这个结果说明你坐V2签名时候其实是V1和V2都进行了的。所以说如果你打算重签名的时候是不用做两次的(这个基本都没有人提到,但是你实际操作的时候才会知道)。
2 既然我用上面的方法可以进行签名操作,但是现在有一个问题,如果我刚开始签名通过studio只是使用的V1签名,那么我重签名的时候能不能使用V2签名。如果我使用了的话,对apk的大小和安装是否有影响。
在这里我做了一个实验,首先V1和V1,V2打包出来的大小有1KB不同,后者大1KB(实验包大小23146KB)。其次,如果删除META-INF文件的话,两个大小就是一样的。执行完V2之后,两个的大小也是一样的。并且安装都没有问题,所以说studio打V1包,重签名执行V2是可以的
3 通过命令行进行V2签名操作,apk要比studio打包出来的小一点,我实验是少了11KB,具体原因现在还不知道。。。
4 如果在删除META-INF之后进行V1重签名,发现包要比studio的大。我这里大了87KB,具体原因也不知道。。。因为上面说了V1,V2删除META-INF之后大小一样,所以同理。V1重签名包要比V2大
5 还有一个我自己的猜想,V2重签名的时候可否删除META-INF。我们知道在步骤上V1和V2的区别是签名和ZipAlign的顺序不同,原因是ZipAlign会影响签名。所以理论上我删除了META-INF文件,应该是没有影响的。手动实验结果,是的,没有影响。