ソフトリブート

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 userspaceadb shell svc power reboot userspace の呼び出しは失敗します。

ソフトリブートの実行

ソフトリブートが(PowerManager またはシェルを介して)リクエストされた後、init は次の手順を実施します。

  1. sys.powerctl=reboot,userspace を受信します。

  2. 独立した UserspaceRebootWatchdogThread() プロセスをフォークして、ソフトリブートをモニタリングします。

  3. 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.rcon userspace-reboot-requested アクションをご覧ください。

  4. DoUserspaceReboot 関数を実行します。これにより、次のアクションが実行されます。

    1. userdata がマウントされた後に開始されるプロセスに SIGTERM を送信し、それらのプロセスが停止するのを待ちます。
    2. タイムアウトに達したら、SIGKILL を送信して実行中のプロセスを強制終了します。
    3. /system/bin/vdc volume reset を呼び出します。
    4. zRAM バックアップ デバイスのマウントを解除します。
    5. アクティブな APEX パッケージのマウントを解除します。
    6. ブートストラップのマウント名前空間に戻ります。
    7. userspace-reboot-resume アクションをトリガーします。

ソフトリブートの前にファイル システムのチェックポイント処理がリクエストされた場合は、userspace-reboot-fs-remount アクション中に userdata がチェックポイント処理モードに再マウントされます(詳しくは次のセクションをご覧ください)。sys.boot_completed property1 に設定されると、ソフトリブートとみなされます。ソフトリブートの終了時にディスプレイはオフのままであり、再度オンにするには明示的なユーザー操作が必要になります。

ファイル システムのチェックポイント処理

ソフトリブートの前にファイル システムのチェックポイントがリクエストされた場合は、ソフトリブート中に userdata がチェックポイント処理モードに再マウントされます。再マウント ロジックは fs_mgr_remount_userdata_into_checkpointing 関数で実装され、チェックポイントの処理方法によって異なります。具体的には、userdata が次の内容をサポートしている場合について、以下に記載します。

  • ファイルシステム レベルのチェックポイント処理f2fs など)をサポートしている場合、userdatacheckpoint=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 は、デバイスがソフトリブートを実行できるタイミングを制御します。このプロパティの値が false0 である、または指定されていない場合は、再起動の試行が拒否されます。
  • 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 アクションの終了時に、initbootanim サービスを開始します。このサービスは、次のアニメーション ファイルを表示されている順に検索して、見つかった最初のものを再生します。

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip

ソフトリブート固有のアニメーション ファイルが指定されていない場合は、bootanim によってデフォルトの android アニメーションが表示されます。

テスト

Android 11 には、ソフトリブートのリファレンス実装が用意されています。さらに、UserspaceRebootHostTest の CTS テストを使用して、ソフトリブートを検証できます。