在Android Studio中生成签名的APK时,签名版本之间的区别-V1(Jar签名)和V2(完整APK签名)吗?


234

请选择至少一个签名版本以在Android Studio 2.3中使用

现在,在Android Studio中生成签名APK时,它在签名APK生成过程的最后一步中显示了两个选项(复选框)即1. V1 (Jar Signature)和2. V2 (Full APK Signature)作为签名版本

**签名版本**选项

那么,在新的Android Studio更新中,V1(Jar签名)V2(完整APK签名)之间有什么区别?

我应该使用哪个(或同时使用两个)来为Play商店发布的APK签名?

另外,当我使用第二个选项时,在安装APK时安装Parse Failed No Certificates时出现错误。

Answers:


219

这是Android 7.0中引入的新签名机制,其附加功能旨在使APK签名更加安全。

这不是强制性的。如果可能,您应该选中这两个复选框,但是如果新的V2签名机制给您带来了问题,则可以将其忽略。

因此,如果遇到问题,您可以仅取消选中V2,但应尽可能对其进行检查。


不过,您应该重新措词,看来您甚至都没有阅读链接的文档...知道您可以取消选中该复选标记很有用。也许如果您添加“错误消息和遇到的问题),那么该问题对未来将变得更有价值
Booger,2017年

我已经使用V1和V2通过签名的应用程序上载了应用程序。之后,我从Google Play下载了该应用程序,并从Android Studio运行了相同的版本,它向我显示“安装失败,因为该设备的应用程序具有相同的程序包但签名不同。。。”对话框。做错了需要更新build.gradle吗?
Usman Afzal'9

@UsmanAfzal,这是预期的行为,因为您已在Playstore上发布该应用并对其进行了签名,现在您要进行调试或通过带有调试功能的Android Studio运行该应用。请注意,发布和调试是不同的签名
Parama Dharmika

44

我应该使用(或两者都使用)为Play商店发布的APK签名吗? 答案是肯定的

根据https://source.android.com/security/apksigning/v2.html#verification

在Android 7.0中,可以根据APK签名方案v2(v2方案)或JAR签名(v1方案)来验证APK。较旧的平台会忽略v2签名,而只会验证v1签名。

我试图通过检查V2(Full Apk Signature)选项生成生成。然后,当我尝试在7.0以下版本的设备中安装发布版本时,无法在该设备中安装版本。

之后,我尝试通过同时选中版本复选框和生成发行版本来进行构建。然后能够安装构建。


24

此处写道:“默认情况下,Android Studio 2.2和适用于Gradle 2.2的Android插件同时使用APK签名方案v2和使用JAR签名的传统签名方案对您的应用程序进行签名。”

好像这些新复选框随Android 2.3一起出现了,我了解到我以前的Android Studio版本(至少是2.2)确实使用两个签名进行了签名。因此,要像以前一样继续操作,我认为最好同时选中两个复选框。

编辑2017年3月31日:提交了两个签名均相同的应用程序=>没问题:)


7

我认为是一个很好的答案。

APK签名方案v2验证

  1. 找到APK Signing Block并验证:
    1. 的两个大小字段APK Signing Block包含相同的值。
    2. ZIP Central Directory紧随其后的是ZIP End of Central Directory记录。
    3. ZIP End of Central Directory 之后没有更多数据。
  2. 找到第一APK Signature Scheme v2 BlockAPK Signing Block。如果存在v2块,请继续执行步骤3。否则,请退回到使用v1方案验证APK。
  3. 对于中的每个签名者APK Signature Scheme v2 Block
    1. 从签名中选择最受支持的签名算法ID。强度排序取决于每个实现/平台版本。
    2. 使用公钥针对签名数据验证签名中的相应签名。(现在可以安全地分析签名的数据。)
    3. 验证摘要和签名中签名算法ID的排序列表是否相同。(这是为了防止签名剥离/添加。)
    4. 使用与签名算法使用的摘要算法相同的摘要算法计算APK内容的摘要。
    5. 验证计算的摘要与摘要中的相应摘要相同。
    6. 验证SubjectPublicKeyInfo第一份证书证书与公共密钥相同。
  4. 如果至少找到一个签名者,则验证成功,并且对于每个找到的签名者,步骤3成功。

注意:如果在步骤3或4中失败,则不得使用v1方案验证APK。

JAR签名的APK验证(v1方案)

JAR签名的APK是标准的签名JAR,它必须完全包含中列出的条目,META-INF/MANIFEST.MF并且所有条目必须由同一组签名者签名。验证其完整性如下:

  1. 每个签名者均由META-INF/<signer>.SFMETA-INF/<signer>.(RSA|DSA|EC)JAR条目表示。
  2. <signer>.(RSA|DSA|EC)PKCS #7 CMS ContentInfo具有SignedData结构的结构,其签名已通过<signer>.SF文件验证。
  3. <signer>.SF文件包含的完整文件摘要META-INF/MANIFEST.MF和的每个部分的摘要META-INF/MANIFEST.MFMANIFEST.MF已验证的整个文件摘要。如果失败,那么MANIFEST.MF将验证每个部分的摘要。
  4. META-INF/MANIFEST.MF对于每个受完整性保护的JAR条目,都包含一个相应命名的部分,其中包含该条目的未压缩内容的摘要。所有这些摘要均已验证。
  5. 如果APK包含未列出MANIFEST.MF且不属于JAR签名的JAR条目,则APK验证将失败。因此,保护链是<signer>.(RSA|DSA|EC)<signer>.SFMANIFEST.MF每个完整性保护的JAR进入→内容。

上面写着“注意:如果在步骤3或4中发生故障,则不能使用v1方案验证APK”,方案2或方案1中的步骤3或4?如果在v2的步骤3或4中发生故障,然后说不能使用v1方案进行验证,那么将不会在v1或v2中对其进行验证?
isJulian00 '19

7

根据此链接:签名帮助

APK签名方案v2提供:

  1. 更快的应用安装时间
  2. 防止未经授权更改APK文件的更多保护措施。

Android 7.0引入了APK签名方案v2,这是一种新的应用程序签名方案,可提供更快的应用程序安装时间,并提供更多保护,防止未经授权擅自更改APK文件。默认情况下,Android Studio 2.2和Android Plugin for Gradle 2.2使用 APK签名方案v2和使用JAR签名的传统签名方案对您的应用进行签名。

这是推荐使用APK签名方案v2的,但不是强制性的

尽管我们建议将APK签名方案v2应用于您的应用,但这不是强制性的新方案。如果使用APK签名方案v2时应用无法正确构建,则可以禁用新方案。


@Shirish,您好,我们可以从eclipse制作v2版本吗?
Arjun T Raj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.