Android 12에서 Bootconfig 구현

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 변경사항을 참고하여 다음을 실행하세요.

구현

파트너는 부트로더에 지원을 추가하고 빌드 시간 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 레이아웃 정보를 가져옵니다.

bootconfig 메모리 할당 레이아웃 다이어그램

그림 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 매개변수는 그대로 둡니다.

다음은 유효성 검사가 포함된 증분 구현 단계입니다.

  1. 부트로더와 빌드를 변경하고 다음 작업을 실행합니다.
    1. BOARD_BOOTCONFIG 변수를 사용하여 새 bootconfig 매개변수를 추가합니다.
    2. 커널 cmdline 매개변수를 그대로 유지하여 기기가 계속 올바르게 부팅될 수 있도록 합니다. 이렇게 하면 디버깅과 유효성 검사가 훨씬 쉬워집니다.
  2. /proc/bootconfig의 콘텐츠를 확인하여 작업을 확인합니다. 기기가 부팅된 후 새로 추가된 매개변수가 표시되는지 확인합니다.
  3. BOARD_BOOTCONFIG 변수와 부트로더를 사용하여 androidboot.* 매개변수를 커널 cmdline에서 bootconfig로 이동합니다.
  4. 각 매개변수가 /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를 참고하세요.