네이티브 라이브러리의 네임스페이스

Android 7.0에는 내부 API 가시성을 제한하고 앱이 실수로 자체 플랫폼 라이브러리 대신 플랫폼 라이브러리를 사용하는 상황을 해결하기 위해 네이티브 라이브러리용 네임스페이스가 도입되었습니다. 애플리케이션별 변경 사항은 Android 7.0의 비공개 C/C++ 기호 제한으로 안정성 향상 Android 개발자 블로그 게시물을 참조하세요.

건축학

Android 7.0 이상에서는 시스템 라이브러리가 앱 라이브러리와 분리됩니다.

네이티브 라이브러리의 네임스페이스

그림 1. 네이티브 라이브러리의 네임스페이스

네이티브 라이브러리의 네임스페이스는 앱이 프라이빗 플랫폼 네이티브 API를 사용하는 것을 방지합니다(OpenSSL에서와 마찬가지로). 또한 앱이 실수로 자신의 플랫폼 라이브러리 대신 플랫폼 라이브러리를 사용하는 상황을 제거합니다( libpng 에서 목격됨). 앱 라이브러리가 실수로 내부 시스템 라이브러리를 사용하는 것은 어렵습니다(그 반대의 경우도 마찬가지).

추가 네이티브 라이브러리 추가

표준 공개 네이티브 라이브러리 외에도 실리콘 공급업체(Android 7.0부터) 및 기기 제조업체(Android 9부터)는 해당 라이브러리 폴더 아래에 배치하고 .txt에 명시적으로 나열하여 앱에 액세스할 수 있는 추가 네이티브 라이브러리를 제공하도록 선택할 수 있습니다. 파일.

라이브러리 폴더는 다음과 같습니다.

  • 실리콘 공급업체 라이브러리의 경우 /vendor/lib (32비트용) 및 /vendor/lib64 (64비트용)
  • 장치 제조업체의 라이브러리용 /system/lib (32비트용) 및 /system/lib64 (64비트용)

.txt 파일은 다음과 같습니다.

  • 실리콘 공급업체의 라이브러리에 대한 /vendor/etc/public.libraries.txt
  • /system/etc/public.libraries-COMPANYNAME.txt 는 장치 제조업체의 라이브러리입니다. 여기서 COMPANYNAME 제조업체 이름(예: awesome.company )을 나타냅니다. COMPANYNAME [A-Za-z0-9_.-]+ 와 일치해야 합니다. 영숫자, _, . (점) 그리고 -. 일부 라이브러리가 외부 솔루션 공급자로부터 제공되는 경우 장치에 이러한 .txt 파일이 여러 개 있을 수 있습니다.

기기 제조업체에서 공개한 system 파티션의 네이티브 라이브러리 이름은 반드시 lib*COMPANYNAME.so 로 지정 해야 합니다 (예: libFoo.awesome.company.so ). 즉, 회사 이름 접미사가 없는 libFoo.so 공개되어서는 안 됩니다. 라이브러리 파일 이름의 COMPANYNAME 라이브러리 이름이 나열된 txt 파일 이름의 COMPANYNAME 과 일치해야 합니다.

AOSP의 일부인 네이티브 라이브러리는 공개되어서는 안 됩니다(기본적으로 공개되는 표준 공개 네이티브 라이브러리 제외). 실리콘 공급업체 또는 장치 제조업체가 추가한 추가 라이브러리만 앱에 액세스할 수 있습니다.

Android 8.0부터 공급업체 공개 라이브러리에는 다음과 같은 추가 제한사항과 필수 설정이 있습니다.

  1. 공급업체의 네이티브 라이브러리는 앱에서 액세스할 수 있도록 적절하게 레이블이 지정되어야 합니다. 앱(타사 앱 포함)에서 액세스가 필요한 경우 다음과 같이 공급업체별 file_contexts 파일에서 라이브러리에 same_process_hal_file 이라는 라벨을 지정해야 합니다.
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    여기서 libnative.so 는 기본 라이브러리의 이름입니다.
  2. 라이브러리는 직접적으로든 종속성을 통해 전이적으로든 VNDK-SP 및 LLNDK 라이브러리 이외의 시스템 라이브러리에 종속되어서는 안 됩니다. development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv 에서 VNDK-SP 및 LLNDK 라이브러리 목록을 찾으세요.

Android 15(AOSP 실험용)부터 공급업체 공개 라이브러리를 공급업체 APEX 에 배치할 수 있습니다. 공급업체 APEX에 패키징된 경우 APEX 매니페스트의 provideNativeLibs 속성에 라이브러리를 나열합니다.

비공개 네이티브 라이브러리를 사용하지 않도록 앱 업데이트

이 기능은 SDK 버전 24 이상을 대상으로 하는 애플리케이션에서만 활성화됩니다. 이전 버전과의 호환성은 표 1을 참조하세요. 앱이 비공개 네이티브 라이브러리에 연결되는 경우 예상되는 사항 . 앱에 액세스할 수 있는 Android 네이티브 라이브러리(공용 네이티브 라이브러리라고도 함) 목록은 CDD 섹션 3.1.1에 나열되어 있습니다. 24 이상을 타겟팅하고 비공개 라이브러리를 사용하는 앱을 업데이트해야 합니다. 자세한 내용은 플랫폼 라이브러리에 연결하는 NDK 앱을 참조하세요.

네이티브 라이브러리 종속성을 위해 앱 업데이트

SDK 버전 31(Android 12) 이상을 대상으로 하는 애플리케이션은 앱 매니페스트에서 <uses-native-library> 태그를 사용하여 네이티브 공유 라이브러리 종속성을 명시적으로 지정 해야 합니다. 요청한 라이브러리의 일부가 기기에 없으면 앱이 설치되지 않습니다. 앱이 설치되면 요청한 기본 공유 라이브러리 제공됩니다. 즉, 앱은 앱 매니페스트에 표시되지 않는 기본 공유 라이브러리에 액세스할 수 없습니다.