Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

링커 네임스페이스

동적 링커는 트레블 VNDK 설계의 두 가지 문제점을 해결합니다.

  • VNDK-SP 라이브러리를 비롯한 SP-HAL 공유 라이브러리 및 종속 항목이 프레임워크 프로세스에 로드되며, 기호 충돌 방지를 위한 어떤 메커니즘이 있어야 합니다.
  • dlopen()android_dlopen_ext()는 빌드 시간에는 보이지 않으며 정적 분석을 사용하여 감지하기가 어려운 런타임 종속 항목을 일으킬 수 있습니다.

이러한 두 가지 문제는 링커 네임스페이스 메커니즘으로 해결할 수 있습니다. 링커 네임스페이스 메커니즘은 동적 링커에 의해 제공됩니다. 동적 링커는 라이브러리 이름은 같지만 기호는 다른 라이브러리가 충돌하지 않도록 여러 링커 네임스페이스의 공유 라이브러리를 격리할 수 있습니다.

한편 링커 네임스페이스 메커니즘은 유연성을 제공하여 링커 네임스페이스에서 일부 공유 라이브러리를 내보내고 다른 링커 네임스페이스에서 이러한 라이브러리를 사용할 수 있도록 합니다. 이렇게 내보낸 공유 라이브러리는 다른 프로그램에 공개되는 동시에 링커 네임스페이스 내에 구현 세부정보를 숨기는 애플리케이션 프로그래밍 인터페이스가 될 수 있습니다.

예를 들어 /system/lib[64]/libcutils.so/system/lib[64]/vndk-sp-${VER}/libcutils.so는 두 개의 공유 라이브러리입니다. 두 라이브러리는 서로 다른 기호를 보유할 수 있으며, 프레임워크 모듈이 /system/lib[64]/libcutils.so에, SP-HAL 공유 라이브러리가 /system/lib[64]/vndk-sp-${VER}/libcutils.so에 종속될 수 있도록 서로 다른 링커 네임스페이스에 로드됩니다.

반면에 /system/lib[64]/libc.so는 링커 네임스페이스에 의해 내보내기되어 다수의 링커 네임스페이스로 가져오기되는 공개 라이브러리의 예입니다. libnetd_client.so와 같은 /system/lib[64]/libc.so의 종속 항목은 /system/lib[64]/libc.so가 상주하는 네임스페이스에 로드됩니다. 다른 네임스페이스는 이러한 종속 항목에 액세스할 수 없습니다. 이러한 메커니즘은 구현 세부정보를 캡슐화하는 동시에 공개 인터페이스를 제공합니다.

작동 원리

동적 링커는 DT_NEEDED 항목에 지정된 공유 라이브러리나 dlopen() 또는 android_dlopen_ext()의 인수에 의해 지정된 공유 라이브러리를 로드하는 역할을 합니다. 두 경우 모두, 동적 링커는 호출자가 상주하는 링커 네임스페이스를 찾은 다음 종속 항목을 동일한 링커 네임스페이스에 로드하려고 시도합니다. 공유 라이브러리를 지정된 링커 네임스페이스에 로드할 수 없는 경우 동적 링커는 링크된 링커 네임스페이스에 내보낸 공유 라이브러리를 요청합니다.

구성 파일 형식

구성 파일 형식은 INI 파일 형식에 기반하며, 일반적인 구성 파일은 다음과 같습니다.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

구성 파일에는 다음이 포함됩니다.

  • 동적 링커가 효과적인 섹션을 선택하게 하는 초반의 여러 디렉터리 섹션 매핑 속성
  • 여러 링커 네임스페이스 구성 섹션:
    • 각 섹션에는 여러 네임스페이스(그래프 꼭짓점) 및 네임스페이스 간의 여러 대체 링크(그래프 원호)가 포함됩니다.
    • 각 네임스페이스에는 자체적인 격리, 검색 경로, 허용 경로 및 공개 상태 설정이 포함됩니다.

