사용자 공간으로 빠른 부팅 이동

Android 10에는 빠른 부팅 구현을 부트로더에서 사용자 공간으로 재배치하여 크기를 조정할 수 있는 파티션 지원이 추가되었습니다. 이 재배치를 통해 하드웨어 추상화 계층(HAL)에 의해 구현된 빠른 부팅의 공급업체별 부분만 사용하여 플래싱 코드를 관리 및 테스트가 가능한 일반적인 위치로 이동할 수 있습니다.

빠른 부팅 및 복구 통합

사용자 공간 빠른 부팅과 복구는 유사하기 때문에 하나의 파티션/바이너리로 병합할 수 있습니다. 이렇게 하면 전반적으로 공간 사용량과 파티션 수를 줄일 수 있으며, 빠른 부팅과 복구가 커널 및 라이브러리를 공유할 수 있습니다.

fastbootd를 지원하려면 부트로더가 boot-fastboot의 새로운 부팅 제어 블록(BCB) 명령어를 구현해야 합니다. fastbootd 모드를 입력하려면 부트로더가 boot-fastboot를 BCB 메시지의 명령어 필드에 작성하고 BCB의 recovery 필드를 변경되지 않은 상태로 두어 중단된 복구 작업을 다시 시작할 수 있도록 해야 합니다. status, stage, reserved 필드도 변경하지 않고 그대로 둡니다. BCB 명령어에서 boot-fastboot가 표시되면 부트로더가 복구 이미지로 로드 및 부팅합니다. 이후 복구가 BCB 메시지를 파싱하고 fastbootd 모드로 전환됩니다.

새로운 adb 명령어

이 섹션에서는 adb 통합에 필요한 추가 fastbootd 명령어를 설명합니다. 시스템 또는 복구가 명령어를 실행하는지의 여부에 따라 명령어의 작동 방식이 다릅니다.

명령어 설명
reboot fastboot
  • fastbootd(시스템)으로 재부팅합니다.
  • 재부팅 없이 fastbootd를 직접 입력합니다(복구).

새로운 빠른 부팅 명령어

이 섹션에서는 fastbootd 통합에 필요한 추가 빠른 부팅 명령어를 설명합니다. 여기에는 논리 파티션을 플래싱하고 관리하기 위한 새로운 명령어가 포함되어 있습니다. 일부 명령어는 부트로더가 명령어를 실행하는지 또는 fastbootd가 실행하는지에 따라 작동 방식이 다릅니다.

명령어 설명
reboot recovery
  • 복구로 재부팅합니다(부트로더).
  • 재부팅 없이 직접 복구를 입력합니다(fastbootd).
reboot fastboot fastbootd로 재부팅합니다.
getvar is-userspace
  • 'yes'를 반환합니다(fastbootd).
  • 'no'를 반환합니다(부트로더).
getvar is-logical:<partition> 지정된 파티션이 논리 파티션이면 'yes'를, 그렇지 않으면 'no'를 반환합니다. 논리 파티션은 아래에 나열된 명령어를 전부 지원합니다.
getvar super-partition-name super 파티션의 이름을 반환합니다. super 파티션이 드물게 A/B 파티션인 경우 이름에 현재 슬롯 접미사가 포함됩니다.
create-logical-partition <partition> <size> 지정된 이름과 크기로 논리 파티션을 만듭니다. 이 이름이 이미 논리 파티션으로 존재해서는 안 됩니다.
delete-logical-partition <partition> 지정된 논리 파티션을 삭제합니다(사실상 파티션이 삭제됨).
resize-logical-partition <partition> <size> 콘텐츠를 변경하지 않고 논리 파티션의 크기를 새로운 크기로 조정합니다. 크기를 조정하기에 공간이 부족한 경우에는 실패합니다.
update-super <partition> 변경사항을 super 파티션 메타데이터에 병합합니다. 기기의 형식이 지원되지 않는 버전인 경우와 같이 병합이 불가능한 경우 이 명령어는 실패합니다. 선택사항인 'wipe' 매개변수는 병합을 수행하지 않고 기기의 메타데이터를 덮어씁니다.

fastbootd는 다음의 기존 빠른 부팅 명령어를 계속 지원합니다.

명령어 설명
flash <partition> [ <filename> ] 플래시 파티션에 파일을 씁니다. 기기는 잠금 해제 상태여야 합니다.
erase <partition> 파티션을 삭제합니다(secure erase일 필요 없음). 기기는 잠금 해제 상태여야 합니다.
getvar <variable> | all 부트로더 변수 또는 모든 변수를 표시합니다. 변수가 없으면 오류를 반환합니다.
set_active <slot>

주어진 A/B 부팅 슬롯을 활성으로 설정합니다. 다음 부팅 시도 시 시스템은 지정된 슬롯에서 부팅됩니다.

A/B 지원의 경우 슬롯은 독립적으로 부팅될 수 있는 중복된 파티션 세트입니다. 슬롯의 이름은 a, b 등으로 지정되며 접미사 _a, _b 등을 파티션 이름에 추가하여 구분될 수 있습니다.

