应用程序更新后BuildConfig.VERSION_CODE和PackageManager.getPackageInfo()之间不匹配

时间:2016-04-01 12:21:13

标签: android android-package-managers android-install-apk android-broadcastreceiver android-firmware

我发现一个奇怪的情况似乎发生在我的应用程序用户身上(通过Crashlytics / Google Analytics报告..),我无法重现:

我的软件包更新后

- BuildConfig.VERSION_CODE类返回的版本代码与int packageManagerVersionCode = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0).versionCode; boolean versionMismatch = packageManagerVersionCode != BuildConfig.VERSION_CODE; 返回的版本代码不同:

packageManagerVersionCode

为了简单起见,我省去了大部分日志记录,官僚作风和封装,但结果是:

  • BuildConfig.VERSION_CODE 等于正确的更新版本
  • BroadcastReceiver 等于应用在更新前的版本

需要提及的重点:

  • 我的应用程序已预先加载为设备固件上的系统应用程序
  • 我的应用程序正在自我更新(它具有所需的权限..)

我的假设目前是因为原来的APK安装在system / priv-app分区中,并且更新不在系统分区上,那么更新后的某个时间点就是原来的pre进程在某些方面,负载的应用程序仍然存在。我没有任何办法证实这一假设,也没有找到任何官方的参考,无论这种行为是否会发生。

你可能想知道我为什么要关心这个版本代码不匹配,以及我最初是如何做到这个验证的:我们在更新了新版本之后用生产用户开始crash we were having在Manifest中注册的 IColumn column = output.Schema.FirstOrDefault(col => col.Type != typeof(string)); if (column != null) { throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", column.Name, column.Type.Name)); } XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Auto;//.Fragment; XmlReader r = XmlReader.Create(input.BaseStream, settings); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(r); //xmlDocument.LoadXml("<root/>"); //xmlDocument.DocumentElement.CreateNavigator().AppendChild(r); //xmlDocument.Load(input.BaseStream); XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable); if (this.namespaces != null) { foreach (Match nsdef in xmlns.Matches(this.namespaces)) { string prefix = nsdef.Groups[1].Value; string uri = nsdef.Groups[3].Value; nsmgr.AddNamespace(prefix, uri); } } foreach (XmlNode xmlNode in xmlDocument.DocumentElement.SelectNodes(this.rowPath, nsmgr)) { foreach (IColumn col in output.Schema) { var explicitColumnMapping = this.columnPaths.FirstOrDefault(columnPath => columnPath.Value == col.Name); XmlNode xml = xmlNode.SelectSingleNode(explicitColumnMapping.Key ?? col.Name, nsmgr); output.Set(explicitColumnMapping.Value ?? col.Name, xml == null ? null : xml.InnerXml); } yield return output.AsReadOnly(); } 的名称(来自重构目的......)。

当我再次将接收器重命名为原始预加载版本中调用的原始名称时,我们停止了崩溃,因此我们怀疑它与此版本代码不匹配有关。

我的问题是:

  • 为什么会出现此版本不匹配的情况?

  • 我能做些什么来防止它发生吗?或者至少确保原始预装应用程序中的组件不会处于活动状态?

  • 我对其发生原因的假设是正确的吗?

0 个答案:

没有答案