아래 표에서는 각 속성의 의미에 관해 자세히 설명합니다.

디렉터리 섹션 매핑 속성

속성 설명

dir.name

[name] 섹션이 적용되는 디렉터리 경로입니다.

각 속성이 디렉터리 아래의 실행 프로그램을 링커 네임스페이스 구성 섹션에 매핑합니다. name은 같지만 다른 디렉터리를 가리키는 2개 이상의 속성이 존재할 수 있습니다.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system] 섹션에 지정된 구성이 /system/bin 또는 /system/xbin에서 로드된 실행 프로그램에 적용됨을 나타냅니다.

[vendor] 섹션에 지정된 구성이 /vendor/bin에서 로드된 실행 프로그램에 적용됩니다.

관계 속성

속성 설명
additional.namespaces

섹션의 추가 네임스페이스(default 네임스페이스 외)에 관한 쉼표로 구분된 목록입니다.

additional.namespaces = sphal,vndk

[system] 구성에 3개의 네임스페이스(default, sphal, vndk)가 있음을 나타냅니다.

namespace.name.links

쉼표로 구분된 대체 네임스페이스 목록입니다.

공유 라이브러리를 현재 네임스페이스에서 찾을 수 없는 경우 동적 링커는 대체 네임스페이스에서 공유 라이브러리를 로드하려고 시도합니다. 목록 초반에 지정된 네임스페이스의 우선순위가 더 높습니다.

namespace.sphal.links = default,vndk

공유 라이브러리 또는 실행 프로그램이 sphal 네임스페이스에 로드할 수 없는 공유 라이브러리를 요청하면 동적 링커는 default 네임스페이스에서 공유 라이브러리를 로드하려고 시도합니다.

이어서 공유 라이브러리를 default 네임스페이스에서도 로드할 수 없는 경우 동적 링커는 vndk 네임스페이스에서 공유 라이브러리를 로드하려고 시도합니다.

마지막으로 모든 시도에 실패하면 동적 링커가 오류를 반환합니다.

namespace.name.link.other.shared_libs

라이브러리를 name 네임스페이스에서 찾을 수 없을 때 other 네임스페이스에서 검색될 수 있는 콜론으로 구분된 공유 라이브러리 목록입니다.

이 속성은 namespace.name.link.other.allow_all_shared_libs와 함께 사용할 수 없습니다.

namespace.sphal.link.default.shared_libs = libc.so:libm.so

대체 링크가 libc.so 또는 libm.so만 요청된 라이브러리 이름으로 허용함을 나타냅니다. 동적 링커는 요청된 라이브러리 이름이 libc.so 또는 libm.so가 아니면 default 네임스페이스 관련 sphal의 대체 링크를 무시합니다.

namespace.name.link.other.allow_all_shared_libs

name 네임스페이스에서 라이브러리를 찾을 수 없을 때 other 네임스페이스에서 모든 공유 라이브러리를 검색하도록 할지 나타내는 부울 값입니다.

이 속성은 namespace.name.link.other.shared_libs와 함께 사용할 수 없습니다.

namespace.vndk.link.sphal.allow_all_shared_libs = true

모든 라이브러리 이름이 vndk에서 sphal 네임스페이스까지의 대체 링크를 통과할 수 있음을 나타냅니다.

네임스페이스 속성

속성 설명
namespace.name.isolated

동적 링커가 공유 라이브러리 상주 위치를 확인해야 할지를 나타내는 부울 값입니다.

isolatedtruesearch.paths 디렉터리(하위 디렉터리 제외) 중 하나에 있거나 permitted.paths 디렉터리(하위 디렉터리 포함) 중 하나 아래에 위치한 공유 라이브러리만 로드할 수 있습니다.

isolatedfalse(기본값)면 동적 링커는 공유 라이브러리의 경로를 확인하지 않습니다.

namespace.sphal.isolated = true

