ABI 모니터링 실행 방법

이 섹션에서는 Android 커널 ABI 표현을 빌드하고 ABI 모니터링을 실행하는 방법을 설명합니다. 여기에서 설명하는 내용은 Android 14 이상에 적용됩니다. 이전 버전의 경우 이전 커널 버전을 참고하세요.

또한 Kleaf 관련 참조 문서인 지원 ABI 모니터링(GKI)지원 ABI 모니터링(기기)을 확인하세요.

커널 및 ABI 표현 빌드

GKI 소스를 다운로드한 후 다음 명령어를 실행하여 GKI 커널 및 ABI 아티팩트를 빌드하세요.

tools/bazel run //common:kernel_aarch64_abi_dist

이 명령어는 현재 ABI 표현을 빌드하고 빌드된 커널 및 모듈과 함께 out_abi/kernel_aarch64/dist/abi.stg에 이를 복사합니다.

-- 뒤의 명령어 끝에 ABI 도구의 추가 인수를 지정할 수 있습니다. 예를 들어 ABI의 대상을 변경하고 아티팩트를 빌드하려면 --dist_dir 옵션을 사용하면 됩니다.

tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist

빌드와 참조 표현 간의 ABI 차이 분석

위 명령어에서 실행된 //common:kernel_aarch64_abi_dist 타겟은 common/android/abi_gki_aarch64.stg(BUILD.bazel에서 정의됨)에 있는 빌드 및 참조 표현 간에 발견된 ABI 차이를 분석하고 보고합니다. 이러한 차이는 다음 예와 같이 빌드 끝부분에 출력됩니다.

INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!

출력된 보고서는 다른 형식의 보고서와 함께 out_abi/kernel_aarch64/dist/abi_stgdiff/abi.report.short에 있는 빌드 아티팩트에서 가져옵니다.

자동화는 빌드 명령어의 종료 코드를 사용해야 하며 이는 차이가 발견되면 0이 아닙니다.

android-mainline을 비롯한 개발 단계 브랜치에는 참조 ABI 표현이 없습니다. 참조 ABI 표현 없으면 //common:kernel_aarch64_abi_dist에서 어떠한 차이도 감지하지 못합니다.

참조 ABI 표현 업데이트

커널 ABI에 영향을 미치는 변경사항(예: 기호 목록 업데이트)은 참조 ABI 표현(common/android/abi_gki_aarch64.stg, BUILD.bazel에 정의됨)에 반영되어야 합니다. 이를 위해서는 다음 명령어를 실행해야 합니다.

​​tools/bazel run //common:kernel_aarch64_abi_update

이 명령어는 ABI 차이 분석 단계의 모든 작업을 실행하고 추가로 소스의 참조 표현을 업데이트합니다. 그러면 업데이트된 ABI는 변경사항과 동일한 커밋에 업로드될 수 있습니다. 보고서의 ABI 차이를 커밋 메시지의 $DIST_DIR/abi.report.short에 포함하세요.

ABI 모니터링 및 기기 타겟

ABI 모니터링은 핵심 커널 빌드 타겟에 관해서만 구성해야 합니다. GKI 커널로 직접 컴파일되는 혼합된 빌드 구성(base_kernel을 정의하는 빌드 구성)은 기기 기호 목록을 추적하는 지원만 추가하면 됩니다. ABI 정의는 GKI 빌드를 사용하여 업데이트되어야 합니다.

또한 Kleaf 관련 참조 문서인 지원 ABI 모니터링(기기)을 확인하세요.

이전 커널 버전

Android 13

빌드 안내는 ABI 형식이 XML이고 참조 ABI 표현이 common/android/abi_gki_aarch64.xml인 점을 제외하고 대부분 Android 14와 동일합니다.

Android 12 이하

Android 13과 마찬가지로 ABI 형식은 XML입니다.

이전 터널은 Kleaf 대신 build.sh를 사용합니다. ABI 모니터링의 경우 build_abi.sh를 사용해야 하며 이는 빌드를 맞춤설정하기 위해 build.sh와 동일한 환경 변수를 허용합니다. 예를 들면 다음과 같습니다.

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh

이렇게 하면 커널이 빌드되고 OUT_DIR(기본적으로 out_abi) 하위 디렉터리로 ABI 표현이 추출되며 Kleaf의 //common:kernel_aarch64_abi_dist 타겟과 동일하게 처리됩니다(빌드 커널 및 ABI 아티팩트 참고).

참고 ABI 표현은 common/build.config.gki.aarch64에서 ABI_DEFINITION 변수에 의해 정의된 바와 같이 android/abi_gki_aarch64.xml에 저장됩니다.

커널 ABI 표현을 업데이트해야 하는 경우 가장 쉬운 방법은 --update--print-report 옵션을 사용하는 것입니다.

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report

--print-report는 기존 파일과 새로 생성된 ABI 간 ABI 차이를 출력합니다.

--update 옵션은 참조 ABI 표현을 덮어씁니다. 또한 KMI_SYMBOL_LIST가 구성된 기기에 BUILD_CONFIG를 사용하는 경우에도 기호 목록을 업데이트합니다.