ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

https://i.stack.imgur.com/1CPP5.png

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

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

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

对我来说,一旦我选择了 v2,那么构建就可以了。但是一旦我想检查这些框,它们就不再显示了……它们在哪里? @f.khantsis
较新的版本不包括这些选项吗?......

B
Booger

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

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

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

更新:现在在针对 Android 11 时这是强制性的。


不过,您应该重新提出您的问题,看起来您甚至还没有阅读链接的文档……知道您可以不选中该复选标记很有用。也许如果你加上“你遇到的错误信息和问题”,那么这个问题对未来会变得更有价值
我已经使用 V1 和 V2 通过签名应用程序上传了应用程序。之后,我从 google play 下载应用程序并从 Android Studio 运行相同版本,它显示“安装失败,因为设备有一个应用程序具有相同的包但签名不同......”你能建议我什么吗?做错了需要更新 build.gradle 吗?
@UsmanAfzal,这是预期的行为,因为您在 Playstore 上使用发布版签署了应用程序,现在您想通过 Android Studio 调试或运行它并进行调试。请注意,发布和调试是不同的签名
谢谢@EugenMartynov 我更新了答案以表明这一点......这是一个流行的答案,所以我感谢你指出这一点(所以我可以更新这个)。
C
Chintan Rathod

我应该使用(或两者)来签署 apk 以发布 Play 商店吗?答案是肯定的。

根据 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 以下设备中安装发布版本时,我无法在设备中安装版本。

之后,我尝试通过选中版本复选框并生成发布版本来构建。然后能够安装构建。


但是那些复选框选项现在没有显示,它们在哪里?
t
toto_tata

here 写道:“默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 使用 APK 签名方案 v2 和使用 JAR 签名的传统签名方案对您的应用程序进行签名。”

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

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


S
Shirish Herwade

根据此链接:signature help

APK 签名方案 v2 提供:

更快的应用安装时间 对 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 版本吗?
它现在是强制性的,因为您无法选择签名版本 - 该选项已被删除,并且所有 apk 都使用 v2。因此,您无法在旧手机上生成可安装的 apk。
G
Gastón Bengolea

我认为 this 代表了一个很好的答案。

APK 签名方案 v2 验证

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

注意:如果第 3 步或第 4 步失败,则不能使用 v1 方案验证 APK。

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

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

每个签名者由 META-INF/.SF 和 META-INF/.(RSA|DSA|EC) JAR 条目表示。 .(RSA|DSA|EC) 是具有 SignedData 结构的 PKCS #7 CMS ContentInfo,其签名通过 .SF 文件进行验证。 .SF 文件包含 META-INF/MANIFEST.MF 的整个文件摘要和 META-INF/MANIFEST.MF 的每个部分的摘要。验证了 MANIFEST.MF 的整个文件摘要。如果失败,则改为验证每个 MANIFEST.MF 部分的摘要。 META-INF/MANIFEST.MF 为每个完整性保护的 JAR 条目包含一个相应命名的部分,其中包含条目的未压缩内容的摘要。所有这些摘要都经过验证。如果 APK 包含未在 MANIFEST.MF 中列出且不属于 JAR 签名的 JAR 条目,则 APK 验证失败。因此,保护链是 .(RSA|DSA|EC) → .SF → MANIFEST.MF → 每个完整性保护 JAR 条目的内容。


上面写着“注意:如果步骤 3 或 4 中发生故障,则不得使用 v1 方案验证 APK”,方案 2 或方案 1 中的步骤 3 或 4?此外,如果 v2 中的第 3 步或第 4 步发生故障,然后说无法使用 v1 方案进行验证,那么它将不会在 v1 或 v2 中进行验证,如何验证?