reboot 기기를 정상적으로 재부팅합니다.
reboot-bootloader(또는 reboot bootloader) 기기를 부트로더로 재부팅합니다.

부트로더 수정

부트로더는 부트로더, 라디오, 부팅/복구 파티션 플래싱을 계속 지원하며, 이후 기기가 빠른 부팅(사용자 공간)으로 부팅하고 다른 모든 파티션을 플래싱합니다. 부트로더는 다음 명령어를 지원합니다.

명령어 설명
download 이미지를 플래시로 다운로드합니다.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ 복구/부팅 파티션 및 부트로더를 플래싱합니다.
reboot 기기를 재부팅합니다.
reboot fastboot 빠른 부팅으로 재부팅합니다.
reboot recovery 복구로 재부팅합니다.
getvar 복구/부팅 이미지를 플래싱하는 데 필요한 부트로더 변수를 가져옵니다(예: current-slotmax-download-size).
oem OEM에서 정의한 명령어입니다.

부트로더는 동적 파티션의 플래싱을 허용해서는 안 되며 Partition should be flashed in fastbootd라는 오류를 반환해야 합니다. 재구성된 동적 파티션 기기의 경우 빠른 부팅 도구는 부트로더 모드에서 동적 파티션을 직접 플래싱하기 위해 강제 모드를 지원합니다. 부트로더는 이 작업을 지원할 수 있습니다. 예를 들어 system이 재구성된 기기의 동적 파티션인 경우 fastboot --force flash system은 부트로더가 fastbootd 대신 파티션을 플래싱하도록 합니다. 이 강제 모드는 공장 플래싱의 유연성을 제공하기 위한 것이며 개발자에게는 권장되지 않습니다.

빠른 부팅 OEM HAL

부트로더 빠른 부팅을 완전히 교체하려면 빠른 부팅이 모든 기존 빠른 부팅 명령어를 처리해야 합니다. 이러한 명령어의 대부분은 OEM으로부터 제공되어 문서화되지만, 맞춤 구현이 필요합니다(많은 명령어는 OEM과 관련이 있지만 문서화되지 않음). 이러한 명령어를 처리하기 위해 빠른 부팅은 HAL은 필수 OEM 명령어를 지정하고 OEM이 자체 명령어를 구현할 수 있도록 합니다.

fastboot HAL의 정의는 다음과 같습니다.

import IFastbootLogger;

    /**
     * IFastboot interface implements vendor specific fastboot commands.
     */
    interface IFastboot {
        /**
         * Returns a bool indicating whether the bootloader is enforcing verified
         * boot.
         *
         * @return verifiedBootState True if the bootloader is enforcing verified
         * boot and False otherwise.
         */
        isVerifiedBootEnabled() generates (bool verifiedBootState);

        /**
         * Returns a bool indicating the off-mode-charge setting. If off-mode
         * charging is enabled, the device autoboots into a special mode when
         * power is applied.
         *
         * @return offModeChargeState True if the setting is enabled and False if
         * not.
         */
        isOffModeChargeEnabled() generates (bool offModeChargeState);

        /**
         * Returns the minimum battery voltage required for flashing in mV.
         *
         * @return batteryVoltage Minimum battery voltage (in mV) required for
         * flashing to be successful.
         */
        getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

        /**
         * Returns the file system type of the partition. This is only required for
         * physical partitions that need to be wiped and reformatted.
         *
         * @return type Can be ext4, f2fs or raw.
         * @return result SUCCESS if the operation is successful,
         * FAILURE_UNKNOWN if the partition is invalid or does not require
         * reformatting.
         */
        getPartitionType(string partitionName) generates (FileSystemType type, Result result);

        /**
         * Executes a fastboot OEM command.
         *
         * @param oemCmdArgs The oem command that is passed to the fastboot HAL.
         * @response result Returns the status SUCCESS if the operation is
         * successful,
         * INVALID_ARGUMENT for bad arguments,
         * FAILURE_UNKNOWN for an invalid/unsupported command.
         */
        doOemCommand(string oemCmd) generates (Result result);

    };
    

fastbootd 사용 설정

기기에서 fastbootd를 사용 설정하는 방법은 다음과 같습니다.

  1. 다음과 같이 fastbootddevice.mkPRODUCT_PACKAGESPRODUCT_PACKAGES += fastbootd와 같이 추가합니다.

  2. 빠른 부팅 HAL, 부팅 제어 HAL, 상태 HAL이 복구 이미지의 일부로 패키징되도록 합니다.

  3. fastbootd에 필요한 기기별 sepolicy 권한을 모두 추가합니다. 예를 들어 fastbootd는 파티션을 플래싱하기 위해 장치별 파티션에 관한 쓰기 액세스 권한이 필요합니다. 빠른 부팅 HAL 구현에도 기기별 권한이 필요할 수 있습니다.

사용자 공간 빠른 부팅 검사

공급업체 테스트 도구 모음(VTS)에는 사용자 공간 빠른 부팅을 검사하는 테스트가 포함됩니다.