バックグラウンドでスケジュールされたジョブとアラームをキャンセルする1回限りの権限

Aug 21 2020

Android SDKを開発し、Android 11 Betaをテストしているときに、まだ報告されていないように見える問題を発見しました。

Android 11では、場所、マイク、カメラの権限に新しい1回限りの権限が導入されました。このオプションを使用すると、ユーザーがアプリケーションを離れるとすぐに、アクセス許可が取り消されます(詳細については、こちらを参照してください)。

問題は、アプリがフォアグラウンドでなくなった短い時間の後(アプリを強制終了する必要はなく、最小化するだけで十分です)、アプリが強制されたかのように、今後スケジュールされるすべてのアラームまたはジョブが削除されることです。殺された。これは、このレベルの権限でのみ発生します。他のレベルを拒否または提供すると、以前にスケジュールされたアラームまたはジョブが期待どおりに保持されます。これは、ベータ3ビルドで、RPB3.200720.005ビルド番号のPixel2エミュレーターで再現されています。このリポジトリでは、バグを再現するためのサンプルアプリを見つけることができます。

この単一のアクティビティアプリは、次の5分以内にアラームが鳴るようにスケジュールし、5〜6分以内にジョブをトリガーするようにスケジュールします。画面には3つのボタンがあり、それぞれが対応する許可要求をトリガーします。JobServiceクラスとBroadcastReceiverクラスは、トリガーされたことのみをログに記録します。この状況は、次の手順で再現できます。

  1. アプリが起動されるたびに、両方を実行することが可能になるadb shell dumpsys alarm | grep com.example.permissions.appadb shell dumpsys jobscheduler | grep com.example.permissions.appアラームと仕事の両方が予定されていることを確認します。
  2. いずれかのボタンをクリックして、1回限りのアクセス許可レベルを付与します。
  3. アプリを最小化します(ホーム画面に移動するか、他のアプリを開くことができます)。
  4. 約1分後、adb shell dumpsys alarm | grep com.example.permissions.appとの両方を実行しadb shell dumpsys jobscheduler | grep com.example.permissions.appます。アラームとジョブは表示されなくなります。
  5. ジョブとアラームの両方について元のスケジュールされた時刻を待機すると(システム遅延に寛容になります)、それらがトリガーされないことが示されます。

同様の状況に遭遇したことはありますか?私たちの勘は、1回限りのアクセス許可を取り消すために、アプリプロセスが何らかの方法で強制終了され、これらの副作用が発生していることです。また、Android Issue Trackerで問題を送信しました。Googleが回答した場合は、この投稿を更新し続けます。

回答

GabrielFalcone Sep 14 2020 at 12:38

問題は「解決済み」でした。問題は、実際には、アプリを閉じた後に権限が取り消されたときにAndroidStudioが強制終了を呼び出すことでした。

実際のGoogleの応答:

この問題を提起し、それを再現するためのサンプルコードを提供していただきありがとうございます。さらに調査したところ、これはAndroidStudioと「ファイル名を指定して実行」コマンドで起動したアプリとのやり取りによるものであることがわかりました。

具体的には、Androidがアプリの権限を取り消すと、そのアプリのプロセスが強制終了されます。Android Studioは、起動したアプリが実行されなくなったことを確認すると、adbを介して強制停止コマンドを送信することがわかりました。

アプリがランチャー(Android Studioに接続されているエミュレーターを含む)を介して起動された場合、アプリは強制的に停止されず、アラームとジョブの両方が期待どおりに実行されます。

したがって、開発段階を除いて、追加の問題が発生することはありません。詳細については、質問にリンクされているAndroidの問題追跡システムを確認してください。