search.pathspermitted.paths 아래의 공유 라이브러리만 sphal 네임스페이스에 로드될 수 있음을 나타냅니다.

namespace.name.search.paths

공유 라이브러리 검색을 위한 콜론으로 구분된 디렉터리 목록입니다.

search.paths에 지정된 디렉터리는 dlopen() 또는 DT_NEEDED 항목의 함수 호출이 전체 경로를 지정하지 않는 경우 요청된 라이브러리 이름 앞에 추가됩니다. 목록 초반에 지정된 디렉터리의 우선순위가 더 높습니다.

isolatedtruesearch.paths 디렉터리(하위 디렉터리 제외) 중 하나에 있는 공유 라이브러리는 permitted.paths 속성과 관계없이 로드할 수 있습니다.

예를 들어 search.paths/system/${LIB}이고 permitted.paths가 비어 있으면 /system/${LIB}/libc.so를 로드할 수 있지만 /system/${LIB}/vndk/libutils.so는 로드할 수 없습니다.

namespace.default.search.paths = /system/${LIB}

동적 링커가 /system/${LIB}에서 공유 라이브러리를 검색함을 나타냅니다.

namespace.name.asan.search.paths

Address Sanitizer가 사용 설정되었을 때 공유 라이브러리를 검색하기 위한 콜론으로 구분된 디렉터리 목록입니다.

Address Sanitizer가 사용 설정되면 namespace.name.search.paths가 무시됩니다.

namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}

Address Sanitizer가 사용 설정되면 동적 링커가 /data/asan/system/${LIB}를 먼저 검색한 다음 이어서 /system/${LIB}를 검색함을 나타냅니다.

namespace.name.permitted.paths

isolatedtrue일 때 동적 링커가 공유 라이브러리(search.paths 외에 추가로)를 로드할 수 있는 콜론으로 구분된 디렉터리 목록(하위 디렉터리 포함)입니다. .

permitted.paths의 하위 디렉터리 아래에 위치한 공유 라이브러리도 로드할 수 있습니다. 예를 들어 permitted.paths/system/${LIB}이면 /system/${LIB}/libc.so/system/${LIB}/vndk/libutils.so를 둘 다 로드할 수 있습니다.

isolatedfalsepermitted.paths가 무시되고 경고가 표시됩니다.

namespace.default.permitted.paths = /system/${LIB}/hw

/system/${LIB}/hw 아래의 공유 라이브러리는 격리된 default 네임스페이스에 로드될 수 있음을 나타냅니다.

예를 들어 permitted.paths가 없으면 libaudiohal.so/system/${LIB}/hw/audio.a2dp.default.sodefault 네임스페이스에 로드할 수 없습니다.

namespace.name.asan.permitted.paths

Address Sanitizer가 사용 설정되었을 때 동적 링커가 공유 라이브러리를 로드할 수 있는 콜론으로 구분된 디렉터리 목록입니다.

Address Sanitizer가 사용 설정되면 namespace.name.permitted.paths가 무시됩니다.

namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

Address Sanitizer가 사용 설정되면 /data/asan/system/${LIB}/hw 또는 /system/${LIB}/hw 아래의 공유 라이브러리를 격리된 default 네임스페이스에 로드할 수 있음을 나타냅니다.

namespace.name.visible

libc 외의 프로그램이 android_get_exported_namespace()로 링커 네임스페이스 핸들을 획득하고 핸들을 android_dlopen_ext()에 전달하여 링커 네임스페이스의 공유 라이브러리를 열 수 있는지를 나타내는 부울 값입니다.

visibletrueandroid_get_exported_namespace()는 네임스페이스가 존재하는 경우 항상 핸들을 반환합니다.

