Fastboot를 사용자 공간으로 이동

Android 10 이상은 부트로더에서 사용자 공간으로 fastboot 구현을 재배치하여 크기 조정 가능한 파티션을 지원합니다. 이 재배치를 통해 HAL(하드웨어 추상화 계층)에 의해 구현된 fastboot의 공급업체별 부분만 사용하여 플래싱 코드를 유지 관리 및 테스트 가능한 공통 위치로 이동할 수 있습니다. 또한 Android 12 이상에서는 추가된 fastboot 명령을 통해 플래시 램디스크를 지원합니다.

빠른 부팅 및 복구 통합

사용자 공간 빠른 부팅과 복구는 유사하기 때문에 하나의 파티션이나 바이너리로 병합할 수 있습니다. 이것은 더 적은 공간을 사용하고, 전체적으로 더 적은 파티션을 가지며, 빠른 부팅 및 복구가 커널과 라이브러리를 공유하는 등의 이점을 제공합니다.

fastbootd 를 지원하려면 부트로더가 boot-fastboot 의 새로운 BCB(부트 제어 블록) 명령을 구현해야 합니다. fastbootd 모드로 들어가기 위해 부트로더는 BCB 메시지의 명령 필드에 boot-fastboot 를 기록하고 BCB의 recovery 필드를 변경하지 않은 상태로 둡니다(중단된 복구 작업을 다시 시작할 수 있도록 하기 위해). status , stagereserved 필드도 변경되지 않은 상태로 유지됩니다. BCB 명령 필드에 boot-fastboot 가 표시되면 부트로더가 로드되고 복구 이미지로 부팅됩니다. 그런 다음 복구는 BCB 메시지를 구문 분석하고 fastbootd 모드로 전환합니다.

ADB 명령

이 섹션에서는 fastbootd 통합을 위한 adb 명령에 대해 설명합니다. 명령은 시스템에 의해 실행되는지 복구에 의해 실행되는지에 따라 결과가 다릅니다.

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

빠른 부팅 명령

이 섹션에서는 논리 파티션을 플래싱하고 관리하기 위한 새로운 명령을 포함하여 fastbootd 통합을 위한 fastboot 명령에 대해 설명합니다. 일부 명령은 부트로더에 의해 실행되었는지 아니면 fastbootd 에 의해 실행되었는지에 따라 결과가 다릅니다.

명령 설명
reboot recovery
  • 복구(부트로더)로 재부팅합니다.
  • 재부팅 없이 바로 복구에 들어갑니다( fastbootd ).
reboot fastboot fastbootd 로 재부팅합니다.
getvar is-userspace
  • yes 를 반환합니다( fastbootd ).
  • no (부트로더)를 반환합니다.
getvar is-logical: <partition> 주어진 파티션이 논리 파티션이면 yes 를 반환하고 그렇지 않으면 no 를 반환합니다. 논리 파티션은 아래 나열된 모든 명령을 지원합니다.
getvar super-partition-name 슈퍼 파티션의 이름을 반환합니다. 슈퍼 파티션이 A/B 파티션(일반적으로 그렇지 않음)인 경우 이름에는 현재 슬롯 접미사가 포함됩니다.
create-logical-partition <partition> <size> 주어진 이름과 크기로 논리 파티션을 만듭니다. 이름은 이미 논리 파티션으로 존재해서는 안 됩니다.
delete-logical-partition <partition> 주어진 논리 파티션을 삭제합니다(파티션을 효과적으로 지웁니다).
resize-logical-partition <partition> <size> 내용을 변경하지 않고 논리 파티션의 크기를 새 크기로 조정합니다. 크기 조정을 수행하는 데 사용할 수 있는 공간이 충분하지 않으면 실패합니다.
update-super <partition> 슈퍼 파티션 메타데이터에 대한 변경 사항을 병합합니다. 병합이 불가능한 경우(예: 장치의 형식이 지원되지 않는 버전인 경우) 이 명령은 실패합니다. 선택적 wipe 매개변수는 병합을 수행하는 대신 장치의 메타데이터를 덮어씁니다.
flash <partition> [ <filename> ] 플래시 파티션에 파일을 씁니다. 장치는 잠금 해제 상태여야 합니다.
erase <partition> 파티션을 지웁니다(보안 지우기에 필요하지 않음). 장치는 잠금 해제 상태여야 합니다.
getvar <variable> | all 부트로더 변수 또는 모든 변수를 표시합니다. 변수가 존재하지 않으면 오류를 반환합니다.
set_active <slot>

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

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

reboot 기기를 정상적으로 재부팅합니다.
reboot-bootloader (또는 reboot bootloader ) 기기를 부트로더로 재부팅합니다.
fastboot fetch vendor_boot <out.img>

깜박이는 공급업체 램디스크 를 지원하려면 Android 12 이상 에서 사용합니다.

전체 파티션 크기와 청크 크기를 가져옵니다. 각 청크에 대한 데이터를 가져온 다음 데이터를 함께 <out.img> 에 연결합니다.

자세한 내용은 fastboot fetch vendor_boot <out.img> 를 참조하세요.

fastboot flash vendor_boot:default <vendor-ramdisk.img>

깜박이는 공급업체 램디스크를 지원하려면 Android 12 이상에서 사용합니다.

이것은 flash 명령의 특별한 변형입니다. 마치 fastboot fetch 가 호출된 것처럼 fetch vendor_boot 이미지 기능을 수행합니다. 깜박이는 새 vendor_boot 이미지는 부팅 헤더 버전이 버전 3인지 버전 4인지에 따라 다릅니다.

자세한 내용은 fastboot flash vendor_boot:default <vendor-ramdisk.img> 를 참조하십시오.

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> 깜박이는 공급업체 램디스크를 지원하려면 Android 12 이상에서 사용합니다.

vendor_boot 이미지를 가져옵니다. 공급업체 부팅 헤더가 버전 3이면 오류를 반환합니다. 버전 4이면 올바른 공급업체 램디스크 조각(사용 가능한 경우)을 찾습니다. 이를 주어진 이미지로 대체하고 크기와 오프셋을 다시 계산하고 새 vendor_boot image 를 플래시합니다.

자세한 내용은 fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

빠른 부팅 및 부트로더

부트로더는 bootloader , radioboot/recovery 파티션을 플래시한 후 장치가 fastboot(사용자 공간)로 부팅하고 다른 모든 파티션을 플래시합니다. 부트로더는 다음 명령을 지원해야 합니다.

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

동적 파티션

부트로더는 동적 파티션의 플래싱 또는 지우기를 허용 하지 않아야 하며 이러한 작업이 시도되면 오류를 반환 해야 합니다 . 개조된 동적 파티션 장치의 경우 fastboot 도구(및 부트로더)는 부트로더 모드에 있는 동안 동적 파티션을 직접 플래시하는 강제 모드를 지원합니다. 예를 들어 system 이 개조된 장치의 동적 파티션인 경우 fastboot --force flash system 명령을 사용하면 fastbootd 대신 부트로더가 파티션을 플래시할 수 있습니다.

오프 모드 충전

장치가 오프 모드 충전을 지원하거나 전원이 공급될 때 특수 모드로 자동 부팅되는 경우 fastboot oem off-mode-charge 0 명령의 구현은 이러한 특수 모드를 우회해야 사용자가 누른 것처럼 장치가 부팅됩니다. 전원 버튼.

Fastboot OEM HAL

부트로더 fastboot를 완전히 대체하려면 fastboot가 기존의 모든 fastboot 명령을 처리해야 합니다. 이러한 명령의 대부분은 OEM에서 제공되며 문서화되어 있지만 사용자 정의 구현이 필요합니다. 많은 OEM 관련 명령이 문서화 되어 있지 않습니다 . 이러한 명령을 처리하기 위해 fastboot 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 oemCmd 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 를 활성화하려면:

  1. device.mkPRODUCT_PACKAGESfastbootd 를 추가합니다. PRODUCT_PACKAGES += fastbootd .

  2. 빠른 부팅 HAL, 부팅 제어 HAL 및 상태 HAL이 복구 이미지의 일부로 패키지되어 있는지 확인합니다.

  3. fastbootd 에 필요한 장치별 SEPolicy 권한을 추가합니다. 예를 들어 fastbootd 는 해당 파티션을 플래시하려면 장치별 파티션에 대한 쓰기 액세스 권한이 필요합니다. 또한 fastboot HAL 구현에는 기기별 권한이 필요할 수도 있습니다.

사용자 공간 빠른 부팅을 확인하려면 VTS(Vendor Test Suite) 를 실행합니다.

깜박이는 공급업체 램디스크

Android 12 이상은 기기에서 전체 vendor_boot 이미지를 가져오는 추가된 fastboot 명령으로 램디스크 플래싱을 지원합니다. 이 명령은 호스트 측 fastboot 도구에 공급업체 부팅 헤더를 읽고, 이미지를 다시 만들고, 새 이미지를 플래시하도록 합니다.

전체 vendor_boot 이미지를 fetch:vendor_boot 명령이 fastboot 프로토콜과 Android 12에서 프로토콜의 fastbootd 구현 모두에 추가되었습니다. fastbootd 이를 구현하지만 부트로더 자체는 구현하지 않을 수 있습니다. OEM은 프로토콜의 부트로더 구현에 fetch:vendor_boot 명령을 추가할 수 있습니다. 그러나 명령이 부트로더 모드에서 인식되지 않는 경우 부트로더 모드에서 개별 공급업체 램디스크를 플래싱하는 것은 공급업체에서 지원하는 옵션이 아닙니다.

