设备关闭后,为什么Android应用会回滚到以前的版本?


11

观察到Android应用程序的这种非常奇怪的行为。大概情况:

  1. 设备上安装的版本A
  2. 申请工作还可以
  3. 设备上安装的版本B(B> A)
  4. 申请工作还可以
  5. 设备因电池电量耗尽而关闭
  6. 设备已开启
  7. 应用程序的版本A再次在设备上运行

附加信息:

  • 该应用程序不是通过Google Play分发的,而是通过USB连接在本地安装的(注意:该应用程序在生产环境中运行;它不是通过AndroidStudio安装的)。
  • Android 5.1(API 22)

我想我有两个问题:

  • 为什么设备缓存了旧版本的APK(以及它在哪里缓存)?
  • 在什么情况下应用程序可以回滚到以前的版本?

编辑(更多信息):

  • 好像在APK回滚后,应用程序失去了一些权限(甚至是所有权限)。由于从Android的API抛出SecurityException,所以回滚停止工作之前起作用的功能。即使此版本的Android还没有运行时权限,也会发生这种情况!
  • 浏览平板电脑的文件系统之后,我确实看到几个应用程序的居住的APK在类似的路径:/data/app/com.myapp-2/base.apk/data/app/com.myapp-3/base.apk,等。

我目前的假设是电池耗尽会导致平板电脑“重置”其状态(例如,时钟也会重置),并且在再次通电时,它会混淆应用的APK之间并加载错误的APK。

但是,我不知道为什么会这样做,或者如何防止这种行为。


我也面对这种行为。可能是由于即时运行造成的,因为它会分裂apk并重新启动设备会中断该过程并回滚到以前的版本。
touhid udoy

您在这些设备上使用其他用户吗?可能是一个访客会话?
tynn

这可能是特定于设备的(默认缓存设置)。您是否在其他设备上进行过测试?
塔斯林·奥塞尼

您是否在android模拟器上进行了测试?
Squti

@TaslimOseni,有一种特定型号的平板电脑用于现场部署。另外,它不是容易复制的东西。我们在实验室里只见过一次。
Vasiliy

Answers:


2

如果您使用的是Android Studio 3.5+,则可能会使用“应用更改”,而不是即时运行。

这是将更改传送到设备的另一种方式,而无需重写apk,因此从某种意义上说,重新启动后,如果直接在设备上执行应用程序,则将运行的apk与那无关。那之前

应用更改

即时运行并从头开始重新架构和实施,这是Android Studio 3.5中一种更实用的方法,称为“应用更改”。Apply Changes使用Android Oreo及更高版本的特定于平台的API,以确保可靠和一致的行为;与即时运行不同,“应用更改”不会修改您的APK。

https://android-developers.googleblog.com/2019/08/android-studio-35-project-marble-goes.html


此问题发生在生产环境中,并且未通过AndroidStudio将应用安装到设备上。即时运行或应用更改与它有什么关系?
Vasiliy

哦,对不起,我想是因为您提到“该应用程序不是通过Google Play分发,而是通过USB连接在本地安装”,所以我自动想到了Android Studio。更新之后就很清楚了。我
卡洛斯·罗伯斯

1

这列出了用户安装的软件包:

adb shell cmd package help

pm list packages -f -U -3 --show-versioncode

然后在重新安装之前完全卸载:

adb uninstall com.myapp

在即时运行且未应用补丁APK的情况下(请参阅pm帮助输出),这可能会运行基本APK。这不会回滚任何内容,但是很可能一个APK没有另一个APK超载(Android Studio可能会自动执行热补丁的应用程序,但在启动时可能并非如此)。不使用即时运行会删除这些补丁更新APK;当只有一个APK时,就没有其他可运行的了。


3
抱歉,看不到这如何回答我的任何问题。我也可以通过ADB手动删除这些文件,但是,在这一点上,我想了解为什么会发生这种情况。
Vasiliy

@Vasiliy可能是因为Dalvik VM处理即时运行补丁APK的方式有所不同。实际的问题是,为什么在不同的版本中甚至会有两个假设相同的实例的不同实例?
马丁·泽特勒

我不确定这一切与即时运行有关。未通过AndroidStudio安装APK。正如您所说,问题之一是“为什么同一个应用程序会有多个APK实例”,但我看不出您的答案如何解决……
Vasiliy

@Vasiliy开头不应有多个APK-如果是,则必须应用补丁APK。“应用更改”和启动时间之间存在差异。
马丁·泽特勒

1

为什么设备缓存了旧版本的APK(以及它在哪里缓存)?

这里的窍门在版本代码中。安装新版本时,请确保新版本具有不同的版本代码。Android操作系统使用版本代码来区分同一APK的不同版本,因此可以使用。

目前尚不清楚为什么会发生这种回滚。这显然是一个奇怪的特定于设备的问题,但是尽管如此,仍然可能有很多因素负责,包括设备的默认安装程序,存储/缓存设置,设备内存,病毒等。


我希望这有帮助。编码愉快!


1
我们仍然没有找到问题所在,但是由于您的答案是唯一可以从理论上与之相关的答案,因此赏金属于您!
Vasiliy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.