[Android]关于APK签名冲突问题的记录

这几天更新APK 从版本v1.2升级到版本v1.3.遇到的签名冲突问题.在这里做一个记录.

问题重现

  • APK_A:目前平台上玩家的版本v1.2  拥有平台签名 key_A;(md5算法)
  • APK_B:我方(开发商)提供的新版本v1.3 给平台方签名,拥有我方签名 key_B;(RSA,SHA1,MD5)
  • APK_C:平台方签名后返回的新版v1.3已签名包,拥有平台签名 key_A;

A,B,C三个APK中  按照逻辑上将 A,C是应该拥有共同的签名key_A的,所以可以正常升级不会出现签名冲突;

但是事情就是这样发生了,当我安装APK_A之后安装APK_C 提示签名冲突;

原因分析

  1. 平台方两次的签名key_A 被篡改;
  2. 平台方两次签名工具差异导致的签名不成功(包括版本差异);
  3. 平台方签名命令行两次发生变化,例如新增了某算法验证;
  4. 平台方未去除干净key,就签名,等于是二次签名
  5. 我方提供的签名key_B 对key_A产生影响;


但是经过手动验证后1,2,3,5都可否决

那就只剩下4,但是鉴于之前的更新都正常 所以4一开始是被我认为最不可能的.

但是后来发现确实是4造成的.

根本原因在于:平台方在未去签名的情况下进行签名;等于在APK在拥有key_A的情况下直接签key_B;

签名后的APK_C还保留有APK_B的某类签名信息.所以导致了签名冲突;

解决方式

  1. 我方提供的时候每次都对自己的APK签名进行破坏.或者直接不签名,这个基本不可能,因为未签名的APK是不允许安装到设备上的,没签名就给平台方 请问怎么测试怎么保证版本完整性呢;
  2. 平台方优化签名流程,在签名之前加一步去APK签名,变成 [去除签名]-[签名]-[优化]-[发包]的完整流程;

其实就是两步都可以概括为一步.就是在对APK签名之前 先完全去除老签名;

发表评论

电子邮件地址不会被公开。 必填项已用*标注