我有一个系统特权的应用程序,其中android:persistent = true in<应用程序&gt ;. 当我更新它(通过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上的新版本?
答案 0 :(得分:2)
在使用系统映像中的应用程序时,您不能使用adb install
,而持久性应用程序必须在系统映像中。您要开发什么版本的Android?在最新版本的android上,我使用以下描述的方法之一。在每次操作之前,您必须至少运行一次adb remount
。
方法1:仅适用于代码更改,不适用于资源更改或清单更改
暂时将其添加到您的Android.mk
:
LOCAL_DEX_PREOPT := false # Do not commit
然后使用mm
等进行构建。
运行适当的推送命令,如下所示:
adb push $OUT/system/priv-app/MyApp/MyApp.apk /system/priv-app/MyApp/
由于该应用程序具有持久性,因此您必须使用以下命令终止该应用程序进程,以使其获取更改:
adb shell ps | grep com.my.app | awk '{print $2}' | xargs adb shell kill
在提交或进行完整构建之前,请不要忘记删除或注释掉对Android.mk
所做的更改。
方法2:除了简单的Java代码更改以外,还需要进行其他操作
使用mm
等执行构建。
运行以下命令:
adb sync
adb shell stop
adb shell start
方法3
为了完整起见,您可以只构建整个树并刷新系统或从结果中应用OTA。
答案 1 :(得分:0)
您可以使用简单的hack并注册以接收" android.intent.action.PACKAGE_ADDED"意图用于设备上安装的每个应用程序。如果添加的应用程序包含您的包ID(表示您的应用已更新),您可以尝试强制它完成并等待" persist"将其作为一个新过程重新午餐的机制。
请注意,我一直在多个平台上使用持久性应用程序,并且从未见过您所描述的行为(如果您可以提供正在使用的平台,可能会有所帮助)。
答案 2 :(得分:0)
找到了解决该问题的方法。如果新版本更改其进程名称,则更新成功
答案 3 :(得分:0)
<application
android:name=".xyzApp"
android:allowBackup="true"
android:persistent="false">
在AndriodManifest.xml中将persistant =“ false”设为