パーミッションシステムの仕様変更が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の順番 |
関連記事: