在 Android Studio 中生成签名 APK 时签名版本之间的区别 - V1(Jar 签名)和 V2(完整 APK 签名)?
Posted
技术标签:
【中文标题】在 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? 【发布时间】:2017-07-27 16:09:13 【问题描述】:请至少选择一个签名版本以在 Android Studio 2.3 中使用
现在在 android Studio 中生成签名 APK 时,在生成签名 APK 的最后一步中显示两个选项(CheckBox),即 1.V1 (Jar Signature)
和 2.V2 (Full APK Signature)
作为 Signature Versions过程。
那么,在新的 Android Studio 更新中,V1(Jar Signature)和V2(Full APK Signature)有什么区别?
我应该使用哪个(或两者)来签署 apk 以发布 Play 商店?
另外,当我使用第二个选项时,我在安装 APK 时收到错误 Install Parse Failed No Certificates。
【问题讨论】:
【参考方案1】:它是 Android 7.0 中引入的一种新的签名机制,具有旨在使 APK 签名更加安全的附加功能。
这不是强制性的。如果可能,您应该同时选中这两个复选框,但如果新的 V2 签名机制给您带来问题,您可以省略它。
因此,如果遇到问题,您可以不选中 V2,但如果可能的话,应该检查它。
更新:现在在面向 Android 11 时这是强制性的。
【讨论】:
您应该重新提出您的问题,看起来您甚至还没有阅读链接的文档...知道您可以不选中该复选标记很有用。或许如果你加上“你遇到的错误信息和问题),那么这个问题对未来会变得更有价值 我已使用 V1 和 V2 通过签名应用程序上传应用程序。之后,我从 google play 下载应用程序并从 Android Studio 运行相同版本,它显示“安装失败,因为设备有一个应用程序具有相同的包但签名不同......”你能建议我什么吗?做错了需要更新 build.gradle 吗? @UsmanAfzal,这是预期的行为,因为您在 Playstore 上使用发布版签署了应用程序,现在您想通过 Android Studio 调试或运行它并进行调试。请注意,发布和调试是不同的签名 谢谢@EugenMartynov 我更新了答案以表明这一点......这是一个流行的答案,所以我感谢你指出这一点(所以我可以更新这个)。【参考方案2】:我应该使用(或两者)来签署 apk 以发布 Play 商店吗? 答案是YES。
根据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 设备下安装发布版本时,我无法在设备中安装版本。
之后我尝试通过选中版本复选框并生成发布版本来构建。然后就可以安装构建了。
【讨论】:
【参考方案3】:here 写道:“默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 使用 APK 签名方案 v2 和使用 JAR 签名的传统签名方案对您的应用程序进行签名。”
似乎这些新复选框出现在 Android 2.3 中,我知道我以前的 Android Studio 版本(至少是 2.2)确实使用这两个签名进行签名。因此,要像以前一样继续,我认为最好同时选中这两个复选框。
2017 年 3 月 31 日编辑: 提交了几个具有两个签名的应用 => 没问题 :)
【讨论】:
【参考方案4】:根据此链接:signature help
APK 签名方案 v2 提供:
-
更快的应用安装时间
针对未经授权的 APK 文件更改提供更多保护。
Android 7.0 引入了 APK Signature Scheme v2,一种新的应用签名 提供更快的应用程序安装时间和更多保护的方案 防止未经授权更改 APK 文件。默认情况下,安卓 Studio 2.2 和 Android Plugin for Gradle 2.2 使用 APK 签名方案 v2 和传统的签名方案,其中 使用 JAR 签名。
推荐使用 APK 签名方案 v2,但不是强制性的。
虽然我们建议将 APK 签名方案 v2 应用于您的应用, 这个新计划不是强制性的。如果您的应用没有正确构建 使用 APK 签名方案 v2 时,您可以禁用新方案。
【讨论】:
嗨@Shirish,我们可以从 Eclipse 构建 v2 吗? 它现在是强制性的,因为您不能选择签名版本 - 该选项已被删除,所有 apk 都使用 v2。因此,您无法在旧手机上生成可安装的 apk。【参考方案5】:我认为this 代表了一个很好的答案。
APK 签名方案 v2 验证
-
找到
APK Signing Block
并验证:
APK Signing Block
的两个大小字段包含相同的值。
ZIP Central Directory
后面紧跟 ZIP End of Central Directory
记录。
ZIP End of Central Directory
后面没有更多数据。
APK Signing Block
中找到第一个APK Signature Scheme v2 Block
。如果存在 v2 Block(如果存在),请继续执行第 3 步。否则,回退到使用 v1 方案验证 APK。
对于APK Signature Scheme v2 Block
中的每个签名者:
-
从签名中选择支持的最强签名算法 ID。强度排序取决于每个实现/平台版本。
使用公钥根据签名数据验证相应的签名。 (现在可以安全地解析签名数据。)
验证摘要和签名中签名算法 ID 的有序列表是否相同。 (这是为了防止签名剥离/添加。)
使用与签名算法使用的摘要算法相同的摘要算法计算 APK 内容的摘要。
验证计算的摘要是否与摘要中的相应摘要相同。
验证第一个证书的
SubjectPublicKeyInfo
与公钥相同。
注意:如果第 3 步或第 4 步发生故障,则不得使用 v1 方案验证 APK。
JAR 签名的 APK 验证(v1 方案)
JAR 签名的 APK 是一个标准签名的 JAR,它必须完全包含 META-INF/MANIFEST.MF
中列出的条目,并且所有条目都必须由同一组签名者签名。其完整性验证如下:
-
每个签名者由
META-INF/<signer>.SF
和 META-INF/<signer>.(RSA|DSA|EC)
JAR 条目表示。
<signer>.(RSA|DSA|EC)
是带有 SignedData 结构的 PKCS #7 CMS ContentInfo
,其签名通过 <signer>.SF
文件进行验证。
<signer>.SF
文件包含META-INF/MANIFEST.MF
的整个文件摘要和META-INF/MANIFEST.MF
的每个部分的摘要。验证了MANIFEST.MF
的整个文件摘要。如果失败,则改为验证每个 MANIFEST.MF
部分的摘要。
META-INF/MANIFEST.MF
为每个受完整性保护的 JAR 条目包含一个相应命名的部分,其中包含条目未压缩内容的摘要。所有这些摘要都经过验证。
如果 APK 包含未在 MANIFEST.MF
中列出且不属于 JAR 签名的 JAR 条目,则 APK 验证失败。
因此,保护链是<signer>.(RSA|DSA|EC)
→ <signer>.SF
→ MANIFEST.MF
→ 每个受完整性保护的 JAR 条目的内容。
【讨论】:
它说“注意:如果步骤 3 或 4 中发生故障,则不得使用 v1 方案验证 APK”,方案 2 或方案 1 中的步骤 3 或 4?此外,如果 v2 中的第 3 步或第 4 步发生故障,然后说无法使用 v1 方案进行验证,那么它将不会在 v1 或 v2 中进行验证,如何验证?以上是关于在 Android Studio 中生成签名 APK 时签名版本之间的区别 - V1(Jar 签名)和 V2(完整 APK 签名)?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 无法在 proguard 错误配置中生成签名的 APK
在 Android Studio 中生成签名 APK 时签名版本之间的区别 - V1(Jar 签名)和 V2(完整 APK 签名)?
无法在 Android Studio 中生成签名的 APK,因为缺少 proguard-rules.txt