Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android系统应用程序:persistent=true更新后崩溃_Java_Android_Android Source - Fatal编程技术网

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

Java android系统应用程序:persistent=true更新后崩溃,java,android,android-source,Java,Android,Android Source,我在中有一个安卓系统特权应用程序:persistent=true。 当我更新它时(通过ADB或任何其他方式),它无法正确更新并崩溃 我看到的是,系统在当前(系统安装的)版本仍在运行时安装更新。在更新过程中,系统不会停止进程(尝试停止并失败或根本不尝试)。更新完成后,应用程序似乎经历了一次“重启”——我看到正在初始化组件,例如正在调用Application::onCreate()。但这是在更新之前的相同过程中发生的 因此(在启动应用程序的某些活动时),应用程序会崩溃,出现“奇怪”的异常,例如无法将

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

我看到的是,系统在当前(系统安装的)版本仍在运行时安装更新。在更新过程中,系统不会停止进程(尝试停止并失败或根本不尝试)。更新完成后,应用程序似乎经历了一次“重启”——我看到正在初始化组件,例如正在调用Application::onCreate()。但这是在更新之前的相同过程中发生的

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

原因:java.lang.ClassCastException:com.XX.YY.ZZ.ClassName无法转换为com.XX.YY.ZZ.ClassName

在调查过程中,我发现更新后使用的类加载器并没有引用更新后APK的路径,而是指向原始版本的路径:

预期的类加载器:

dalvik.system.PathClassLoader[DexPathList[[zip文件”/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文件”/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上发布更新版本)?

您可以使用简单的破解和注册来接收“添加的安卓.意图.行动.程序包”设备上安装的每个应用程序的目的。如果添加的应用程序具有您的包ID(表示您的应用程序已更新),您可以尝试强制其完成,并等待“持久化”机制将其作为新进程重新打包


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

在处理系统映像中的应用程序时,您不能使用
adb install
,持久化的应用程序必须位于系统映像中。你开发的安卓是什么版本的?在android的最新版本上,我使用下面描述的方法之一。每次安装之前,必须至少运行一次adb重新安装

方法1:仅适用于代码更改,不适用于资源更改或清单更改

将此临时添加到您的
Android.mk

LOCAL_DEX_PREOPT := false # Do not commit
然后使用
mm
或类似工具执行构建

按如下方式运行相应的push命令:

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。

找到了解决此问题的方法。如果新版本更改其进程名称,则更新成功
  <application
        android:name=".xyzApp"
        android:allowBackup="true"
    android:persistent="false">

在AndriodManifest.xml中Make persistent=“false”

如果在应用程序更新后重新启动设备,它是否可以从新路径正常工作?是。重新启动设备可解决此问题。问题是,在设备重新启动之前,应用程序会崩溃,并在进程重新启动后一直在循环中崩溃。另一个问题是:崩溃后,应用程序是否使用相同的进程id重新启动?您看到这个技巧了吗?对于开发过程中的命令行更新,您应该首先执行
adb shell停止
,然后执行
adb shell启动
。对于最终用户更新,您可能需要将应用程序拆分为一个真正的系统组件,该组件在Android未运行时通过恢复系统应用的系统OTA机制进行更新,以及一个更日常的应用程序组件,您可以通过play store进行更新。我可以检测升级情况,而无需使用添加的Android.intent.action.PACKAGE\u。“强迫它完成”(例如,杀死进程或者你是指其他什么?)没有帮助,因为新进程使用了相同的“错误”类加载器。2.我怀疑,可能涉及到MultiDex库。您是否有成功更新使用multidex编译的持久应用程序的经验?没有。我们开发的应用程序都不是使用multidex编译的。问题源于用户手机上的应用程序更新(来自Google Play)。你的建议适用于开发者的行为,而不是最终用户。这是行不通的。在更新过程中,系统不会停止该过程