Dlaczego aplikacja na Androida przywraca poprzednią wersję po wyłączeniu urządzenia?

11

Zaobserwowałem to bardzo dziwne zachowanie w aplikacji na Androida. Przybliżony scenariusz:

  1. Wersja A zainstalowana na urządzeniu
  2. Aplikacja działa dobrze
  3. Wersja B zainstalowana na urządzeniu (B> A)
  4. Aplikacja działa dobrze
  5. Urządzenie wyłącza się z powodu rozładowania baterii
  6. Urządzenie włączone
  7. Wersja A aplikacji działa ponownie na urządzeniu

Dodatkowe informacje:

  • Aplikacja nie jest dystrybuowana za pośrednictwem Google Play, ale jest instalowana lokalnie przez połączenie USB (UWAGA: aplikacja działa w trybie produkcyjnym; nie jest instalowana przez AndroidStudio).
  • Kiosk
  • Android 5.1 (API 22)

Chyba mam dwa pytania:

  • Dlaczego urządzenie buforowało starszą wersję pliku APK (i gdzie go buforowało)?
  • W jakich okolicznościach aplikacje mogą przywracać poprzednie wersje tego typu?

Edytuj (więcej informacji):

  • Wygląda na to, że po wycofaniu APK aplikacja traci niektóre uprawnienia (może nawet wszystkie). Funkcjonalność, która działała, zanim wycofanie przestało działać z powodu wyłączenia SecurityException z interfejsów API Androida. Dzieje się tak, mimo że ta wersja Androida nie ma jeszcze uprawnień do wykonywania.
  • Po przeglądania plików tabletu, ja rzeczywiście zobaczyć pliki APK kilku aplikacji zamieszkały pod podobnymi ścieżkami: /data/app/com.myapp-2/base.apk, /data/app/com.myapp-3/base.apk, itd.

Moja obecna hipoteza jest taka, że ​​rozładowanie baterii powoduje, że tablet „resetuje” swój stan (na przykład zegar jest również resetowany), a po ponownym włączeniu myli się między pakietami APK aplikacji i ładuje niewłaściwy.

Nie mam jednak pojęcia, dlaczego miałby to zrobić ani jak temu zapobiec.

Wasilij
źródło
Zmierzyłem się również z tym zachowaniem. być może dzieje się tak z powodu natychmiastowego uruchomienia, ponieważ dzieli apk, a ponowne uruchomienie urządzenia przerywa proces i przywraca poprzednią wersję.
touhid udoy
Czy używasz różnych użytkowników na tych urządzeniach? Może sesja gościa do jednego?
tynn
Może to być specyficzne dla urządzenia (domyślne ustawienia pamięci podręcznej). Czy testowałeś na innych urządzeniach?
Taslim Oseni
Czy przetestowałeś to na emulatorze Androida?
Squti
@TaslimOseni, istnieje jeden konkretny model tabletu używany do wdrażania w terenie. Ponadto nie jest to coś, co łatwo się odtwarza. Widzieliśmy to tylko raz w laboratorium.
Vasiliy

Odpowiedzi:

2

Jeśli używasz Androida Studio 3.5+, zamiast natychmiastowego uruchomienia prawdopodobnie korzystasz z Zastosuj zmiany.

Ma to inny sposób wysyłania zmian do urządzenia, bez konieczności ponownego zapisywania pliku APK, więc miej sens, że po ponownym uruchomieniu aplikacja, którą uruchomisz, jeśli uruchomisz aplikację bezpośrednio na urządzeniu, nie ma nic wspólnego z tą aplikacją to działało wcześniej

Zatwierdź zmiany

Natychmiastowe uruchamianie, przeprojektowana i wdrożona od podstaw bardziej praktyczne podejście w Android Studio 3.5 o nazwie Zastosuj zmiany. Zastosuj zmiany wykorzystuje specyficzne dla platformy interfejsy API od Androida Oreo i wyższych, aby zapewnić niezawodne i spójne zachowanie; w przeciwieństwie do Natychmiastowego uruchamiania, Zastosuj zmiany nie modyfikuje twojego APK.

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

Carlos Robles
źródło
Ten problem występuje w środowisku produkcyjnym, a aplikacja nie jest instalowana na urządzeniach za pośrednictwem AndroidStudio. Co mają z tym wspólnego natychmiastowe uruchamianie lub stosowanie zmian?
Vasiliy
och, przepraszam, założyłem, że skoro wspomniałeś „Aplikacja nie jest rozpowszechniana za pośrednictwem Google Play, ale jest instalowana lokalnie przez połączenie USB”, więc automatycznie pomyślałem o Android Studio. Po aktualizacji jest jasne. Pomyślę jeszcze trochę ...
Carlos Robles
1

Zawiera listę pakietów zainstalowanych przez użytkownika:

adb shell cmd package help

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

A następnie całkowicie odinstaluj przed ponowną instalacją:

adb uninstall com.myapp

W przypadku natychmiastowego uruchomienia i niestosowania poprawki APK (patrz dane pmwyjściowe pomocy) może to spowodować uruchomienie podstawowego APK. To nie przywraca niczego, ale prawdopodobnie jeden APK nie jest przeciążony drugim APK (Android Studio może zautomatyzować stosowanie poprawki, ale nie musi tak być podczas uruchamiania). Brak użycia natychmiastowego uruchomienia usuwa te APK aktualizacji aktualizacji; a gdy jest tylko jeden plik APK, nie trzeba nic więcej uruchamiać.

Martin Zeitler
źródło
3
Przepraszamy, nie widzę, jak to odpowiada na którekolwiek z moich pytań. Mogę również przejść i ręcznie usunąć te pliki za pomocą ADB, ale w tym momencie chcę zrozumieć, dlaczego tak się dzieje.
Vasiliy
@ Vasiliy prawdopodobnie dlatego, że Dalvik VM obsługuje APK do natychmiastowego uruchomienia w inny sposób. Właściwe pytanie brzmi: dlaczego istnieją nawet dwa różne przypadki podobno tej samej rzeczy w różnych wersjach?
Martin Zeitler
Nie jestem pewien, co to ma wspólnego z tym wszystkim. Pliki APK nie zostały zainstalowane przez AndroidStudio. Jak mówisz, jedno z pytań brzmi: „dlaczego istnieje wiele wystąpień pakietów APK dla tej samej aplikacji”, ale nie rozumiem, w jaki sposób odpowiedź na nie odpowiada ...
Vasiliy
@ Vasiliy na początku nie powinno być wielu APK - a jeśli tak, to należy zastosować APK z łatką. Istnieje różnica między „stosowaniem zmian” a czasem uruchamiania.
Martin Zeitler,
1

Dlaczego urządzenie buforowało starszą wersję pliku APK (i gdzie go buforowało)?

Sztuką jest tutaj kod wersji. Podczas instalowania nowej wersji upewnij się, że nowa wersja ma inny kod wersji . System operacyjny Android używa kodów wersji do rozróżnienia różnych wersji tego samego pakietu APK, więc to zadziała.

Nie jest do końca jasne, dlaczego tak się dzieje. Jest to oczywiście dziwny problem specyficzny dla urządzenia, ale mimo to może być odpowiedzialnych za wiele czynników, w tym domyślny instalator urządzenia, ustawienia pamięci / pamięci podręcznej, pamięci urządzenia, wirusów itp.


Mam nadzieję, że to pomoże. Wesołego kodowania!

Taslim Oseni
źródło
1
Nadal nie ustaliliśmy problemu, ale ponieważ Twoja odpowiedź jest jedyną, która teoretycznie może być powiązana, nagroda jest twoja!
Vasiliy