visiblefalse(기본값)면 android_get_exported_namespace()는 네임스페이스의 존재 여부와 상관없이 항상 NULL을 반환합니다. 공유 라이브러리는 (1) 이 네임스페이스에 관한 대체 링크를 보유한 다른 링커 네임스페이스에 의해 요청되었거나 (2) 이 네임스페이스의 다른 공유 라이브러리 또는 실행 프로그램에 의해 요청된 경우에만 이 네임스페이스에 로드할 수 있습니다.

namespace.sphal.visible = true

android_get_exported_namespace("sphal")가 유효한 링커 네임스페이스 핸들을 반환할 수 있음을 나타냅니다.

링커 네임스페이스 격리

${android-src}/system/core/rootdir/etc에는 3개의 구성 파일이 있습니다. PRODUCT_TREBLE_LINKER_NAMESPACES, BOARD_VNDK_VERSION, BoardConfig.mk 값에 따라 다른 구성이 선택됩니다.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
선택된 구성 VTS 요구사항
true current ld.config.txt Android P로 출시되는 기기의 경우 필수입니다.
표시 없음 ld.config.vndk_lite.txt Android 8.x로 출시되는 기기의 경우 필수입니다.
false 표시 없음 ld.config.legacy.txt 비 트레블 기기에 사용됩니다.

${android-src}/system/core/rootdir/etc/ld.config.vndk_lite.txt는 SP-HAL 및 VNDK-SP 공유 라이브러리를 격리합니다. Android 8.0 이상에서는 PRODUCT_TREBLE_LINKER_NAMESPACEStrue면 동적 링커의 구성 파일이어야 합니다.

${android-src}/system/core/rootdir/etc/ld.config.txt는 SP-HAL 및 VNDK-SP 공유 라이브러리도 격리합니다. 또한, ld.config.txt 역시 전체 동적 링커 격리 기능을 제공하며, 시스템 파티션의 모듈과 공급업체 파티션의 공유 라이브러리가 서로에 종속되지 않도록 합니다.

Android 8.1에서는 ld.config.txt가 기본 구성 파일이며 BOARD_VNDK_VERSIONcurrent로 설정하여 전체 동적 링커 격리를 사용 설정하는 것이 좋습니다.

ld.config.txt

ld.config.txt는 시스템 파티션과 공급업체 파티션 간의 공유 라이브러리 종속 항목을 격리합니다. 이전 하위 섹션에서 언급한 ld.config.txt와 비교하면, 차이점이 아래 항목으로 추려집니다.

  • 프레임워크 프로세스

    • 4개의 네임스페이스(default, vndk, sphal, rs)가 생성됩니다.
    • 모든 네임스페이스가 격리됩니다.
    • 시스템 공유 라이브러리는 default 네임스페이스에 로드됩니다.
    • SP-HAL은 sphal 네임스페이스에 로드됩니다.
    • VNDK-SP 공유 라이브러리는 vndk 네임스페이스에 로드됩니다.
  • 공급업체 프로세스

    • 3개의 네임스페이스(default, vndk, system)가 생성됩니다.
    • default 네임스페이스가 격리됩니다.
    • 공급업체 공유 라이브러리는 default 네임스페이스에 로드됩니다.
    • VNDK 및 VNDK-SP 공유 라이브러리는 vndk 네임스페이스에 로드됩니다.
    • LL-NDK 및 종속 항목은 system 네임스페이스에 로드됩니다.

링커 네임스페이스 간의 관계는 아래 그림에 묘사되어 있습니다.

ld.config.txt에 설명된 링커 네임스페이스 그래프
그림 1. 링커 네임스페이스 격리 (ld.config.txt)

위의 그래프에서 LL-NDKVNDK-SP는 다음과 같은 공유 라이브러리를 나타냅니다.

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

아래 표는 ld.config.txt[system] 섹션에서 발췌한 프레임워크 프로세스의 네임스페이스 구성을 나타냅니다.

