APK 分发过程中保持签名不变
APK 签名不只是构建产物的一部分。Android 用它识别应用、授权升级,并维护用户与应用之间的信任关系。在分发过程中改变签名,可能造成很难逆转的问题。
签名为什么重要
本节链接Android 要求更新包使用兼容的签名密钥。如果下载到的 APK 被换成了另一把密钥重新签名,用户可能无法覆盖安装,必须先卸载旧版本,而卸载可能清除本地数据。
签名变化还会影响:
- 企业和 MDM 分发策略;
- 合作方校验和应用市场审核;
- 更新、回滚和灰度发布;
- 用户对下载来源的信任。
重签名看起来只是一个构建步骤,但它改变的是用户最终拿到的应用身份。
哪些操作会改变签名
本节链接分发流程可能在以下情况下破坏签名:
- 修改 APK 后用另一把密钥重新签名;
- 为每个渠道重新构建 APK;
- 在签名后执行会重写内容的处理步骤;
- 使用了不是原始应用密钥的共享签名密钥。
最安全的默认做法是:分发经过测试的那个已签名产物。
只保留一个签名包
本节链接使用 APK Ref Injector 时,母包保持原有签名。服务在下载响应中附加请求的渠道值,不改变 APK 签名。原始 V2/V3 签名保持有效。
这样可以做到:
- 应用可以正常覆盖升级;
- 企业签名校验继续有效;
- 新增渠道链接不需要重新构建;
- 测试的产物就是用户安装的产物。
下载前后都验证
本节链接记录原始签名,并与下载后的文件对比:
apksigner verify --verbose original.apkapksigner verify --verbose downloaded.apk两者都应该报告预期的 V2/V3 签名。如果分发流程改变了签名,应先停下并修复流程,再对外发布。
适用边界
本节链接签名保持适用于满足服务要求的已签名 APK。仅 V1 签名的 APK 和 ZIP64 包不受支持。接入时应验证母包,并在活动开始前测试完整下载流程。