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로 업데이트합니다. 두 번째는 다음 두 가지를 실행합니다. bootconfig 처리를 추가하고, 런타임에 매개변수를 추가하는 방법을 보여줍니다.
빌드 예
공급업체 부팅 헤더 v4로 vendor_boot.img
를 빌드하기 위한 mkbootimg
변경사항을 보여주는 빌드 예는 mkbootimg changes for bootconfig
를 참고하세요.
Cuttlefish 변경사항을 참고하여 다음을 실행하세요.
- 공급업체 부팅 헤더 버전 v4를 사용하거나 v4로 업데이트합니다.
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 섹션에는 다음 항목에 관한 메모리 할당이 포함되어 있습니다.
- 매개변수
- 4B 크기
parameters size
- 4B 크기
parameters checksum
- 12B bootconfig 매직 문자열(
#BOOTCONFIG\n
)
매개변수는 두 가지 소스에서 가져옵니다. 하나는 빌드 시간에 알려진 매개변수이고 다른 하나는 빌드 시간에 알 수 없는 매개변수입니다. 알 수 없는 매개변수를 추가해야 합니다.
빌드 시간에 알려진 매개변수는 bootconfig 섹션의 vendor_boot
이미지 끝에 패키징됩니다. 섹션의 크기는 공급업체 부팅 헤더 필드 vendor_bootconfig_size
에 바이트로 저장됩니다.
빌드 시간에 알 수 없는 매개변수는 부트로더에서 런타임에만 알려집니다. bootconfig 트레일러가 적용되기 전에 bootconfig 매개변수 섹션의 끝에 추가해야 합니다.
bootconfig 트레일러가 적용된 후 매개변수를 추가해야 하면 트레일러를 덮어쓰고 다시 적용합니다.
증분 구현 및 유효성 검사
이 섹션에서 제공하는 프로세스에 따라 bootconfig 기능을 점진적으로 구현합니다. bootconfig 매개변수가 추가되는 동안 커널 cmdline 매개변수는 그대로 둡니다.
다음은 유효성 검사가 포함된 증분 구현 단계입니다.
- 부트로더와 빌드를 변경하고 다음 작업을 실행합니다.
BOARD_BOOTCONFIG
변수를 사용하여 새 bootconfig 매개변수를 추가합니다.- 커널 cmdline 매개변수를 그대로 유지하여 기기가 계속 올바르게 부팅될 수 있도록 합니다. 이렇게 하면 디버깅과 유효성 검사가 훨씬 쉬워집니다.
/proc/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를 참고하세요.