Android开发之签名V1和V2的区别

时间:2024-05-23 12:35:02

转载自:http://blog.****.net/francisbingo/article/details/78655848

在我们使用Android studio打包签名的时候可以选择两种签名方式。如下图


Android开发之签名V1和V2的区别


对于V2的官网解释如下

Android开发之签名V1和V2的区别

官网地址:https://android-developers.googleblog.com/2016/11/understanding-apk-packaging-in-android-studio-2-2.html

大致翻译一下:

1.用于验证其完整性的APK的加密签名现在位于ZIP*目录之前。

2.这个签名是在整个APK文件的二进制内容上计算和验证的,而不是在v1的归档文件中解压缩文件内容。

3.一个APK可以同时由v1和v2签名同时签署,所以它仍然可以向后兼容以前的Android版本。


如果只设置V2会引入什么问题呢?
只设置V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证 

报错信息为:INSTALL_PARSE_FAILED_NO_CERTIFICATES

只要将签名设置为V2即可解决

同时设置V1和V2则所有机型都没问题

只设置v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式


如何验证apk应用的什么签名方式呢?

使用adb shell dumpsys package xxx(这里的xxx是指你的apk包名)的命令查看apkSigningVersion的值为多少。

下面是对官网的翻译

在Android Studio 2.2中理解APK打包

2016年11月10
Wojtek Kaliciński发布的Android开发者倡议

最近,Android Studio 2.2推出了许多新的和改进的功能。有些变化很容易被忽略,
因为它们发生在Android分级插件的底层,比如重新编写的集成APK打包和签名步骤。
APK签名方案v2

在Android 7.0版本的新APK签名方案中引入了新的APK签名方案,我们决定重写APKs在Android分级插件中的工作方式。在文档中,您可以阅读所有关于v2签名的底层技术细节,但是这里有一个快速的tl;作为一个Android应用程序开发人员,您需要的信息摘要:

用于验证其完整性的APK的加密签名现在位于ZIP*目录之前。

这个签名是在整个APK文件的二进制内容上计算和验证的,而不是在v1的归档文件中解压缩文件内容。

一个APK可以同时由v1和v2签名同时签署,所以它仍然可以向后兼容以前的Android版本。

为什么要将这种变化引入Android如何验证APKs呢?首先,为了增强这种新签名格式的安全性和可扩展性,其次是性能——新签名要花更少的时间在设备上验证(不需要进行昂贵的解压),从而加快了应用安装时间。

然而,这个新签名方案的结果是,在APK创建过程中存在新的约束。因为在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改——文件可以移动,甚至可以重新压缩。事实上,作为构建过程的一部分的zipalign工具确实做到了这一点——它被用于在正确的字节边界上对齐ZIP条目以提高运行时性能。

因为v2签名验证了归档中的所有字节,而不是单独的ZIP条目,所以在签名之后运行zipalign是不可能的。这就是为什么压缩、对齐和签名现在发生在构建过程的一个单一的、集成的步骤中。

如果您在构建过程中有任何定制任务,包括篡改或处理APK文件,请确保禁用它们,否则您可能会使v2签名失效,从而使您的APKs与Android 7.0和以上版本不兼容。

如果您选择手动进行签名和对齐(例如从命令行),我们将在Android SDK中提供一个新的工具,名为apksigner,它提供了v1和v2 APK的签名和验证。注意,如果您使用的是v2签名,您需要在运行apksigner之前运行zipalign。还请记住,JDK中的jarsigner工具与Android v2签名不兼容,所以如果您想保留v2签名,您就不能使用它来重新标记您的APKs。

如果你想在使用Android分级插件时禁用添加v1或v2的签名,你可以将这些行添加到你的signingConfig部分。

v1SigningEnabled false

v2SigningEnabled false

注意:在Android分级插件2.2中,两个签名方案都是默认启用的。

为更小的APKs发布版本

我们在重写packager时利用这个机会,对发布APKs的大小进行了一些优化,从而获得更快的下载速度,在Play Store上进行更小的增量更新,在设备上的空间也更少。
以下是我们做出的一些改变:

归档文件中的文件现在已经排序,以最小化APK构建之间的差异。
所有的文件时间戳和元数据都被归零。
第6级和第9级压缩对所有文件进行并行检查,并使用最优的文件,也就是说,如果L9对大小没有什么好处,那么可以选择L6以获得更好的性能。
本地库存储在APK中,未压缩和页面对齐。
这将支持android:extractNativeLibs =“false”选项从android 6.0设备上的棉花糖,让应用程序使用更少的空间以及生成更新玩小商店
Zopfli压缩不用于更好地支持Play Store更新算法。
不建议与Zopfli重新压缩你的APKs。
在您的项目中,预先优化单个资源,如PNG文件,仍然是很好的,并且推荐。

这些变化有助于让你的版本尽可能的小,这样用户就可以下载和更新你的应用,即使是在较慢的连接上,或者在功能较差的设备上。
但是,调试构建又如何呢?
安装速度的调试构建

在开发应用程序时,您需要快速地保持迭代周期——更改代码、构建和部署在一个连接的设备或模拟器上。
自Android Studio 2.0以来,我们一直致力于尽可能快地完成所有的步骤。
通过即时运行,我们现在只能够在运行时更新代码和资源,而新的仿真器可以为更快的APK传输和安装提供多处理器支持和更快的ADB速度。
构建改进可以进一步缩短这个时间,在Android Studio 2.2中,我们引入了增量打包和并行压缩来调试构建。
与其他特性一起,例如有选择地为目标设备密度和ABI打包资源,这将使您的开发速度更快。

警告:为即时运行创建的APK文件或通过调用调试构建而不是在Play Store上发布的!
它们包含了用于即时运行的额外的插装代码,除了启动构建时连接的设备配置外,还缺少用于设备配置的资源。
确保你只发布了APK的发布版本,你可以使用Android Studio生成已签署的APK命令或组装的分级任务来创建APK。


注意:

一定可行的方案: 只使用 v1 方案;
不一定可行的方案:同时使用 v1 和 v2 方案;
对 7.0 以下一定不行的方案:只使用 v2 方案;
1, 如果要支持 Android 7.0 以下版本,那么尽量同时选择两种签名方式,但是一旦遇到签名问题,可以只使用 v1 签名方案
2,如果需要对签名后的信息做处理修改,那就使用v1签名方案
3,如果最后遇到各种不同的问题,可以不勾选v1和v2,直接打包签名