【发布时间】:2016-03-30 17:35:38
【问题描述】:
我正在开发一个系统应用程序,它通过下载一个 apk 并使用 PackageManager 的 installPackage() 方法安装它来更新它。
我收到以下异常:
Fatal Exception: java.lang.IllegalArgumentException: Component class com.myapp.package.receivers.SomeOldReceiver does not exist in com.myapp.package
at android.os.Parcel.readException(Parcel.java:1544)
at android.os.Parcel.readException(Parcel.java:1493)
at android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:3420)
at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:1492)
at com.myapp.package.utils.AndroidUtils.enableDisableComponent(SourceFile:113)
at ...
更新后的 apk 中不存在“SomeOldReceiver”组件。
似乎执行了现有 APK 中的“旧”代码(调用了其应用程序的 onCreate()),试图访问更新后的 APK 中存在的“新”清单,但找不到“旧”接收器(这甚至可能吗?)。
我的应用还监听 PACAKGE_ADDED 和 PACKAGE_REMOVED 意图。
这种崩溃发生在相对较大比例的用户身上。
任何关于为什么会发生此错误以及如何修复它的建议或线索将不胜感激。
【问题讨论】:
-
什么时候得到异常?代码
com.myapp.package.utils.AndroidUtils.enableDisableComponent什么时候运行? -
This crash happens on a relatively large percentage of users.有点让我怀疑这是由于在 installPackage 签名修改和/或平台之间的整个 PackageManager 区域时发生的 API 不兼容。放弃 PackageManager 的想法并返回意图方式可能值得吗? -
你能看到这个崩溃发生在哪个 Android 版本上吗?
-
@Geralt_Encore:是的。它总是来自 android 5.0.2
-
也许缓存(编译)的代码不会自动失效?由于包更新时应用程序正在运行,因此本机映像被锁定并且不会被删除。安装包后,系统会尝试启动它来处理广播,启动旧的原生镜像,显然会捕获异常。
标签: android android-manifest android-install-apk android-broadcastreceiver