안정적으로 유지해야 하는 기호와 유형의 노출 영역을 줄이기 위해 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_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_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.aarch64
의ADDITIONAL_KMI_SYMBOL_LISTS
에 포함되어 있는지 확인합니다.