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

Difference between signature versions - V1 (Jar Signature) and V2 (Full APK Signature) while generating a signed APK in Android Studio?

请select至少在Android Studio 2.3

中使用其中一个签名版本

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

那么,在新的Android工作室更新?

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

此外,当我使用第二个选项时,我在安装 APK 时遇到错误 Install Parse Failed No Certificates

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

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

因此,如果遇到问题,您可以不选中 V2,但如果可能,应该检查它。

更新:当目标 Android 11.

时,这现在是强制性的

here写成"By default, Android Studio 2.2 and the Android Plugin for Gradle 2.2 sign your app using both APK Signature Scheme v2 and the traditional signing scheme, which uses JAR signing."

因为这些新复选框似乎与 Android 2.3 一起出现,我知道我以前的 Android Studio 版本(至少是 2.2)确实使用了两个签名。所以,要像以前一样继续,我认为最好选中两个复选框。

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

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

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 Signing Block 中的第一个 APK Signature Scheme v2 Block。如果存在 v2 块,请继续执行第 3 步。否则,回退到使用 v1 方案验证 APK。
  3. 对于 APK Signature Scheme v2 Block 中的每个签名者:
    1. 从签名中选择支持最强的签名算法ID。强度排序取决于每个 implementation/platform 版本。
    2. 使用 public 密钥根据签名数据验证签名中的相应签名。 (现在可以安全地解析签名数据了。)
    3. 验证摘要和签名中签名算法 ID 的有序列表是否相同。 (这是为了防止签名stripping/addition。)
    4. 使用与签名算法使用的摘要算法相同的摘要算法计算 APK 内容的摘要。
    5. 验证计算出的摘要是否与摘要中的相应摘要相同。
    6. 验证第一个证书的 SubjectPublicKeyInfo 与 public 密钥相同。
  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) 是具有 SignedData 结构的 PKCS #7 CMS ContentInfo,其签名已通过 <signer>.SF 文件验证。
  3. <signer>.SF 文件包含 META-INF/MANIFEST.MF 的整个文件摘要和 META-INF/MANIFEST.MF 每个部分的摘要。 MANIFEST.MF 的整个文件摘要已验证。如果失败,则改为验证每个 MANIFEST.MF 部分的摘要。
  4. META-INF/MANIFEST.MF 包含每个受完整性保护的 JAR 条目的相应命名部分,其中包含条目未压缩内容的摘要。所有这些摘要都经过验证。
  5. 如果 APK 包含未在 MANIFEST.MF 中列出且不属于 JAR 签名的 JAR 条目,则 APK 验证失败。 因此,保护​​链是 <signer>.(RSA|DSA|EC)<signer>.SFMANIFEST.MF → 每个受完整性保护的 JAR 条目的内容。

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

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

In Android 7.0, APKs can be verified according to the APK Signature Scheme v2 (v2 scheme) or JAR signing (v1 scheme). Older platforms ignore v2 signatures and only verify v1 signatures.

我尝试通过检查 V2(完整 Apk 签名) 选项来生成构建。然后,当我尝试在 7.0 设备中安装发布版本时,我无法在设备中安装版本。

之后,我尝试通过选中版本复选框和生成发布版本来构建。然后就可以安装构建了。

根据这个link:signature help

A​​PK 签名方案 v2 提供:

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

Android 7.0 introduces APK Signature Scheme v2, a new app-signing scheme that offers faster app install times and more protection against unauthorized alterations to APK files. By default, Android Studio 2.2 and the Android Plugin for Gradle 2.2 sign your app using both APK Signature Scheme v2 and the traditional signing scheme, which uses JAR signing.

推荐使用 APK 签名方案 v2,但非强制性

Although we recommend applying APK Signature Scheme v2 to your app, this new scheme is not mandatory. If your app doesn't build properly when using APK Signature Scheme v2, you can disable the new scheme.