Pourquoi l'application Android revient-elle à une version précédente après l'arrêt de l'appareil?

11

Observé ce comportement très étrange avec l'application Android. Scénario approximatif:

  1. Version A installée sur l'appareil
  2. L'application fonctionne bien
  3. Version B installée sur l'appareil (B> A)
  4. L'application fonctionne bien
  5. L'appareil s'arrête en raison de la décharge de la batterie
  6. Appareil allumé
  7. La version A de l'application s'exécute à nouveau sur l'appareil

Information additionnelle:

  • L'application n'est pas distribuée via Google Play, mais installée sur site via une connexion USB (REMARQUE: l'application s'exécute en production; elle n'est pas installée via AndroidStudio).
  • Kiosque
  • Android 5.1 (API 22)

Je suppose que j'ai deux questions:

  • Pourquoi l'appareil a mis en cache l'ancienne version de l'APK (et où l'a-t-il mis en cache)?
  • Dans quelles circonstances les applications peuvent-elles revenir à des versions précédentes comme ça?

Modifier (plus d'informations):

  • Il semble qu'après la restauration de l'APK, l'application perd certaines autorisations (peut-être même toutes). Fonctionnalité qui fonctionnait avant que la restauration cesse de fonctionner en raison de la suppression de SecurityException à partir des API d'Android. Cela se produit même si cette version d'Android n'a pas encore d'autorisations d'exécution!
  • Après avoir parcouru le système de fichiers de la tablette, je vois bien les APK de plusieurs applications résidant dans des chemins similaires: /data/app/com.myapp-2/base.apk, /data/app/com.myapp-3/base.apk, etc.

Mon hypothèse actuelle est que la décharge de la batterie amène la tablette à "réinitialiser" son état (par exemple, l'horloge est également réinitialisée), et lorsqu'elle est à nouveau alimentée, elle confond entre les fichiers APK de l'application et charge le mauvais.

Cependant, je n'ai aucune idée pourquoi ferait-il cela, ou comment empêcher ce comportement.

Vasiliy
la source
J'ai également fait face à ce comportement. cela se produit peut-être en raison de l'exécution instantanée car il divise l'apk et le redémarrage du périphérique interrompt le processus et revient à la version précédente.
touhid udoy
Utilisez-vous différents utilisateurs sur ces appareils? Peut-être une séance d'invité à une?
tynn
Cela peut être spécifique à l'appareil (paramètres de cache par défaut). Avez-vous testé sur d'autres appareils?
Taslim Oseni
L'avez-vous testé sur l'émulateur Android?
Squti
@TaslimOseni, il existe un modèle spécifique de tablette utilisé pour le déploiement sur le terrain. De plus, ce n'est pas quelque chose qui se reproduit facilement. Nous l'avons vu une seule fois au laboratoire.
Vasiliy

Réponses:

2

Si vous utilisez Android Studio 3.5+, au lieu d'une exécution instantanée, vous utilisez probablement Appliquer les modifications.

Cela a une façon différente d'envoyer les modifications à l'appareil, sans réécrire l'apk, donc il est très logique qu'après le redémarrage, l'apk que vous exécuterez si vous exécutez votre application directement sur l'appareil, n'a rien à voir avec celui qui courait avant

Appliquer les modifications

Exécuter instantanément et ré-architecturé et implémenté à partir de zéro une approche plus pratique dans Android Studio 3.5 appelée Appliquer les modifications. Apply Changes utilise des API spécifiques à la plate-forme d'Android Oreo et versions ultérieures pour garantir un comportement fiable et cohérent; contrairement à Instant Run, Appliquer les modifications ne modifie pas votre APK.

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

Carlos Robles
la source
Ce problème se produit en production et l'application n'est pas installée sur les appareils via AndroidStudio. Qu'est-ce que l'exécution instantanée ou les changements d'application ont à voir avec cela?
Vasiliy
oh, désolé, je l'ai supposé puisque vous avez mentionné "L'application n'est pas distribuée via Google Play, mais installée sur site via une connexion USB", j'ai donc pensé automatiquement à Android Studio. Après votre mise à jour, c'est clair. J'y penserai un peu plus ...
Carlos Robles
1

Cela répertorie les packages installés par l'utilisateur:

adb shell cmd package help

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

Et puis désinstallez complètement avant de réinstaller:

adb uninstall com.myapp

Avec une exécution instantanée et sans appliquer le correctif APK (voir la pmsortie d'aide), cela peut exécuter le fichier APK de base. Cela ne supprime rien, mais il est probable que l'un APK sans l'autre APK soit surchargé (Android Studio peut automatiser l'application du hot-patch, mais au démarrage, cela peut ne pas être le cas). Ne pas utiliser l'exécution instantanée supprime ces APK de mise à jour de correctifs et lorsqu'il n'y a qu'un seul APK, il n'y a rien d'autre à exécuter.

Martin Zeitler
la source
3
Désolé, je ne vois pas comment cela répond à mes questions. Je peux également aller effacer manuellement ces fichiers via ADB, mais, à ce stade, je veux comprendre pourquoi cela se produit.
Vasiliy
@Vasiliy probablement parce que Dalvik VM gère différemment le correctif APK instantané. La véritable question est de savoir pourquoi il existe même deux instances différentes de la même chose dans différentes versions?
Martin Zeitler
Je ne sais pas ce que la course instantanée a à voir avec tout cela. Les fichiers APK n'ont pas été installés via AndroidStudio. Comme vous le dites, l'une des questions est "pourquoi il existe plusieurs instances d'APK pour la même application", mais je ne vois pas comment votre réponse y répond ...
Vasiliy
@Vasiliy il ne devrait pas y avoir plusieurs APK pour commencer - et si, alors le patch APK doit être appliqué. Il existe une différence entre «appliquer les modifications» et l'heure de démarrage.
Martin Zeitler
1

Pourquoi l'appareil a mis en cache l'ancienne version de l'APK (et où l'a-t-il mis en cache)?

L'astuce est ici dans le code de version. Lorsque vous installez une nouvelle version, assurez-vous que la nouvelle version a un code de version différent . Le système d'exploitation Android utilise des codes de version pour différencier les différentes versions du même APK, donc cela fonctionnerait.

On ne sait pas vraiment pourquoi ce retour en arrière se produit. C'est évidemment un étrange problème spécifique à l'appareil, mais néanmoins, une tonne de facteurs pourraient être responsables, notamment l'installateur par défaut de l'appareil, les paramètres de stockage / cache, la mémoire de l'appareil, les virus, etc.


J'espère que ça aide. Joyeux codage!

Taslim Oseni
la source
1
Nous n'avons toujours pas compris le problème, mais puisque votre réponse est la seule qui pourrait, théoriquement, être liée, la prime vous appartient!
Vasiliy