Android 10 이상은 부트로더에서 사용자 공간으로 fastboot 구현을 재배치하여 크기 조정 가능한 파티션을 지원합니다. 이 재배치를 통해 HAL(하드웨어 추상화 계층)에 의해 구현된 fastboot의 공급업체별 부분만 사용하여 플래싱 코드를 유지 관리 및 테스트 가능한 공통 위치로 이동할 수 있습니다. 또한 Android 12 이상에서는 추가된 fastboot 명령을 통해 플래시 램디스크를 지원합니다.
빠른 부팅 및 복구 통합
사용자 공간 빠른 부팅과 복구는 유사하기 때문에 하나의 파티션이나 바이너리로 병합할 수 있습니다. 이것은 더 적은 공간을 사용하고, 전체적으로 더 적은 파티션을 가지며, 빠른 부팅 및 복구가 커널과 라이브러리를 공유하는 등의 이점을 제공합니다.
fastbootd
를 지원하려면 부트로더가 boot-fastboot
의 새로운 BCB(부트 제어 블록) 명령을 구현해야 합니다. fastbootd
모드로 들어가기 위해 부트로더는 BCB 메시지의 명령 필드에 boot-fastboot
를 기록하고 BCB의 recovery
필드를 변경하지 않은 상태로 둡니다(중단된 복구 작업을 다시 시작할 수 있도록 하기 위해). status
, stage
및 reserved
필드도 변경되지 않은 상태로 유지됩니다. BCB 명령 필드에 boot-fastboot
가 표시되면 부트로더가 로드되고 복구 이미지로 부팅됩니다. 그런 다음 복구는 BCB 메시지를 구문 분석하고 fastbootd
모드로 전환합니다.
ADB 명령
이 섹션에서는 fastbootd
통합을 위한 adb
명령에 대해 설명합니다. 명령은 시스템에 의해 실행되는지 복구에 의해 실행되는지에 따라 결과가 다릅니다.
명령 | 설명 |
---|---|
reboot fastboot |
|
빠른 부팅 명령
이 섹션에서는 논리 파티션을 플래싱하고 관리하기 위한 새로운 명령을 포함하여 fastbootd
통합을 위한 fastboot 명령에 대해 설명합니다. 일부 명령은 부트로더에 의해 실행되었는지 아니면 fastbootd
에 의해 실행되었는지에 따라 결과가 다릅니다.
명령 | 설명 |
---|---|
reboot recovery |
|
reboot fastboot | fastbootd 로 재부팅합니다. |
getvar is-userspace |
|
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 부팅 슬롯을 A/B 지원의 경우 슬롯은 독립적으로 부팅할 수 있는 복제된 파티션 세트입니다. 슬롯의 이름 |
reboot | 기기를 정상적으로 재부팅합니다. |
reboot-bootloader (또는 reboot bootloader ) | 기기를 부트로더로 재부팅합니다. |
fastboot fetch vendor_boot <out.img> | 깜박이는 공급업체 램디스크 를 지원하려면 Android 12 이상 에서 사용합니다. 전체 파티션 크기와 청크 크기를 가져옵니다. 각 청크에 대한 데이터를 가져온 다음 데이터를 함께 자세한 내용은 |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | 깜박이는 공급업체 램디스크를 지원하려면 Android 12 이상에서 사용합니다. 이것은 flash 명령의 특별한 변형입니다. 마치 자세한 내용은 |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | 깜박이는 공급업체 램디스크를 지원하려면 Android 12 이상에서 사용합니다. 자세한 내용은 |
빠른 부팅 및 부트로더
부트로더는 bootloader
, radio
및 boot/recovery
파티션을 플래시한 후 장치가 fastboot(사용자 공간)로 부팅하고 다른 모든 파티션을 플래시합니다. 부트로더는 다음 명령을 지원해야 합니다.
명령 | 설명 |
---|---|
download | 플래시에 이미지를 다운로드합니다. |
flash recovery <image> / flash boot <image> / flash bootloader <image> / | recovery/boot 파티션 및 부트로더를 플래시합니다. |
reboot | 장치를 재부팅합니다. |
reboot fastboot | 빠른 부팅으로 재부팅합니다. |
reboot recovery | 복구를 위해 재부팅합니다. |
getvar | 복구/부팅 이미지를 플래싱하는 데 필요한 부트로더 변수를 가져옵니다(예: current-slot 및 max-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
를 활성화하려면:
device.mk
의PRODUCT_PACKAGES
에fastbootd
를 추가합니다.PRODUCT_PACKAGES += fastbootd
.빠른 부팅 HAL, 부팅 제어 HAL 및 상태 HAL이 복구 이미지의 일부로 패키지되어 있는지 확인합니다.
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-size
및 fetch:name
명령은 fastbootd
에서 구현됩니다. 부트로더에서 깜박이는 공급업체 램디스크를 지원하려면 이 두 명령을 구현해야 합니다.
빠른 부팅 변경
getvar:max-fetch-size
는 max-download-size
와 유사합니다. 장치가 하나의 DATA 응답으로 보낼 수 있는 최대 크기를 지정합니다. 드라이버는 이 값보다 큰 크기를 가져오면 안 됩니다.
fetch:name[:offset[:size]]
는 장치에서 일련의 검사를 수행합니다. 다음 사항이 모두 참이면 fetch:name[:offset[:size]]
명령은 데이터를 반환합니다.
- 장치가 디버그 가능한 빌드를 실행 중입니다.
- 장치가 잠금 해제되었습니다(부팅 상태 주황색).
- 가져온 파티션 이름은
vendor_boot
입니다. -
size
값은 0 <size
<=max-fetch-size
내에 있습니다.
이것이 확인되면 fetch:name[:offset[:size]]
은 파티션 크기와 오프셋을 반환합니다. 다음에 유의하십시오.
-
fetch:name
은fetch:name:0
과 동일하며fetch:name:0:partition_size
와 동일합니다. -
fetch:name:offset
은fetch:name:offset:(partition_size - offset)
과 동일합니다.
따라서 fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
offset
또는 partition_size
(또는 둘 다)가 지정되지 않은 경우 기본값이 사용되며 offset
은 0이고 size
는 partition_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
이미지를 가져옵니다.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
가 변경되었습니다.