Android 11は、ソフトリブートをサポートしています。これは、再起動が必要な更新(APEXパッケージの更新など)を適用するために使用されるユーザースペースのプロセスのランタイム再起動です。現在、ソフトリスタートは、 userdata
がマウントされた後に開始されたプロセスに制限されています。
ソフトリスタートは、次の方法で要求されます。
PowerManager
から、PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
呼び出すことによってシェルから、
adb shell svc power reboot userspace
またはadb reboot userspace
ソフトリスタート後、資格情報で暗号化されたストレージはロック解除されたままになります。
デバイスがソフトPowerManager.isRebootingUserspace()
スタートをサポートしている場合、 PowerManager.isRebootingUserspace()
APIメソッドはtrue
返し、システムプロパティinit.userspace_reboot.is_supported
値は1
等しくなります。
デバイスがソフトリブートをサポートしていない場合、 PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
、 adb reboot userspace
PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
、およびadb shell svc power reboot userspace
PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
adb 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
をSIGTERM
し、プロセスが停止するのを待ちます。 - タイムアウトに達した後、実行中のプロセスを
SIGKILL
するためにSIGKILL
を送信します。 -
/system/bin/vdc volume reset
呼び出します。 - zRAMバッキングデバイスをアンマウントします。
- アクティブなAPEXパッケージをアンマウントします。
- ブートストラップマウント名前空間に戻ります。
-
userspace-reboot-resume
アクションをトリガーします。
- ユーザー
ファイルシステムのチェックポイントは、ソフト再起動する前に、要求された場合、 userdata
時のモードをチェックポイントに再マウントされるuserspace-reboot-fs-remount
(詳細については、次のセクションを参照してください)アクション。ソフトリスタートは、 sys.boot_completed property
が1
設定された後に考慮されます。ソフトリスタートが終了すると、ディスプレイはオフのままになり、ウェイクアップするには明示的なユーザー操作が必要になります。
ファイルシステムのチェックポイント
ソフトリスタートの前にファイルシステムチェックポイントが要求された場合、ユーザーuserdata
はソフトリスタート中にチェックポイントモードで再マウントされます。再マウントロジックはfs_mgr_remount_userdata_into_checkpointing
関数に実装されており、チェックポイント方法によって異なります。具体的には、 userdata
サポートする場合:
ファイルシステムレベルのチェックポイント(たとえば、
f2fs
)では、f2fs
userdata
はcheckpoint=disable
オプションをcheckpoint=disable
して再f2fs
されます。ブロックレベルのチェックポイント(たとえば、
ext4
)を実行すると、/data
がマウント解除され、その上にマウントされていたすべての親デバイスマッパーデバイスが破棄されます。次に、userdata
は、通常のチェックポインティングブートで使用されるのと同じコードパスを使用してマウントされます。
ファイルシステムレベルのキーリングを使用して資格情報暗号化(CE)キーとデバイス暗号化(DE)キーを管理する場合、ユーザーuserdata
がアンマウントされるとキーは失われます。キーの復元を可能にするために、ファイルシステムのキーリングにキーをインストールするときに、 vold
はセッションレベルのキーリングにタイプfscrypt-provisioning
同じキーもインストールしvold
。 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
は、デバイスがソフトリスタートを実行できるinit.userspace_reboot.is_supported
制御します。このプロパティの値がfalse
、0
、または指定されていない場合、再起動の試行は拒否されます。 -
init.userspace_reboot.sigkill.timeoutmillis
は、停止するSIGKILL
を受信したプロセスのタイムアウトをミリ秒単位で制御します。指定されたタイムアウトでプロセスの1つが停止しなかった場合、ハードリブートへのフォールバックがトリガーされます。 -
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
は、init.userspace_reboot.userdata_remount.timeoutmillis
userdata
をアンマウントするためのタイムアウトをミリ秒単位で制御します。デバイスが指定されたタイムアウト内にユーザーuserdata
ミュートを解除できない場合、ハードリブートへのフォールバックがトリガーされます。 -
init.userspace_reboot.watchdog.timeoutmillis
は、デバイスが正常に起動するためのタイムアウトを制御します(つまり、sys.boot_completed=1
)。指定されたタイムアウト内にデバイスが起動に失敗した場合、ハードリブートへのフォールバックがトリガーされます。
ソフトリスタート中のアニメーションのカスタマイズ
ソフトリスタートのリファレンス実装には、ソフトリスタート中に表示されるアニメーションをカスタマイズする機能が含まれています。
bootanim
userspace-reboot-fs-remount
bootanim
アクションの最後に、 init
はbootanim
サービスを開始します。このサービスは、リストされている順序で次のアニメーションファイルの存在を検索し、最初に見つかったものを再生します。
-
/product/media/userspace-reboot.zip
-
/oem/media/userspace-reboot.zip
-
/system/media/userspace-reboot.zip
ソフトリスタート固有のアニメーションファイルが指定されていない場合、 bootanim
はデフォルトのandroid
アニメーションを表示します。
テスト
Android 11には、ソフトリスタートのリファレンス実装が含まれています。さらに、 UserspaceRebootHostTest
CTSテストを使用して、ソフトリスタートを確認できます。