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로 업데이트(또는 uprevs)합니다. 두 번째는 두 가지 작업을 수행합니다. bootconfig 처리를 추가하고 런타임에 매개변수를 추가하는 방법을 보여줍니다.

빌드 예제

공급업체 부트 헤더 v4로 vendor_boot.img 를 빌드하기 위한 mkbootimg 변경 사항을 보여주는 빌드 예제는 bootconfig에 대한 mkbootimg changes for 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 레이아웃 정보를 가져옵니다.

Diagram of bootconfig memory allocation layout

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

다음은 유효성 검사와 함께 증분 구현을 위한 단계입니다.

  1. 부트로더와 빌드를 변경 하고 다음을 수행합니다.
    1. BOARD_BOOTCONFIG 변수를 사용하여 새 bootconfig 매개변수를 추가합니다.
    2. 장치가 계속해서 올바르게 부팅할 수 있도록 커널 cmdline 매개변수를 그대로 유지하십시오. 이렇게 하면 디버깅 및 유효성 검사가 훨씬 쉬워집니다.
  2. /proc/bootconfig 의 내용을 확인 하여 작업을 확인합니다. 장치가 부팅된 후 새로 추가된 매개변수가 표시되는지 확인합니다.
  3. BOARD_BOOTCONFIG 변수와 부트로더를 사용하여 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 를 보십시오.