为啥我要在发布到 PlayStore 之前签署我的 apk?

Posted

技术标签:

【中文标题】为啥我要在发布到 PlayStore 之前签署我的 apk?【英文标题】:Why should I sign my apk before releasing to PlayStore?为什么我要在发布到 PlayStore 之前签署我的 apk? 【发布时间】:2014-07-17 09:24:43 【问题描述】:

在发布到市场之前签署 apk 究竟有多重要?

【问题讨论】:

你无法发布带有调试标志的应用程序(无法安装) 【参考方案1】:

来自android Documentation for Signing Applications:

Android 系统要求所有已安装的应用程序必须 使用其私钥持有的证书进行数字签名 应用程序的开发人员。 Android系统使用证书作为 识别申请作者并建立 应用程序之间的信任关系。证书未使用 控制用户可以安装哪些应用程序。证书 不需要由证书颁发机构签名:它是完美的 Android 应用程序使用自签名是允许且典型的 证书。

关于签署 Android 应用程序的要点 是:

所有申请都必须签名。如果没有签名,系统将不会在模拟器或设备上安装应用程序。 为了测试和调试您的应用程序,构建工具使用由 Android 创建的特殊调试密钥对您的应用程序进行签名 SDK 构建工具。 当您准备好为最终用户发布您的应用程序时,您必须使用合适的私钥对其进行签名。您不能发布 使用 SDK 生成的调试密钥签名的应用程序 工具。 您可以使用自签名证书对您的应用程序进行签名。不需要证书颁发机构。 系统仅在安装时测试签名者证书的到期日期。如果应用程序的签名者证书在 应用程序已安装,应用程序将继续运行 正常。 您可以使用标准工具(Keytool 和 Jarsigner)来生成密钥并对应用程序 .apk 文件进行签名。 在您签署应用程序以进行发布后,我们建议您使用 zipalign 工具优化最终的 APK 包。

Android 系统不会安装或运行不是 适当地签署。这适用于运行 Android 系统的任何地方, 无论是在实际设备上还是在模拟器上。为此,你 必须先为您的应用程序设置签名,然后才能运行它或 在模拟器或设备上调试它

为什么意味着:

应用程序签名的某些方面可能会影响您处理 开发您的应用程序,尤其是如果您打算 发布多个应用程序

一般来说,向所有开发者推荐的策略是签署所有 您的应用程序具有相同的证书,在整个 您的应用程序的预期寿命。有几个原因 你应该这样做:

应用程序升级 – 当您发布应用程序更新时,您必须继续使用相同的更新签名 证书或证书集,如果您希望用户能够 无缝升级到新版本。系统安装时 对应用程序的更新,它比较新的证书 版本与现有版本中的版本。如果证书匹配 确切地说,包括证书数据和订单,然后 系统允许更新。如果您在未使用的情况下签署新版本 匹配证书,您还必须分配不同的包名称 到应用程序——在这种情况下,用户安装新版本 作为一个全新的应用程序。

应用程序模块化 – Android 系统允许由相同证书签名的应用程序在同一进程中运行,如果 应用程序如此请求,以便系统将它们视为 单一应用。通过这种方式,您可以将应用程序部署在 模块,用户可以独立更新每个模块,如果 需要。

通过权限共享代码/数据 – Android 系统提供基于签名的权限执行,以便 应用程序可以向另一个应用程序公开功能 用指定的证书签名。通过签署多个申请 具有相同的证书并使用基于签名的权限 检查后,您的应用程序可以安全地共享代码和数据。

确定签约策略的另一个重要考虑因素 是如何设置您将用于签名的密钥的有效期 你的应用程序。

如果您计划支持单个应用程序的升级,则应确保您的密钥的有效期超过预期 该应用程序的生命周期。有效期为 25 年或以上 推荐的。当您的密钥有效期到期时,用户将不会 不再能够无缝升级到您的新版本 申请。

如果您将使用同一个密钥签署多个不同的应用程序,您应该确保您的密钥的有效期超过预期 所有应用程序的所有版本的生命周期,包括 将来可能会添加到套件中的相关应用程序。

如果您计划在 Google Play 上发布您的应用程序,您用于签署应用程序的密钥必须有一个有效期结束 2033 年 10 月 22 日之后。Google Play 强制执行此要求以确保 当新版本发布时,用户可以无缝升级应用程序 可用。

【讨论】:

@Hissain 要使用您自己的证书升级您的应用程序并在 Play 商店中发布多个应用程序,我们需要对其进行签名,以便他们接受您的申请。查看我编辑的答案 当您从其他来源复制文本时,您必须通过将复制的文本放在块引号中来表明您已复制它。请参阅How to reference material written by others。 “建立应用程序之间的信任关系”是什么意思?以及如何根据签名知道“作者”? 仅引用 android 页面并不是我想的问题中所寻求的东西。被问到的是,应用签名究竟有什么帮助,因此在发布之前对应用进行签名非常重要。 @ShylendraMadda 2. 为什么要对已接受的答案投反对票 - 发布问题的人可能对您的答案感到满意。但是,恕我直言,SO 被整个社区使用,它是不可或缺的一部分,我希望这里发布的问题有最清晰和最明确的答案,以便答案有助于明确概念,而不仅仅是帮助工作就在眼前。【参考方案2】:

为什么?

开发者可以防止有人篡改他们的应用。

签名以保护您的应用!

这适用于公钥加密。你是唯一拥有私钥的人。您是唯一可以签署您的应用程序的人。用户可以信任直接来自您的应用程序。如果私钥不可用,则从数学上证明篡改应用程序是不可行的。

您知道,在公钥密码学中,有两把钥匙,就像硬币的两面一样。私钥和公钥。您将私钥保密。你把它锁起来并保持安全。另一方面,您发布您的公钥。

这些密钥就像硬币的两面,因为你用一个密钥加密的内容你用另一个密钥解密。

这如何应用于应用签名?

签名是用私钥加密。

因为您发布了应用商店的公钥,所以用户拥有您的公钥。他们可以解密您的应用程序,因此可以确定该应用程序确实是您自己的。 Android 和应用商店为他们做这件事。

应用商店通过使用公钥解密来验证签名。

就是这样,伙计们。

【讨论】:

【参考方案3】:

签署 Apk: 生成签名的 apk 意味着使用只有您知道的密码或密钥对您的 apk 进行加密,并且您必须永远记住此 apk,就好像在您的应用程序上进行任何进一步升级时,您必须使用您的应用程序访问它。

【讨论】:

以上是关于为啥我要在发布到 PlayStore 之前签署我的 apk?的主要内容,如果未能解决你的问题,请参考以下文章

重新创建应用程序以在 Playstore 上作为更新发布

如何在向公众(playstore)发布任何应用程序之前将应用程序发布到 Alpha 组?

如何签署我已经制作的 android app/.apk 文件

为啥我不能用我的 JWK 签署这些声明?

当我将我的应用程序上传到 Playstore 时收到此警告

将我的应用程序发布到 google playstore 后,我的应用程序无法获取 firestore 数据以回收分页视图