デバイスのシャットダウン後にAndroidアプリが以前のバージョンにロールバックするのはなぜですか?


11

Androidアプリケーションでこの非常に奇妙な動作を観察しました。おおよそのシナリオ:

  1. デバイスにインストールされているバージョンA
  2. アプリケーションは問題なく動作します
  3. デバイスにインストールされているバージョンB(B> A)
  4. アプリケーションは問題なく動作します
  5. 電池の消耗によりデバイスがシャットダウンする
  6. デバイスがオンになりました
  7. アプリケーションのバージョンAがデバイスで再度実行されます

追加情報:

  • アプリケーションはGoogle Play経由では配布されませんが、USB接続経由でオンプレミスにインストールされます(注:アプリケーションは本番環境で実行されます。AndroidStudio経由ではインストールされません)。
  • 売店
  • Android 5.1(API 22)

私は2つの質問を持っていると思います:

  • デバイスが古いバージョンの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

これらのデバイスで別のユーザーを使用していますか?たぶん、ゲストセッションを1つに?
-tynn

これはデバイス固有である可能性があります(デフォルトのキャッシュ設定)。他のデバイスでテストしましたか?
Taslim Oseni

Androidエミュレータでテストしましたか?
Squti 2019年

@TaslimOseni、フィールド展開に使用されるタブレットの特定のモデルが1つあります。また、簡単に再現できるものではありません。ラボで一度だけ見ました。
Vasiliy

回答:


2

Android Studio 3.5以降を使用している場合は、即時実行ではなく、変更の適用を使用している可能性があります。

これには、apkを書き換えずにデバイスに変更を送信する別の方法があるため、再起動後、デバイスでアプリを直接実行した場合に実行するapkは、apkとは何の関係もないことを理解してくださいそれは前に実行されていました

変更を適用

インスタントランは、Android Studio 3.5で「変更の適用」と呼ばれる、より実践的なアプローチであるゼロから再構築および実装されています。変更の適用では、Android Oreo以降のプラットフォーム固有のAPIを使用して、信頼性のある一貫した動作を保証します。Instant Runとは異なり、Apply ChangesはAPKを変更しません。

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


この問題は本番環境で発生し、アプリはAndroidStudioを介してデバイスにインストールされません。即時実行または変更の適用はそれとどのような関係がありますか?
Vasiliy

ああ、すみません、「アプリはGoogle Play経由で配布されず、オンプレミスでUSB接続でインストールされる」とおっしゃっていたので、Android Studioについて自動的に考えました。更新後は明らかです。私はもう少し考えます...
Carlos Robles

1

これはユーザーがインストールしたパッケージをリストします:

adb shell cmd package help

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

そして、完全にアンインストールしてから再インストールします。

adb uninstall com.myapp

インスタント実行でパッチAPKを適用しない場合(pmヘルプ出力を参照)、これによりベースAPKが実行される可能性があります。これは何もロールバックしませんが、他の1つのAPKがオーバーロードされていない1つのAPKである可能性があります(Android Studioはホットパッチのアプリケーションを自動化する可能性がありますが、起動時にそうではない場合があります)。Instant Runを使用しないと、これらのパッチ更新APKが削除されます。APKが1つしかない場合、他に実行するものはありません。


3
申し訳ありませんが、これが私の質問にどのように答えるかはわかりません。また、ADBを使用してこれらのファイルを手動で消去することもできますが、この時点で、これが発生する理由を理解したいと思います。
Vasiliy

@Vasiliyは、Dalvik VMがInstant RunパッチAPKを異なる方法で処理しているためと考えられます。実際の問題は、異なるバージョンに同じものと思われる2つの異なるインスタンスがあるのはなぜですか?
Martin

インスタントランがこのすべてとどう関係するのかはわかりません。APKはAndroidStudioからインストールされませんでした。あなたが言うように、質問の1つは「なぜ同じアプリにAPKの複数のインスタンスがあるのか​​」ですが、あなたの答えがそれをどのように答えるかわかりません...
Vasiliy

@Vasiliy初めに複数のAPKがあってはなりません。その場合、パッチAPKを適用する必要があります。「変更を適用」と起動時間には違いがあります。
Martin

1

デバイスが古いバージョンのAPKをキャッシュしたのはなぜですか(どこにキャッシュしたのですか)?

ここでのトリックは、バージョンコードにあります。新しいバージョンをインストールすると、バージョンコードが異なることを確認してください。Android OSはバージョンコードを使用して、同じAPKの異なるバージョンを区別するため、これは機能します。

このロールバックが発生する理由は明確ではありません。これは明らかに奇妙なデバイス固有の問題ですが、それでもなお、デバイスのデフォルトインストーラー、ストレージ/キャッシュ設定、デバイスメモリ、ウイルスなど、多くの要因が原因である可能性があります。


これがお役に立てば幸いです。メリーコーディング!


1
私たちはまだ問題を理解していませんが、あなたの答えは理論的には関連している可能性のある唯一のものなので、報奨金はあなたのものです!
Vasiliy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.