부트로더 변경 사항

getvar:max-fetch-sizefetch:name 명령은 fastbootd 에서 구현됩니다. 부트로더에서 깜박이는 공급업체 램디스크를 지원하려면 이 두 명령을 구현해야 합니다.

빠른 부팅 변경

getvar:max-fetch-sizemax-download-size 와 유사합니다. 장치가 하나의 DATA 응답으로 보낼 수 있는 최대 크기를 지정합니다. 드라이버는 이 값보다 큰 크기를 가져오면 안 됩니다.

fetch:name[:offset[:size]] 는 장치에서 일련의 검사를 수행합니다. 다음 사항이 모두 참이면 fetch:name[:offset[:size]] 명령은 데이터를 반환합니다.

  • 장치가 디버그 가능한 빌드를 실행 중입니다.
  • 장치가 잠금 해제되었습니다(부팅 상태 주황색).
  • 가져온 파티션 이름은 vendor_boot 입니다.
  • size 값은 0 < size <= max-fetch-size 내에 있습니다.

이것이 확인되면 fetch:name[:offset[:size]] 은 파티션 크기와 오프셋을 반환합니다. 다음에 유의하십시오.

  • fetch:namefetch:name:0 과 동일하며 fetch:name:0:partition_size 와 동일합니다.
  • fetch:name:offsetfetch:name:offset:(partition_size - offset) 과 동일합니다.

따라서 fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

offset 또는 partition_size (또는 둘 다)가 지정되지 않은 경우 기본값이 사용되며 offset 은 0이고 sizepartition_size - offset 의 계산된 값이 사용됩니다.

  • 지정된 오프셋, 지정되지 않은 크기: size = partition_size - offset
  • 지정되지 않음: 둘 다에 사용되는 기본값, size = partition_size - 0.

예를 들어, fetch:foo 는 오프셋 0에서 전체 foo 파티션을 가져옵니다.

드라이버 변경

드라이버 변경을 구현하기 위해 fastboot 도구에 명령이 추가되었습니다. 각각은 Fastboot 명령 표의 전체 정의에 연결되어 있습니다.

  • fastboot fetch vendor_boot out.img

    • 청크 크기를 결정하기 위해 getvar max-fetch-size 를 호출합니다.
    • getvar partition-size:vendor_boot[_a] 를 호출하여 전체 파티션의 크기를 결정합니다.
    • 각 청크에 대해 fastboot fetch vendor_boot[_a]:offset:size 를 호출합니다. (청크 크기는 vendor_boot 크기보다 크므로 일반적으로 하나의 청크만 있습니다.)
    • out.img 에 데이터를 연결합니다.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    이것은 flash 명령의 특별한 변형입니다. 마치 fastboot fetch 가 호출된 것처럼 vendor_boot 이미지를 가져옵니다.

    • 공급업체 부팅이 헤더 버전 3 이면 다음을 수행합니다.
      • 공급업체 램디스크를 주어진 이미지로 교체합니다.
      • vendor_boot 이미지를 깜박입니다.
    • 공급업체 부팅 헤더가 버전 4 인 경우 다음을 수행합니다.
      • 전체 공급업체 램디스크를 주어진 이미지로 교체하여 주어진 이미지가 vendor_boot 이미지의 유일한 공급업체 램디스크 조각이 되도록 합니다.
      • 공급업체 램디스크 테이블의 크기와 오프셋을 다시 계산합니다.
      • vendor_boot 이미지를 깜박입니다.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    fastboot fetch 가 호출된 것처럼 vendor_boot image 를 가져옵니다.

    • 공급업체 부팅 헤더가 버전 3이면 오류를 반환합니다.
    • 공급업체 부팅 헤더가 버전 4인 경우 다음을 수행합니다.

      • 이름이 foo 인 공급업체 램디스크 조각을 찾습니다. 찾을 수 없거나 일치하는 항목이 여러 개인 경우 오류를 반환합니다.
      • 공급업체 램디스크 조각을 주어진 이미지로 교체합니다.
      • 공급업체 램디스크 테이블의 각 크기와 오프셋을 다시 계산합니다.
      • vendor_boot 이미지를 깜박입니다.

mkbootimg

이름 default 은 Android 12 이상에서 공급업체 램디스크 조각의 이름을 지정하기 위해 예약되어 있습니다. fastboot flash vendor_boot:default 의미 체계는 동일하게 유지되지만 ramdisk 조각의 이름을 default 로 지정 해서는 안 됩니다.

SELinux 변경 사항

깜박이는 공급업체 램디스크를 지원하기 위해 fastbootd.te 가 변경되었습니다.