更新

时间:2018-01-16 09:28:03

标签: java android android-source

我有一个系统特权的应用程序,其中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上的新版本?

4 个答案:

答案 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”设为