Mengapa aplikasi Android kembali ke versi sebelumnya setelah perangkat mati?

11

Mengamati perilaku yang sangat aneh ini dengan aplikasi Android. Skenario perkiraan:

  1. Versi A diinstal pada perangkat
  2. Aplikasi berfungsi dengan baik
  3. Versi B diinstal pada perangkat (B> A)
  4. Aplikasi berfungsi dengan baik
  5. Perangkat mati karena baterai habis
  6. Perangkat dihidupkan
  7. Versi A dari aplikasi berjalan pada perangkat lagi

Informasi tambahan:

  • Aplikasi tidak didistribusikan melalui Google Play, tetapi diinstal di tempat melalui koneksi USB (CATATAN: aplikasi berjalan dalam produksi; itu tidak diinstal melalui AndroidStudio).
  • Kios
  • Android 5.1 (API 22)

Saya kira saya punya dua pertanyaan:

  • Mengapa perangkat ini cache versi APK yang lebih lama (dan di mana ia menyimpannya)?
  • Dalam keadaan apa aplikasi dapat memutar kembali ke versi sebelumnya seperti itu?

Edit (informasi lebih lanjut):

  • Sepertinya setelah APK diputar kembali, aplikasi kehilangan beberapa izin (bahkan mungkin semua). Fungsi yang berfungsi sebelum roll-back berhenti bekerja karena SecurityException dilempar dari API Android. Ini terjadi meskipun versi Android ini belum memiliki izin runtime!
  • Setelah browsing filesystem tablet, saya memang melihat APK beberapa aplikasi yang berada di bawah jalur yang sama: /data/app/com.myapp-2/base.apk, /data/app/com.myapp-3/base.apk, dll

Hipotesis saya saat ini adalah bahwa pengurasan baterai menyebabkan tablet "mengatur ulang" keadaannya (misalnya, jam juga disetel ulang), dan ketika diaktifkan kembali, ini membingungkan antara APK aplikasi dan memuat yang salah.

Namun, saya tidak tahu mengapa itu melakukan itu, atau bagaimana mencegah perilaku ini.

Vasiliy
sumber
Saya menghadapi perilaku ini juga. mungkin ini terjadi karena menjalankan instan karena membagi apk dan memulai ulang perangkat memecah proses dan kembalikan ke versi sebelumnya.
touhid udoy
Apakah Anda menggunakan berbagai pengguna di perangkat ini? Mungkin sesi tamu ke satu?
tynn
Ini bisa spesifik perangkat (pengaturan cache default). Sudahkah Anda menguji pada perangkat lain?
Taslim Oseni
Apakah Anda mengujinya di emulator android?
Squti
@TaslimOseni, ada satu model spesifik tablet yang digunakan untuk penyebaran di lapangan. Selain itu, itu bukan sesuatu yang mudah direproduksi. Kami melihatnya sekali saja di lab.
Vasiliy

Jawaban:

2

Jika Anda menggunakan Android Studio 3.5+, maka alih-alih lari instan, Anda cenderung menggunakan Terapkan Perubahan.

Ini memiliki cara pengiriman perubahan yang berbeda ke perangkat, tanpa menulis ulang apk, jadi masuk akal bahwa setelah reboot, apk yang akan Anda jalankan jika Anda menjalankan aplikasi secara langsung di perangkat, tidak ada hubungannya dengan yang satu yang sudah berjalan sebelumnya

Menerapkan perubahan

Jalankan Instan dan buatlah kembali arsitektur dan implementasikan dari bawah ke atas suatu pendekatan yang lebih praktis di Android Studio 3.5 yang disebut Terapkan Perubahan. Terapkan Perubahan menggunakan API khusus platform dari Android Oreo dan lebih tinggi untuk memastikan perilaku yang andal dan konsisten; tidak seperti Instant Run, Terapkan Perubahan tidak mengubah APK Anda.

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

Carlos Robles
sumber
Masalah ini terjadi dalam produksi dan aplikasi tidak diinstal ke perangkat melalui AndroidStudio. Apa hubungannya menjalankan instan atau menerapkan perubahan dengan itu?
Vasiliy
oh, maaf, saya berasumsi begitu karena Anda menyebutkan "Aplikasi tidak didistribusikan melalui Google Play, tetapi diinstal di tempat melalui koneksi USB" jadi saya secara otomatis memikirkan Android Studio. Setelah pembaruan Anda jelas. Saya akan berpikir sedikit lebih ...
Carlos Robles
1

Ini daftar paket yang diinstal pengguna:

adb shell cmd package help

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

Dan kemudian sepenuhnya uninstall sebelum menginstal ulang:

adb uninstall com.myapp

Dengan menjalankan instan dan tidak menerapkan APK patch (lihat pmoutput bantuan), ini mungkin menjalankan APK basis. Ini tidak mengembalikan apa pun, tetapi kemungkinan APK yang satu tanpa APK lainnya kelebihan beban (Android Studio mungkin mengotomatiskan aplikasi hot-patch, tetapi saat boot mungkin ini tidak terjadi). Tidak menggunakan jalankan instan menghapus pembaruan patch ini; dan ketika hanya ada satu APK, tidak ada lagi yang harus dijalankan.

Martin Zeitler
sumber
3
Maaf, jangan lihat bagaimana ini menjawab pertanyaan saya. Saya juga bisa menghapus file-file ini secara manual melalui ADB, tetapi, pada titik ini, saya ingin memahami mengapa ini terjadi.
Vasiliy
@Vasiliy mungkin karena Dalvik VM menangani patch run instan berbeda. Pertanyaan sebenarnya adalah, mengapa bahkan ada dua contoh berbeda dari hal yang seharusnya sama dalam versi yang berbeda?
Martin Zeitler
Saya tidak yakin apa hubungannya dengan semua ini. APK tidak diinstal melalui AndroidStudio. Seperti yang Anda katakan, salah satu pertanyaannya adalah "mengapa ada beberapa contoh APK untuk aplikasi yang sama", tetapi saya tidak melihat bagaimana jawaban Anda menjawabnya ...
Vasiliy
@Vasiliy tidak boleh ada beberapa APK untuk memulai - dan jika, maka APK patch harus diterapkan. Ada perbedaan di antara "terapkan perubahan" dan waktu boot.
Martin Zeitler
1

Mengapa perangkat ini cache versi APK yang lebih lama (dan di mana ia menyimpannya)?

Kuncinya di sini adalah dalam kode versi. Ketika Anda menginstal versi baru, pastikan versi baru memiliki kode versi yang berbeda . OS Android menggunakan kode versi untuk membedakan antara berbagai versi APK yang sama sehingga, ini akan berhasil.

Tidak terlalu jelas mengapa rollback ini terjadi. Ini jelas merupakan masalah khusus perangkat yang aneh, namun demikian, banyak faktor yang dapat bertanggung jawab termasuk penginstal default perangkat, pengaturan penyimpanan / cache, memori perangkat, virus, dll.


Saya harap ini membantu. Selamat coding!

Taslim Oseni
sumber
1
Kami masih belum menemukan masalah, tetapi karena jawaban Anda adalah satu-satunya yang bisa, secara teoritis, terkait, hadiahnya adalah milik Anda!
Vasiliy