Android 11 では、ソフトリブートをサポートしています。これは、ユーザー空間のプロセスを実行時に再起動する機能です。再起動を必要とする更新(APEX パッケージの更新など)の適用に使用されます。現在、ソフトリブートの対象は、userdata
をマウントした後に開始されたプロセスに限定されています。
ソフトリブートをリクエストする方法は次のとおりです。
PowerManager
からPowerManager.reboot(PowerManager.REBOOT_USERSPACE)
を呼び出すシェルから
adb shell svc power reboot userspace
またはadb reboot userspace
を使用する
ソフトリブートの後も、認証情報暗号化ストレージはロック解除された状態を保持します。
デバイスがソフトリブートをサポートしている場合、PowerManager.isRebootingUserspace()
API メソッドは true
を返し、システム プロパティ init.userspace_reboot.is_supported
の値は 1
と等しくなります。
デバイスがソフトリブートをサポートしていない場合、PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
、adb reboot
userspace
、adb shell svc power reboot userspace
の呼び出しは失敗します。
ソフトリブートの実行
ソフトリブートが(PowerManager
またはシェルを介して)リクエストされた後、init
は次の手順を実施します。
sys.powerctl=reboot,userspace
を受信します。独立した
UserspaceRebootWatchdogThread()
プロセスをフォークして、ソフトリブートをモニタリングします。userspace-reboot-requested
アクションをトリガーします。これにより、ソフトリブートに影響する可能性があるすべてのシステム プロパティがリセットされます。影響を受けるプロパティ:sys.usb.config
sys.usb.state
sys.boot_completed
dev.bootcomplete
sys.init.updatable_crashing
sys.init.updatable_crashing_process_name
apexd.status
sys.user.0.ce_available
sys.shutdown.requested
service.bootanim.exit
上記のプロパティは、ブート シーケンス中に再度設定する必要があります。必要に応じて、その他のプロパティをリセットできます。例については、
rootdir/init.rc
のon userspace-reboot-requested
アクションをご覧ください。DoUserspaceReboot
関数を実行します。これにより、次のアクションが実行されます。userdata
がマウントされた後に開始されるプロセスにSIGTERM
を送信し、それらのプロセスが停止するのを待ちます。- タイムアウトに達したら、
SIGKILL
を送信して実行中のプロセスを強制終了します。 /system/bin/vdc volume reset
を呼び出します。- zRAM バックアップ デバイスのマウントを解除します。
- アクティブな APEX パッケージのマウントを解除します。
- ブートストラップのマウント名前空間に戻ります。
userspace-reboot-resume
アクションをトリガーします。
ソフトリブートの前にファイル システムのチェックポイント処理がリクエストされた場合は、userspace-reboot-fs-remount
アクション中に userdata
がチェックポイント処理モードに再マウントされます(詳しくは次のセクションをご覧ください)。sys.boot_completed property
が 1
に設定されると、ソフトリブートとみなされます。ソフトリブートの終了時にディスプレイはオフのままであり、再度オンにするには明示的なユーザー操作が必要になります。
ファイル システムのチェックポイント処理
ソフトリブートの前にファイル システムのチェックポイントがリクエストされた場合は、ソフトリブート中に userdata
がチェックポイント処理モードに再マウントされます。再マウント ロジックは fs_mgr_remount_userdata_into_checkpointing
関数で実装され、チェックポイントの処理方法によって異なります。具体的には、userdata
が次の内容をサポートしている場合について、以下に記載します。
ファイルシステム レベルのチェックポイント処理(
f2fs
など)をサポートしている場合、userdata
はcheckpoint=disable
オプションによって再マウントされます。ブロックレベルのチェックポイント処理(
ext4
など)をサポートしている場合、/data
のマウントは解除され、その上にマウントされた親デバイスのマッパー デバイスはすべて破棄されます。次に、通常のチェックポイント処理ブートで使用されているコードパスを使用して、userdata
がマウントされます。
認証情報暗号化(CE)鍵とデバイス暗号化(DE)鍵の管理にファイル システム レベルのキーリングが使用されている場合、userdata
のマウントが解除されると鍵が失われます。鍵の復元を可能にするため、vold
ではファイル システム キーリングに鍵をインストールする際に、セッション レベルのキーリングにも fscrypt-provisioning
タイプの同じ鍵がインストールされます。init_user0
が呼び出されると、vold
はファイル システム キーリングに鍵を再インストールします。
ハードリブートへのフォールバック
ソフトリブートによってデバイスが使用不能な状態のままになることを回避するため、Android 11 には、次のいずれかの条件が満たされた場合にトリガーされるハードリブートへのフォールバックが用意されています。
- タイムアウトするまでの特定の時間内にデバイスがソフトリブート(
sys.init.userspace_reboot.in_progress=1
)を開始することに失敗する。 - タイムアウトするまでの特定の時間内にプロセスが停止することに失敗する。
/system/bin/vdc volume reset
の操作が失敗する。- zRAM デバイスのマウント解除に失敗する。
- アクティブな APEX パッケージが誤ってマウント解除される。
- チェックポイント処理モードへの
userdata
の再マウントを試行すると失敗する。 - タイムアウトするまでの特定の時間内にデバイスが正常に起動する(
sys.boot_completed=1
)ことに失敗する。
デバイスごとの構成
ソフトリブートの一部の側面は、次のプロパティの値を変更することによって調整できます。
init.userspace_reboot.is_supported
は、デバイスがソフトリブートを実行できるタイミングを制御します。このプロパティの値がfalse
、0
である、または指定されていない場合は、再起動の試行が拒否されます。init.userspace_reboot.sigkill.timeoutmillis
は、SIGKILL
シグナルを受信して停止するプロセスのタイムアウトをミリ秒単位で制御します。特定のタイムアウト時間内にプロセスのいずれかが停止することに失敗すると、ハードリブートへのフォールバックがトリガーされます。init.userspace_reboot.sigterm.timeoutmillis
は、SIGTERM
シグナルを受信して停止するプロセスのタイムアウトをミリ秒単位で制御します。タイムアウトするまでの特定の時間内に終了することに失敗したすべてのプロセスは、SIGKILL
シグナルを受け取ります。init.userspace_reboot.started.timeoutmillis
は、ソフトリブートの開始タイムアウト(すなわち、sys.init.userspace_reboot.in_progress=1
)をミリ秒単位で制御します。タイムアウトするまでの特定の時間内にデバイスがソフトリブートを開始することに失敗した場合は、ハードリブートへのフォールバックがトリガーされます。init.userspace_reboot.userdata_remount.timeoutmillis
は、userdata
のマウント解除のタイムアウトをミリ秒単位で制御します。タイムアウトするまでの特定の時間内にデバイスがuserdata
のマウント解除に失敗した場合は、ハードリブートへのフォールバックがトリガーされます。init.userspace_reboot.watchdog.timeoutmillis
は、デバイスが正常に起動するまでのタイムアウト(すなわち、sys.boot_completed=1
)を制御します。タイムアウトするまでの特定の時間内にデバイスが起動することに失敗した場合は、ハードリブートへのフォールバックがトリガーされます。
ソフトリブート中のアニメーションをカスタマイズする
ソフトリブートのリファレンス実装には、ソフトリブート中に表示されるアニメーションをカスタマイズする機能が用意されています。
userspace-reboot-fs-remount
アクションの終了時に、init
が bootanim
サービスを開始します。このサービスは、次のアニメーション ファイルを表示されている順に検索して、見つかった最初のものを再生します。
/product/media/userspace-reboot.zip
/oem/media/userspace-reboot.zip
/system/media/userspace-reboot.zip
ソフトリブート固有のアニメーション ファイルが指定されていない場合は、bootanim
によってデフォルトの android
アニメーションが表示されます。
テスト
Android 11 には、ソフトリブートのリファレンス実装が用意されています。さらに、UserspaceRebootHostTest
の CTS テストを使用して、ソフトリブートを検証できます。