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.configsys.usb.statesys.boot_completeddev.bootcompletesys.init.updatable_crashingsys.init.updatable_crashing_process_nameapexd.statussys.user.0.ce_availablesys.shutdown.requestedservice.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 テストを使用して、ソフトリブートを検証できます。