跳到正文

APK 分发过程中保持签名不变

APK 签名不只是构建产物的一部分。Android 用它识别应用、授权升级,并维护用户与应用之间的信任关系。在分发过程中改变签名,可能造成很难逆转的问题。

签名为什么重要

本节链接

Android 要求更新包使用兼容的签名密钥。如果下载到的 APK 被换成了另一把密钥重新签名,用户可能无法覆盖安装,必须先卸载旧版本,而卸载可能清除本地数据。

签名变化还会影响:

  • 企业和 MDM 分发策略;
  • 合作方校验和应用市场审核;
  • 更新、回滚和灰度发布;
  • 用户对下载来源的信任。

重签名看起来只是一个构建步骤,但它改变的是用户最终拿到的应用身份。

哪些操作会改变签名

本节链接

分发流程可能在以下情况下破坏签名:

  • 修改 APK 后用另一把密钥重新签名;
  • 为每个渠道重新构建 APK;
  • 在签名后执行会重写内容的处理步骤;
  • 使用了不是原始应用密钥的共享签名密钥。

最安全的默认做法是:分发经过测试的那个已签名产物。

只保留一个签名包

本节链接

使用 APK Ref Injector 时,母包保持原有签名。服务在下载响应中附加请求的渠道值,不改变 APK 签名。原始 V2/V3 签名保持有效。

这样可以做到:

  • 应用可以正常覆盖升级;
  • 企业签名校验继续有效;
  • 新增渠道链接不需要重新构建;
  • 测试的产物就是用户安装的产物。

下载前后都验证

本节链接

记录原始签名,并与下载后的文件对比:

终端
apksigner verify --verbose original.apk
apksigner verify --verbose downloaded.apk

两者都应该报告预期的 V2/V3 签名。如果分发流程改变了签名,应先停下并修复流程,再对外发布。

适用边界

本节链接

签名保持适用于满足服务要求的已签名 APK。仅 V1 签名的 APK 和 ZIP64 包不受支持。接入时应验证母包,并在活动开始前测试完整下载流程。

下一步

本节链接