Android 12에서 bootconfig 기능은 Android 11 이하에서 사용 중인 androidboot.*
커널 cmdline 옵션을 대체합니다. bootconfig 기능은 빌드 및 부트로더에서 Android 12로 구성 세부정보를 전달하기 위한 메커니즘입니다.
이 기능은 Android 사용자 공간의 구성 매개변수를 커널의 구성 매개변수와 분리하는 방법을 제공합니다. 긴 androidboot.*
커널 매개변수를 bootconfig 파일로 이동하면 커널 cmdline에 공간이 생성되고 나중에 쉽게 확장할 수 있습니다.
커널과 Android 사용자 공간 모두 bootconfig
를 지원해야 합니다.
- 이 지원이 있는 첫 번째 릴리스: Android 12
- 이 지원이 있는 첫 번째 커널 버전: 12-5.4.xx 커널
12-5.10.xx 커널 버전으로 시작하는 새 장치에 대해 bootconfig 기능을 구현합니다. 장치를 업그레이드하는 경우에는 구현할 필요가 없습니다.
예제 및 소스
이 섹션의 예제와 소스 코드를 볼 때 bootconfig
코드의 형식은 Android 11 이하에서 사용되는 커널 cmdline의 형식과 약간 다를 뿐입니다. 그러나 다음과 같은 차이점이 사용에 중요합니다.
- 매개변수는 공백이 아닌 개행 이스케이프 시퀀스
\n
으로 구분해야 합니다.
부트로더 예
부트로더 예제는 Cuttlefish U-boot 참조 부트로더 구현을 참조하세요. 참조의 두 커밋이 아래에 나열되어 있습니다. 첫 번째는 부트 헤더 버전 지원을 최신 버전으로 상향 조정합니다. 이 예에서 첫 번째 커밋은 버전 지원을 다음 버전인 v4로 업데이트(또는 uprevs)합니다. 두 번째는 두 가지 작업을 수행합니다. bootconfig 처리를 추가하고 런타임에 매개변수를 추가하는 방법을 보여줍니다.
빌드 예제
공급업체 부트 헤더 v4로 vendor_boot.img
를 빌드하기 위한 mkbootimg
변경 사항을 보여주는 빌드 예제는 bootconfig에 대한 mkbootimg changes for bootconfig
참조하십시오. 다음을 수행하려면 오징어 변경 사항을 참조하십시오.
- 공급업체 부트 헤더 버전 v4 를 사용(또는 uprev)합니다.
-
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
구현
파트너는 부트로더에 대한 지원을 추가하고 빌드 시 androidboot.*
매개변수를 커널 cmdline에서 bootconfig 파일로 이동해야 합니다. 이 변경을 구현하는 가장 좋은 방법은 점진적으로 구현하는 것입니다. 증분 프로세스를 따르는 방법에 대한 정보는 증분 구현 및 검증 섹션을 참조하십시오.
/proc/cmdline 파일에서 androidboot.*
매개변수를 검색하는 변경 사항이 있는 경우 대신 /proc/bootconfig 파일을 가리키도록 합니다. ro.boot.*
속성은 새로운 bootconfig
값으로 설정되므로 해당 속성을 사용하여 코드를 변경할 필요가 없습니다.
빌드 변경 사항
먼저 부트 헤더 버전을 버전 4로 상향 조정합니다.
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
bootconfig
커널 cmdline 매개변수를 추가합니다. 이것은 커널이 bootconfig 섹션을 찾도록 합니다:
BOARD_KERNEL_CMDLINE += bootconfig
bootconfig 매개변수는 커널 cmdline이 BOARD\_KERNEL\_CMDLINE
에서 생성되는 것과 마찬가지로 BOARD_BOOTCONFIG
변수의 매개변수에서 생성됩니다.
모든 androidboot.*
매개변수는 다음과 같이 있는 그대로 이동할 수 있습니다.
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
부트로더 변경 사항
부트로더는 커널로 점프하기 전에 initramfs
를 설정합니다. 커널 부트 구성 은 bootconfig 섹션을 검색하고 예상되는 트레일러와 함께 initramfs,
의 맨 끝에 있는지 찾습니다.
부트로더는 공급업체 부트 이미지 헤더에서 vendor_boot.img
레이아웃 정보를 가져옵니다.
그림 1. Android 12 bootconfig 메모리 할당
부트로더는 메모리에 bootconfig 섹션을 생성합니다. bootconfig 섹션에는 다음에 대한 메모리 할당이 포함되어 있습니다.
- 매개변수
- 4 B 크기
parameters size
- 4 B 크기
parameters checksum
- 12 B bootconfig 매직 문자열(
#BOOTCONFIG\n
)
매개변수는 빌드 시 알려진 매개변수와 빌드 시 알려지지 않은 매개변수의 두 가지 소스에서 가져옵니다. 알 수 없는 매개변수를 추가해야 합니다.
빌드 시 알려진 매개변수는 bootconfig 섹션의 vendor_boot
이미지 끝에 패키징됩니다. 섹션의 크기는 공급업체 부트 헤더 필드 vendor_bootconfig_size
에 (바이트로) 저장됩니다.
빌드 시 알려지지 않은 매개변수는 부트로더에서 런타임 시에만 알려집니다. bootconfig 트레일러를 적용하기 전에 bootconfig 매개변수 섹션 끝에 추가해야 합니다.
bootconfig 트레일러가 적용된 후 매개변수를 추가해야 하는 경우 트레일러를 덮어쓰고 다시 적용하십시오.
증분 구현 및 검증
이 섹션에 제공된 프로세스에 따라 bootconfig 기능을 점진적으로 구현합니다. bootconfig 매개변수가 추가되는 동안 커널 cmdline 매개변수는 그대로 둡니다.
다음은 유효성 검사와 함께 증분 구현을 위한 단계입니다.
- 부트로더와 빌드를 변경 하고 다음을 수행합니다.
-
BOARD_BOOTCONFIG
변수를 사용하여 새 bootconfig 매개변수를 추가합니다. - 장치가 계속해서 올바르게 부팅할 수 있도록 커널 cmdline 매개변수를 그대로 유지하십시오. 이렇게 하면 디버깅 및 유효성 검사가 훨씬 쉬워집니다.
-
-
/proc/bootconfig
의 내용을 확인 하여 작업을 확인합니다. 장치가 부팅된 후 새로 추가된 매개변수가 표시되는지 확인합니다. - BOARD_BOOTCONFIG 변수와 부트로더를 사용하여
BOARD_BOOTCONFIG
androidboot.*
매개변수를 커널 cmdline에서 bootconfig로 이동합니다. - 각 매개변수가
/proc/bootconfig
에 있고/proc/cmdline
에 없는지 확인하십시오 . 이를 확인할 수 있으면 구현이 성공한 것입니다.
OTA 업그레이드 및 다운그레이드 고려 사항
다른 버전의 Android 또는 다른 커널 버전 간에 OTA 업그레이드 및 다운그레이드를 관리하는 경우 특별한 주의를 기울여야 합니다.
Android 12는 bootconfig를 지원하는 첫 번째 버전입니다. 그 이전 버전으로 다운그레이드하는 경우 bootconfig 대신 커널 cmdline 매개변수를 사용해야 합니다.
커널 버전 12-5.4 이상은 bootconfig를 지원합니다. 그 이전 버전(11-5.4 포함)으로 다운그레이드하는 경우 커널 cmdline 매개변수를 사용해야 합니다.
Android 11 이상에서 Android 12 이상으로 업그레이드할 때 커널 cmdline 매개변수를 계속 사용할 수 있습니다. 커널 버전 업그레이드도 마찬가지입니다.
문제 해결
확인 단계를 수행할 때 예상되는 매개변수가 /proc/bootconfig
에 표시되지 않으면 logcat
의 커널 로그를 확인하십시오. 커널이 지원하는 경우 bootconfig에 대한 로그 항목이 항상 존재합니다.
로그 출력 예시
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
반환된 오류 로그가 표시되면 bootconfig를 로드하는 데 문제가 있는 것입니다. 다른 오류 유형을 보려면 init/main.c 를 보십시오.