我发现我的应用程序用户(通过 Crashlytics/Google Analytics 报告..)似乎发生了很多我无法重现的奇怪情况:
更新我的包后 -类返回的版本代码与返回的版本代码PackageManager
不同BuildConfig.VERSION_CODE
:
int packageManagerVersionCode = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionCode;
boolean versionMismatch = packageManagerVersionCode != BuildConfig.VERSION_CODE;
为了简单起见,我省略了大部分日志记录、官僚主义和封装,但结果是:
packageManagerVersionCode
等于正确的更新版本。BuildConfig.VERSION_CODE
等于应用程序在更新之前的版本。
需要提及的要点:
- 我的应用程序预加载为设备固件上的系统应用程序
- 我的应用程序正在自我更新(它具有所需的权限..)
我目前的假设是因为原APK安装在system/priv-app分区,并且更新不在系统分区,那么更新后有一个时间点原预加载app的进程在某些方面仍然存在。我没有任何方法可以证实这一假设,也没有找到任何官方参考资料是否会发生这种行为。
您可能想知道为什么我关心这个版本代码不匹配,以及我最初是如何产生进行此验证的想法的:这一切都始于我们在新版本中更改's 名称之一后生产用户遇到的崩溃BroadcastReceiver
(出于重构目的..)在清单中注册的。
当再次将接收器重命名为在原始预加载版本中调用的原始名称时,我们停止了崩溃,因此我们怀疑它与此版本代码不匹配有关。
我的问题是:
为什么会发生此版本不匹配?
我能做些什么来防止它发生吗?或者至少要确保原始预加载应用程序中的组件不会处于活动状态?
我对为什么会发生的假设是正确的吗?