안정적으로 유지해야 하는 기호와 유형의 노출 영역을 줄이기 위해 GKI 커널에는 내보내는 기호를 모듈에 필요한 기호로만 한정하는 기능이 있습니다. 외부에서 컴파일된 모듈을 GKI 커널에서 내보낼 수 있으려면 사용된 기호 목록이 필요합니다. 예를 들어 Cuttlefish용 모듈에 사용되는 기호는 gki/aarch64/symbols/virtual_device에 저장됩니다.
기호 목록 생성을 위한 타겟 추가
기호 목록은 kernel_abi 타겟에 의해 생성됩니다. 이 타겟을 다음 옵션을 사용하여 BUILD.bazel 기기에 추가합니다.
name<kernel_build>_abi형식이어야 합니다.kernel_build기기
kernel_build타겟의 이름을 포함해야 합니다.
다음 옵션을 사용할 수도 있습니다.
kernel_modules트리 외부 모듈을 위한 타겟 목록입니다. 트리 내 모듈은 여기에 포함하면 안 됩니다. 기호 추출을 위한 트리 내 모듈 준비를 참고하세요.
kmi_symbol_list_add_only이 옵션은 사용되지 않은 기호가 삭제되지 않도록 방지해 줍니다. 기호 삭제는 KMI 안정화 중 특정 시간에만 허용되고 KMI가 고정되었을 때는 허용되지 않습니다.
이는 다양한 기기에 같은 기호 목록을 사용할 때도 유용합니다. 이를 통해 기기 A에는 사용되었지만 B에는 사용되지 않는 기호가 삭제되지 않습니다.
module_groupingTrue이거나 지정되지 않은 경우 기호 목록은 기호를 참조하는 커널 모듈에 따라 기호를 그룹화합니다. 그 외의 경우에는 기호 목록은 모든 커널 모듈에 사용된 기호의 정렬 목록이 됩니다.
예를 보려면
common-modules/virtual-device/BUILD.bazel
을 참고하세요.
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
또한 Kleaf의 kernel_abi 타겟에 대한
참조 문서
도 참고하세요.
기호 추출을 위한 트리 내 모듈 준비
기호 추출을 위해 트리 내 모듈을 준비하려면 kernel_build 타겟의 module_outs 속성에 공급업체별 트리 내 모듈을 나열하세요. 예를 보려면 _VIRT_COMMON_MODULES와 사용법을 참고하세요. 이 목록에 GKI 모듈은 포함하지 마세요.
이러한 모듈을 unsigned가 되도록 구성합니다. 그러지 않으면 기호 목록이 비어 있을 수 있습니다. 이렇게 하려면 다음 줄을 커널 구성 프래그먼트에 추가합니다.
# CONFIG_MODULE_SIG_ALL is not set
예를 보려면
common-modules/virtual-device/virtual_device_core.fragment
참고하세요.
기기 커널 빌드에 기기 기호 목록 추가
속성 kmi_symbol_list를 기기 BUILD.bazel에 정의된 kernel_build 타겟에 추가합니다. 기호 목록의 이름은
//common:gki/<arch>/symbols/<device> 형식이어야 합니다.
예를 보려면
common-modules/virtual-device/BUILD.bazel,
을 참고하세요.
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
초기 기호 목록 생성 및 제출
common/gki/<arch>/symbols/<device>에 빈 기호 목록을 생성합니다. 위 예의 경우 명령어는 다음과 같습니다.
touch common/gki/aarch64/symbols/virtual_device이 파일을 기본 GKI 커널 빌드의 additional_kmi_symbol_lists에 추가합니다. 예를 들어 //common:gki/aarch64/symbols/virtual_device를
common/BUILD.bazel에 선언된
aarch64_additional_kmi_symbol_lists 파일 그룹에 추가합니다.
기기 기호 목록을 업데이트하여 새 기호 목록을 채우고 그 목록을 Android 공통 커널 저장소에 보냅니다.
기기 기호 목록 업데이트
kernel_build의 module_outs 및 kernel_abi의 kernel_modules에 있는 모듈에 사용되는 모든 코어 커널 기호는 기호 목록에 있어야 합니다. 이렇게 하려면 kernel_abi 타겟을 _update_symbol_list 접미사와 함께 실행하면 됩니다. 예를 들어 다음 명령어는 //common-modules/virtual-device:virtual_device_aarch64에 대한 기호 목록을 업데이트합니다.
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_listACK에 기호 목록 업데이트 전송
새 기호를 KMI의 일부로 만들기 위해 기호 목록 변경사항이 포함된 패치를 Android Common Kernel Gerrit에 전송합니다.
커밋 메시지에는 추가되거나 삭제된 기호의 목록이 포함되어야 합니다. 작은 기호 목록 업데이트의 경우 수동으로 이 목록을 작성하거나, 참조 ABI 표현을 업데이트한 후
$DIST_DIR/abi_stgdiff/abi.report.short 보고서를 사용할 수 있습니다.
기호 목록 업데이트를 보내기 전에 참조 ABI 표현 을 업데이트 하는 것이 필요하지 않더라도 업데이트를 진행하면 추가 사전 제출 단계가 필요하지 않아 변경 사항을 더 빨리 제출할 수 있습니다. 어떤 경우든 사전 제출 중에 필요한 경우 확인되고 업데이트됩니다.
기호 목록 작업 (Android 13)
Android 13은 Kleaf와 기존 빌드 스크립트를 모두 지원하므로 이전 섹션에 설명된 대로 또는 다음 섹션에 설명된 대로 기호 목록을 관리할 수 있습니다.
기호 목록 작업 (Android 12 이하)
build_abi.sh 도구를 다음과 같이 사용합니다.
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list이 예에서 build.config.device에는 다음 구성 옵션이 포함되어야 합니다.
vmlinuxFILES목록의 일부여야 합니다.build.config.aarch64를 포함하면 됩니다.KMI_SYMBOL_LIST업데이트하려면 설정하고 KMI 기호 목록을 가리켜야 합니다.
기기 기호 목록을 업데이트한 후 이러한 변경 내용을 GKI 빌드(common/build.config.gki.aarch64)에도 반영해야 합니다.
업데이트된 기호 목록을
common/android/abi_gki_aarch64_<device>에 복사합니다.android/abi_gki_aarch64_<device>가common/build.config.gki.aarch64의ADDITIONAL_KMI_SYMBOL_LISTS에 포함되어 있는지 확인합니다.