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