사전 빌드된 ABI 사용 검사기

Android 공유 라이브러리는 수시로 진화합니다. 사전 빌드된 바이너리를 최신 상태로 유지하려면 상당한 노력이 필요합니다. Android 9 이하에서는 삭제된 라이브러리나 ABI에 종속된 사전 빌드된 바이너리가 런타임 시에만 링크에 실패합니다. 개발자는 오래전에 사전 빌드된 바이너리를 찾으려면 로그를 추적해야 합니다. Android 10에는 기호 기반의 ABI 사용 검사기가 도입되었습니다. 검사기는 오래전에 사전 빌드된 바이너리를 빌드 시간에 감지할 수 있습니다. 따라서 공유 라이브러리 개발자가 어떤 사전 빌드된 바이너리가 자체 변경사항에 의해 손상되었는지, 어떤 사전 빌드된 바이너리를 다시 빌드해야 하는지 알 수 있습니다.

기호 기반의 ABI 사용 검사기

기호 기반의 ABI 사용 검사기는 호스트의 Android 동적 링커를 에뮬레이션합니다. 검사기는 사전 빌드된 바이너리를 사전 빌드된 바이너리의 종속 항목과 연결하고 정의되지 않은 모든 기호가 결정되었는지 확인합니다.

첫째, 검사기는 사전 빌드된 라이브러리의 타겟 아키텍처를 검사합니다. 사전 빌드된 바이너리가 ARM, AArch64, x86 또는 x86-64 아키텍처를 타겟팅하지 않으면 검사기는 사전 빌드된 바이너리를 건너뜁니다.

둘째, 사전 빌드된 바이너리의 종속 항목은 LOCAL_SHARED_LIBRARIES 또는 shared_libs에 나열되어야 합니다. 빌드 시스템은 모듈 이름을 공유 라이브러리의 일치하는 변형(즉, core vs. vendor)으로 결정합니다.

셋째, 검사기는 DT_NEEDED 항목을 LOCAL_SHARED_LIBRARIES 또는 shared_libs와 비교합니다. 특히, 검사기는 각 공유 라이브러리에서 DT_SONAME 항목을 추출하고 이러한 DT_SONAME을 사전 빌드된 바이너리에 기록된 DT_NEEDED 항목과 비교합니다. 불일치가 있는 경우 오류 메시지가 표시됩니다.

넷째, 검사기는 사전 빌드된 바이너리의 정의되지 않은 기호를 결정합니다. 이러한 정의되지 않은 기호는 종속 항목 중 하나에 정의되어야 하며 기호 결합은 GLOBAL 또는 WEAK여야 합니다. 정의되지 않은 기호를 결정할 수 없는 경우 오류 메시지가 표시됩니다.

모듈 속성 사전 빌드

사전 빌드된 바이너리의 종속 항목은 다음 중 하나에 지정되어야 합니다.

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

사전 빌드된 바이너리가 결정할 수 없는 정의되지 않은 기호를 보유하도록 설계된 경우 다음 중 하나를 지정합니다.

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

사전 빌드된 바이너리가 ELF 파일 검사를 건너뛰도록 하려면 다음 중 하나를 지정합니다.

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

검사기 실행

검사기를 실행하려면 환경 변수 CHECK_ELF_FILEStrue로 설정하고 make check-elf-files를 실행합니다.

CHECK_ELF_FILES=true make check-elf-files

기본적으로 검사기를 사용 설정하려면 PRODUCT_CHECK_ELF_FILESBoardConfig.mk에 추가합니다.

PRODUCT_CHECK_ELF_FILES := true

Android의 빌드 프로세스가 진행되는 동안 사전 빌드가 자동으로 검사됩니다.

make