Android 自更新APK时崩溃(组件类不存在)

Android 自更新APK时崩溃(组件类不存在),android,android-manifest,android-install-apk,android-broadcastreceiver,Android,Android Manifest,Android Install Apk,Android Broadcastreceiver,我正在开发一个系统应用程序,它通过下载apk并使用PackageManager的installPackage()方法安装来更新itslef 我得到以下例外情况: Fatal Exception: java.lang.IllegalArgumentException: Component class com.myapp.package.receivers.SomeOldReceiver does not exist in com.myapp.package at androi

我正在开发一个系统应用程序,它通过下载apk并使用PackageManager的
installPackage()
方法安装来更新itslef

我得到以下例外情况:

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&packaku remove意图

这种崩溃发生在相对较大比例的用户身上


如果您能提供任何有关此错误发生的原因以及如何修复的建议或线索,我们将不胜感激。

更新APK的方法多种多样。我不确定您使用的是哪种方法。。我也面临类似的问题。。这是因为应用程序在更新过程中有多个实例。。您可以将应用程序设置为单个实例,也可以确保没有旧实例在运行。我希望这能有所帮助。

: 如果应用程序的清单中不存在给定的组件类名,则对
PackageManager.setComponentEnabledSetting
的调用现在将抛出
IllegalArgumentException


它解释了为什么大部分用户会发生这种崩溃。

对不起,我无法确认这是否有帮助,因为我自己还没有测试过

在调用
installPackage()
之前,您可以通过调用来尝试禁用“SomeOldReceiver”(或安装新软件包可能触发的任何其他组件)


从逻辑上讲,这可能需要您生成应用程序的临时版本(在
installPackage()
之前添加了
setComponentEnabledSetting()
调用,并且其清单中仍应包含“SomeOldReceiver”)以首先更新旧版本。然后,您可以在删除“SomeOldReceiver”的情况下将此版本更新为实际更新版本

你什么时候有例外?代码
com.myapp.package.utils.AndroidUtils.enableDisableComponent
何时运行?
此崩溃发生在相对较大比例的用户身上。
有点让我怀疑这是由于修改installPackage签名和/或平台之间的整个PackageManager区域时发生的API不兼容造成的。放弃PackageManager的想法,回到原意的方式也许是值得的?你能看到这次崩溃发生在哪个Android版本上吗?@Geralt_Encore:是的。它总是来自android 5.0.2可能缓存(编译)的代码不会自动失效吗?由于程序包更新时应用程序正在运行,因此本机映像将被锁定且不会被删除。安装软件包后,系统会尝试启动该软件包以处理广播,启动旧的本机映像,显然会捕获一个异常。如何使应用程序作为单个实例运行?在清单集中android:launchMode=“singleInstance”对于您的主要活动,我不认为为活动设置启动模式会影响应用程序多个实例而不是单个实例,它只会影响活动。不管是哪种方式——就说话的方式而言:我的应用程序启动并自我更新,根本不需要启动任何活动