android:persistent = true的系统应用程序在更新后崩溃

use*_*604 14 java android android-source

我在<application>中有一个系统特权的应用程序,android:persistent = true.当我更新它(通过ADB或任何其他方式)时,它无法正确更新并崩溃.

我所看到的是系统在当前(系统安装)版本仍在运行时安装更新.在更新期间,系统不会停止该过程(尝试停止和失败,或者根本不尝试).更新完成后,应用程序似乎进行了"重启" - 我看到组件正在初始化,例如正在调用Application :: onCreate().但这发生在与更新之前相同的过程中!

因此(在启动应用程序的某些活动时),应用程序崩溃时出现"怪异"异常,例如未能将类强制转换为自身:

引起:java.lang.ClassCastException:com.XX.YY.ZZ.ClassName无法强制转换为com.XX.YY.ZZ.ClassName

在调查时,我看到更新后使用的ClassLoader没有引用更新的APK的路径,但仍然指向原始版本的路径:

预期的类加载器:

dalvik.system.PathClassLoader [DexPathList [[zip file"/data/app/com.app.package-1/base.apk"],nativeLibraryDirectories=[/data/app/com.app.package-1/lib/x86_64 ,/ data/app/com.app.package-1/base.apk!/ lib/x86_64,/ system/lib64,/ vendor/lib64]]]

实际的类加载器:

dalvik.system.PathClassLoader [DexPathList [[zip file"/system/priv-app/Appname.apk"],nativeLibraryDirectories=[/system/lib64/Start,/system/priv-app/Appname.apk!/lib/x86_64 ,/ system/lib64,/ vendor/lib64,/ system/lib64,/ vendor/lib64]]]

我假设这是因为在更新期间没有重新启动进程.

有没有办法用persistent = true更新应用程序?或者这是一种预期的行为,这种应用无法通过常规更新程序更新(例如在Google Play上发布更新的版本)?

Dav*_*Lev 0

您可以使用简单的 hack 并注册来接收设备上安装的每个应用程序的“android.intent.action.PACKAGE_ADDED”意图。如果添加的应用程序具有您的程序包 ID(表明您的应用程序已更新),您可以尝试强制它完成并等待“持久”机制将其重新启动为新进程。

请注意,我一直在多个平台上使用持久性应用程序,并且从未见过您所描述的行为(如果您可以提供您正在使用的平台,这可能会有所帮助)。