네임스페이스 속성
default search.paths /system/${LIB}
/product/${LIB}
permitted.paths /system/${LIB}/drm
/system/${LIB}/extractors
/system/${LIB}/hw
/product/${LIB}
/system/framework
/system/app
/system/priv-app
/vendor/app
/vendor/priv-app
/odm/app
/odm/priv-app
/oem/app
/product/framework
/product/app
/product/priv-app
/data
/mnt/expand
isolated true
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs LL-NDK
link.vndk.shared_libs VNDK-SP
link.rs.shared_libs libRS_internal.so
vndk(VNDK-SP) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links sphal default
link.default.shared_libs LL-NDK
link.default.allow_all_shared_libs true
rs(Renderscript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data(컴파일된 RS 커널)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

아래 표는 ld.config.txt[vendor] 섹션에서 발췌한 공급업체 프로세스의 네임스페이스 구성을 나타냅니다.

네임스페이스 속성
default search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm
/vendor
isolated true
visible true
links vndk system
link.system.shared_libs LL-NDK
link.vndk.shared_libs VNDK, VNDK-SP(공급업체 사용 가능)
vndk search.paths /odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
isolated true
links default system
link.system.shared_libs LL-NDK
link.default.allow_all_shared_libs true
system search.paths /system/${LIB}
isolated false

자세한 내용은 ${android-src}/system/core/rootdir/etc/ld.config.txt를 참조하세요.

ld.config.vndk_lite.txt

Android 8.0부터는 SP-HAL 및 VNDK-SP 공유 라이브러리를 격리할 때 기호가 다른 프레임워크 공유 라이브러리와 충돌하지 않도록 동적 링커가 구성됩니다. 링커 네임스페이스 간의 관계는 아래에 나와 있습니다.

ld.config.vndk_lite.txt에 설명된 링커 네임스페이스 그래프
그림 2. 링커 네임스페이스 격리 (ld.config.vndk_lite.txt)

LL-NDKVNDK-SP는 다음과 같은 공유 라이브러리를 나타냅니다.

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so(ld.config.txt에 있지 않음)
    • libsync.so
    • libvndksupport.so
    • libz.so(ld.config.txtVNDK-SP로 이동됨)
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

아래 표는 ld.config.vndk_lite.txt[system] 섹션에서 발췌한 프레임워크 프로세스의 네임스페이스 구성을 나타냅니다.

네임스페이스 속성
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs LL-NDK
link.vndk.shared_libs VNDK-SP
link.rs.shared_libs libRS_internal.so
vndk(VNDK-SP) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs LL-NDK
rs(Renderscript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data(컴파일된 RS 커널)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

아래 표는 ld.config.vndk_lite.txt[vendor] 섹션에서 발췌한 공급업체 프로세스의 네임스페이스 구성을 나타냅니다.

네임스페이스 속성
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB}(지원 중단됨)
/product/${LIB}(지원 중단됨)
isolated false

자세한 내용은 ${android-src}/system/core/rootdir/etc/ld.config.vndk_lite.txt를 참조하세요.

문서 이력

Android P 변경사항

  • Android P에서는 vndk 링커 네임스페이스가 공급업체 프로세스에 추가되고 VNDK 공유 라이브러리가 기본 링커 네임스페이스에서 격리됩니다.

  • PRODUCT_FULL_TREBLE을 좀 더 구체적인 PRODUCT_TREBLE_LINKER_NAMESPACES로 교체하세요.

  • Android P에서는 다음과 같은 동적 링커 구성 파일의 이름이 변경됩니다.

    Android 8.x Android P 설명
    ld.config.txt.in ld.config.txt 런타임 링커 네임스페이스 격리를 포함하는 기기
    ld.config.txt ld.config.vndk_lite.txt VNDK-SP 링커 네임스페이스 격리를 포함하는 기기
    ld.config.legacy.txt ld.config.legacy.txt Android 7.x 이하를 실행하는 레거시 기기
  • android.hardware.graphics.allocator@2.0.so가 삭제됩니다.

  • productodm 파티션이 추가됩니다.