Почему приложение 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 приложение теряет некоторые разрешения (может быть, даже все). Функциональность, которая работала до прекращения отката из-за исключения SecurityException из API-интерфейсов Android. Это происходит, даже если эта версия Android еще не имеет прав доступа!
  • После просмотра файловой системы планшета, я действительно вижу APK - приложений несколько проживающего в сходных путях: /data/app/com.myapp-2/base.apk, /data/app/com.myapp-3/base.apkи т.д.

Моя текущая гипотеза заключается в том, что разряд батареи приводит к тому, что планшет «сбрасывает» свое состояние (например, часы также сбрасываются), а при повторном включении он путает APK-файлы приложения и загружает неправильный.

Тем не менее, я понятия не имею, почему он это делает, или как предотвратить такое поведение.

Василий
источник
Я столкнулся с таким поведением также. возможно это происходит из-за мгновенного запуска, так как он разбивает apk, а перезапускающее устройство прерывает процесс и откатывается до предыдущей версии.
Тоид Удой
Вы используете разных пользователей на этих устройствах? Может быть, гостевая сессия для одного?
Tynn
Это может зависеть от устройства (настройки кэша по умолчанию). Вы тестировали на других устройствах?
Таслим Осени
Вы тестировали его на эмуляторе Android?
Squti
@TaslimOseni, есть одна конкретная модель планшета, используемая для развертывания в полевых условиях. Кроме того, это не то, что легко воспроизводится. Мы видели это только один раз в лаборатории.
Василий

Ответы:

2

Если вы используете Android Studio 3.5+, то вместо мгновенного запуска вы, вероятно, используете Apply Changes.

Это другой способ доставки изменений на устройство, без переписывания apk, поэтому имейте большой смысл, что после перезагрузки apk, который вы запустите, если вы запустите приложение прямо на устройстве, не имеет ничего общего с это было раньше

Применять изменения

Instant Run, реорганизовал и внедрил с нуля более практичный подход в Android Studio 3.5 под названием Apply Changes. Apply Changes использует специфичные для платформы API от Android Oreo и выше для обеспечения надежного и согласованного поведения; в отличие от Instant Run, Apply Changes не изменяет ваш APK.

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

Карлос Роблес
источник
Эта проблема возникает в производстве, и приложение не устанавливается на устройства через AndroidStudio. При чем тут мгновенный запуск или применение изменений?
Василий
о, извините, я так и предполагал, так как вы упомянули «Приложение не распространяется через 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, вероятно, потому что Dalvik VM обрабатывает патч APK для мгновенного запуска по-другому. Фактический вопрос заключается в том, почему даже есть два разных случая предположительно одного и того же в разных версиях?
Мартин
Я не уверен, что моментальный бег связан со всем этим. APK не были установлены через AndroidStudio. Как вы говорите, один из вопросов - «почему существует несколько экземпляров APK для одного и того же приложения», но я не понимаю, как на это отвечает ваш ответ ...
Василий
@Vasiliy не должно быть нескольких APK для начала - и если, тогда должен быть применен патч APK. Существует разница между «применить изменения» и временем загрузки.
Мартин
1

Почему устройство кэшировало старую версию APK (и где оно кешировало ее)?

Хитрость здесь в коде версии. При установке новой версии убедитесь, что новая версия имеет другой код версии . Android OS использует коды версий, чтобы различать разные версии одного и того же APK, так что это будет работать.

Не совсем понятно, почему происходит этот откат. Это, очевидно, странная проблема, специфичная для конкретного устройства, но, тем не менее, за это может ответить множество факторов, в том числе установщик устройства по умолчанию, настройки хранения / кэша, память устройства, вирусы и т. Д.


Надеюсь, это поможет. Веселого кодирования!

Таслим Осени
источник
1
Мы до сих пор не выяснили проблему, но поскольку ваш ответ - единственный, который теоретически может быть связан, щедрость - ваша!
Василий