기호 목록 사용 방법

안정적으로 유지해야 하는 기호와 유형의 노출 영역을 줄이기 위해 GKI 커널에는 내보내는 기호를 모듈에 필요한 기호로만 한정하는 기능이 있습니다. 외부에서 컴파일된 모듈을 GKI 커널에서 내보낼 수 있으려면 사용된 기호 목록이 필요합니다. 예를 들어 Cuttlefish용 모듈에 사용되는 기호는 android/abi_gki_aarch64_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:android/abi_gki_<arch>_<device> 형식이어야 합니다. 관련 예는 common-modules/virtual-device/BUILD.bazel을 참고하세요.

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

초기 기호 목록 생성 및 제출

common/android/abi_gki_<arch>_<device>에 빈 기호 목록을 생성합니다. 위 예의 경우 명령어는 다음과 같습니다.

touch common/android/abi_gki_aarch64_virtual_device

이 파일을 기본 GKI 커널 빌드의 additional_kmi_symbol_lists에 추가합니다. 예를 들어 //common:android/abi_gki_aarch64_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.report.short 보고서를 사용할 수 있습니다.

기호 목록 업데이트를 보내기 전에 참조 ABI 표현 업데이트가 필요하지 않더라도 업데이트를 진행하면 추가 사전 제출 단계가 필요하지 않아 변경 사항을 더 빨리 제출할 수 있습니다. 어떤 경우이든 사전 제출 과정에서 필요에 따라 확인되고 업데이트됩니다.

이전 버전(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에 기호 목록 업데이트를 전송합니다.