기호 목록 사용

안정적으로 유지해야 하는 기호와 유형의 노출 영역을 줄이기 위해 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_grouping

    True이거나 지정되지 않은 경우 기호 목록은 기호를 참조하는 커널 모듈에 따라 기호를 그룹화합니다. 그 외의 경우에는 기호 목록은 모든 커널 모듈에 사용된 기호의 정렬 목록입니다.

예를 보려면 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_devicecommon/BUILD.bazel에 선언된 aarch64_additional_kmi_symbol_lists 파일 그룹에 추가됩니다.

기기 기호 목록을 업데이트하여 새 기호 목록을 채우고 그 목록을 Android 공통 커널 저장소에 보냅니다.

기기 기호 목록 업데이트

kernel_buildmodule_outskernel_abikernel_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_list

ACK에 기호 목록 업데이트 전송

새 기호를 KMI의 일부로 만들기 위해 기호 목록 변경 사항이 포함된 패치를 Android 공통 커널 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에는 다음 구성 옵션이 포함되어야 합니다.

  • vmlinux

    FILES 목록의 일부여야 합니다. 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.aarch64ADDITIONAL_KMI_SYMBOL_LISTS에 포함되어 있는지 확인합니다.

  • ACK에 기호 목록 업데이트를 전송합니다.