パーミッションシステムの仕様変更がAPI≧30で行われています。
 (1)1回だけアクセス許可
 (2)“今後表示しない”の非表示
 (3)アプリの休止
ここでは、「(3)アプリの休止」について説明します。
休止とは
数ヶ月にわたってアプリが操作されなかった時に、アプリが持つ必要最小限のリソースを残して、その他をクリアすることです。
休止対象のアプリへ、次の処理を行います。
・一時データ(キャッシュ)を消去 ※API≧31のみ
休止が行われると、ユーザに通知が届きます。


上記の処理に加えて、アプリのアンインストールへユーザを導くようになっていますが、アンインストールするかどうかはユーザ次第です。
アプリの休止についての詳細は「App hibernation」を参照してください。
休止の条件
「アプリが操作されていない」と判断する具体的な条件は、次のようなものです。
・Activity以外のコンポーネントが呼び出されていない ※API≧31のみ
 【コンポーネントの例】
  他アプリによりバインドされたサービス
  他アプリにより呼び出された明示的なブロードキャストレシーバー
  他アプリにより照会されたコンテンツプロバイダー
・ウィジェットを操作していない ※API≧31のみ
・Notificationを操作していない(閉じることを除く)※API≧31のみ
これらの条件を数ヶ月にわたって満たしていれば、アプリは休止になります。

「数ヶ月にわたって」がどういう状態かと言えば...
システムの内部では、「check_frequency間隔で判定を行ったとき、休止の条件を満たしてからunused_threshold以上経過した」状態です。
逆に条件から外れた動きがあると、システムはそのイベントをユーザの操作と見なして、休止を解除します。
実際は図中で示したように、APIのプログラムへデフォルト値が埋め込まれているので、約90~105日経過したら休止です。
デフォルト値はAndroidのブート時のログ出力(例はエミュレータのログ出力)で確認できます。
※パッケージ名:com.android.permissioncontroller
          :
... I/AutoRevokePermissions: Parsed teamfood setting value: null
... I/AutoRevokePermissions: Parsed teamfood setting value: null
... I/AutoRevokePermissions: scheduleAutoRevokePermissions with frequency 1296000000ms and threshold 7776000000ms
... I/AutoRevokePermissions: user 0 is a profile owner. Running Auto Revoke.
... I/AutoRevokePermissions: Parsed teamfood setting value: null
... I/AutoRevokePermissions: onStartJob
... I/AutoRevokePermissions: Skipping auto revoke first run when scheduled by system
          :
※パッケージ名:com.google.android.permissioncontroller
          :
... I/HibernationPolicy: scheduleHibernationJob with frequency 1296000000ms and threshold 7776000000ms
... I/HibernationPolicy: user 0 is a profileowner. Running hibernation job.
... I/HibernationPolicy: No existing job, scheduling a new one
... I/HibernationPolicy: onStartJob
... I/HibernationPolicy: Skipping auto revoke first run when scheduled by system
          :
休止の影響範囲
「アプリの休止」は、端末で稼働しているAndroidのバージョンと、アプリがビルドされた時のtargetSDKの関係により、その動作に違いがあります。
| 端末のOS | targetSDK | 休止の影響 | 管理ページ | ||
|---|---|---|---|---|---|
| ≧Android12 (API31) | ≧31 | Permissionの取得をリセット 一時データ(キャッシュ)のクリア | 「アプリ情報」 | ||
| Android11 (API30) | 30 | Permissionの取得をリセット | |||
| Android6~10 (API23~29) | 「Playプロテクト」 | ※ | |||
| ※休止の仕様をAPI<30へバックポート(移植)、Google Play Service+Play Storeで実現 | |||||
この場合、APIに実装されているのではなく、Google Play ServiceとPlay Storeアプリの連携により実現されている点に注意してください。
対応は2021.12以降に順次行われているので、「アプリの休止」を端末に反映させたければ、この両者を最新版へアップデートする必要があります。
休止の判定解除
「アプリの休止」はデフォルトでOn(有効)になっています。
しかし、管理ページからユーザの手によってOff(無効)に切り替えが可能です。



Permissionの状態変化
休止の発動後に、granted=trueからfalseに変化します。
> adb shell dumpsys package パッケージ名 【バックグラウンドへ遷移(直後)】 runtime permissions: android.permission.ACCESS_FINE_LOCATION: granted=true, flags=[ USER_SET|USER_SENSITIVE_WHEN_GRANTED|..._DENIED] android.permission.ACCESS_COARSE_LOCATION: granted=true, flags=[ USER_SET|USER_SENSITIVE_WHEN_GRANTED|..._DENIED] 【アプリの休止後】 runtime permissions: android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ REVOKED_COMPAT|USER_SENSITIVE_WHEN_GRANTED|..._DENIED|AUTO_REVOKED] android.permission.ACCESS_COARSE_LOCATION: granted=false, flags=[ REVOKED_COMPAT|USER_SENSITIVE_WHEN_GRANTED|..._DENIED|AUTO_REVOKED] ※...:左のフラグと同じ接頭辞ため省略
休止からの復帰動作
アプリの休止後、
復帰はonStartからスタートします。また、onSave/onRestoreInstanceStateが有効になっています。
| ケース |  | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 他のアプリ起動(Bgへ) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 3 | 2 | 0 | 
| 履歴から復帰(Fgへ、通常) | 1 | 2 | 3 | |||||||||
| 履歴から復帰(Fgへ、休止後) | 1 | 2 | 3 | |||||||||
| ※Fg:フォアグラウンド、Bg:バックグラウンド ※API≧28の場合、onStop ⇒ onSaveInstanceStateの順番 | ||||||||||||
関連記事:
