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