Trình liên kết động giải quyết 2 thách thức trong thiết kế VNDK Treble:
- Các thư viện dùng chung SP-HAL và các phần phụ thuộc của chúng, bao gồm cả các thư viện VNDK-SP, được tải vào các quy trình khung. Cần có một số cơ chế để ngăn chặn xung đột biểu tượng.
dlopen()
vàandroid_dlopen_ext()
có thể giới thiệu một số phần phụ thuộc thời gian chạy không xuất hiện trong thời gian xây dựng và có thể khó phát hiện bằng cách sử dụng phân tích tĩnh.
Bạn có thể giải quyết hai thách thức này bằng cơ chế không gian tên trình liên kết. Cơ chế này do trình liên kết động cung cấp. Thư viện này có thể tách các thư viện dùng chung trong các không gian tên trình liên kết khác nhau để các thư viện có cùng tên thư viện nhưng có các biểu tượng khác nhau sẽ không xung đột.
Mặt khác, cơ chế không gian tên của trình liên kết mang lại sự linh hoạt để một số thư viện dùng chung có thể được một không gian tên của trình liên kết xuất và được một không gian tên khác của trình liên kết sử dụng. Các thư viện dùng chung đã xuất này có thể trở thành giao diện lập trình ứng dụng công khai cho các chương trình khác trong khi ẩn thông tin chi tiết về việc triển khai trong không gian tên của trình liên kết.
Ví dụ: /system/lib[64]/libcutils.so
và /system/lib[64]/vndk-sp-${VER}/libcutils.so
là hai thư viện dùng chung. Hai thư viện này có thể có các biểu tượng khác nhau. Các thư viện này được tải vào các không gian tên trình liên kết khác nhau để các mô-đun khung có thể phụ thuộc vào /system/lib[64]/libcutils.so
và các thư viện dùng chung SP-HAL có thể phụ thuộc vào /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
Mặt khác, /system/lib[64]/libc.so
là một ví dụ về thư viện công khai được xuất bởi một không gian tên của trình liên kết và được nhập vào nhiều không gian tên của trình liên kết. Các phần phụ thuộc của /system/lib[64]/libc.so
, chẳng hạn như libnetd_client.so
, được tải vào không gian tên mà /system/lib[64]/libc.so
cư trú. Các không gian tên khác sẽ không có quyền truy cập vào những phần phụ thuộc đó. Cơ chế này đóng gói thông tin triển khai trong khi cung cấp các giao diện công khai.
Cách thức hoạt động
Trình liên kết động chịu trách nhiệm tải các thư viện dùng chung được chỉ định trong các mục DT_NEEDED
hoặc các thư viện dùng chung được chỉ định theo đối số của dlopen()
hoặc android_dlopen_ext()
. Trong cả hai trường hợp, trình liên kết động sẽ tìm không gian tên trình liên kết nơi người gọi cư trú và cố gắng tải các phần phụ thuộc vào cùng một không gian tên trình liên kết. Nếu trình liên kết động không thể tải thư viện dùng chung vào không gian tên trình liên kết đã chỉ định, thì trình liên kết này sẽ yêu cầu không gian tên trình liên kết được liên kết cho các thư viện dùng chung đã xuất.
Định dạng tệp cấu hình
Định dạng tệp cấu hình dựa trên định dạng tệp INI. Một tệp cấu hình thông thường có dạng như sau:
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}
Tệp cấu hình bao gồm:
- Một số thuộc tính ánh xạ phần thư mục ở phần đầu để trình liên kết động chọn phần hiệu quả.
-
Một số mục cấu hình không gian tên của trình liên kết:
- Mỗi phần chứa một số không gian tên (đỉnh đồ thị) và một số đường liên kết dự phòng giữa các không gian tên (cung đồ thị).
- Mỗi không gian tên có chế độ cách ly, đường dẫn tìm kiếm, đường dẫn được phép và chế độ cài đặt hiển thị riêng.
Các bảng dưới đây mô tả chi tiết ý nghĩa của từng thuộc tính.
Thuộc tính liên kết phần thư mục
Thuộc tính | Mô tả | Ví dụ |
---|---|---|
|
Đường dẫn đến một thư mục mà phần Mỗi thuộc tính ánh xạ các tệp thực thi trong thư mục đến một phần cấu hình không gian tên của trình liên kết. Có thể có hai (hoặc nhiều) thuộc tính có cùng |
Điều này cho biết cấu hình được chỉ định trong phần Cấu hình được chỉ định trong phần |
Thuộc tính mối quan hệ
Thuộc tính | Mô tả | Ví dụ |
---|---|---|
additional. |
Danh sách các không gian tên bổ sung được phân tách bằng dấu phẩy (ngoài không gian tên |
Điều này cho biết có 3 không gian tên ( |
namespace. |
Danh sách các không gian tên dự phòng được phân tách bằng dấu phẩy. Nếu không tìm thấy thư viện dùng chung trong không gian tên hiện tại, trình liên kết động sẽ cố gắng tải thư viện dùng chung từ các không gian tên dự phòng. Không gian tên được chỉ định ở đầu danh sách có mức độ ưu tiên cao hơn. |
Nếu một thư viện dùng chung hoặc một tệp thực thi yêu cầu một thư viện dùng chung không thể tải vào không gian tên Sau đó, nếu không tải được thư viện dùng chung từ không gian tên Cuối cùng, nếu tất cả các lần thử đều không thành công, trình liên kết động sẽ trả về lỗi. |
namespace. |
Một danh sách các thư viện dùng chung được phân tách bằng dấu hai chấm mà bạn có thể tìm kiếm trong các vùng chứa tên Bạn không thể sử dụng thuộc tính này với |
Điều này cho biết đường liên kết dự phòng chỉ chấp nhận |
namespace. |
Giá trị boolean cho biết liệu bạn có thể tìm kiếm tất cả các thư viện dùng chung trong không gian tên Bạn không thể sử dụng thuộc tính này với |
Điều này cho biết tất cả tên thư viện đều có thể đi qua đường liên kết dự phòng từ vùng chứa tên |
Thuộc tính không gian tên
Thuộc tính | Mô tả | Ví dụ |
---|---|---|
namespace. |
Giá trị boolean cho biết trình liên kết động có nên kiểm tra vị trí của thư viện dùng chung hay không. Nếu Nếu |
Điều này cho biết rằng chỉ các thư viện dùng chung trong |
namespace. |
Danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm các thư viện dùng chung. Các thư mục được chỉ định trong Khi Ví dụ: nếu |
Điều này cho biết trình liên kết động tìm kiếm |
namespace. |
Danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm các thư viện dùng chung khi AddressSanitizer (ASan) được bật.
|
Điều này cho biết rằng khi ASan được bật, trình liên kết động sẽ tìm kiếm |
namespace. |
Một danh sách các thư mục (bao gồm cả thư mục con) được phân tách bằng dấu hai chấm, trong đó trình liên kết động có thể tải các thư viện dùng chung (ngoài Bạn cũng có thể tải các thư viện dùng chung nằm trong các thư mục con của Nếu |
Điều này cho biết rằng các thư viện dùng chung trong Ví dụ: nếu không có |
namespace. |
Danh sách các thư mục được phân tách bằng dấu hai chấm mà trình liên kết động có thể tải các thư viện dùng chung khi ASan được bật.
|
Điều này cho biết rằng khi ASan được bật, các thư viện dùng chung trong |
namespace. |
Giá trị boolean cho biết chương trình (ngoài Nếu Nếu |
Điều này cho biết |
Tạo không gian tên của trình liên kết
Trong Android 11, cấu hình trình liên kết được tạo trong thời gian chạy trong /linkerconfig
thay vì sử dụng các tệp văn bản thuần tuý trong ${android-src}/system/core/rootdir/etc
. Cấu hình được tạo tại thời điểm khởi động dựa trên môi trường thời gian chạy, bao gồm các mục sau:
- Nếu thiết bị hỗ trợ VNDK
- Phiên bản VNDK mục tiêu của phân vùng nhà cung cấp
- Phiên bản VNDK của phân vùng sản phẩm
- Các mô-đun APEX đã cài đặt
Cấu hình trình liên kết được tạo bằng cách phân giải các phần phụ thuộc giữa các không gian tên trình liên kết. Ví dụ: nếu có bất kỳ bản cập nhật nào về các mô-đun APEX bao gồm cả bản cập nhật phần phụ thuộc, thì cấu hình trình liên kết sẽ được tạo để phản ánh những thay đổi này. Bạn có thể xem thêm thông tin chi tiết về cách tạo cấu hình trình liên kết trong ${android-src}/system/linkerconfig
.
Cách ly không gian tên của trình liên kết
Có 3 loại cấu hình. Tuỳ thuộc vào giá trị của PRODUCT_TREBLE_LINKER_NAMESPACES
và BOARD_VNDK_VERSION
trong BoardConfig.mk
, cấu hình tương ứng sẽ được tạo tại thời điểm khởi động.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Cấu hình đã chọn | Yêu cầu về VTS |
---|---|---|---|
true |
current |
VNDK |
Bắt buộc đối với những thiết bị chạy Android 9 trở lên |
Trống | VNDK Lite |
Bắt buộc đối với các thiết bị chạy Android 8.x | |
false |
Trống | Legacy |
Đối với thiết bị không phải Treble |
Cấu hình VNDK Lite tách biệt các thư viện dùng chung SP-HAL và VNDK-SP. Trong Android 8.0, đây phải là tệp cấu hình cho trình liên kết động khi PRODUCT_TREBLE_LINKER_NAMESPACES
là true
.
Cấu hình VNDK cũng tách biệt các thư viện dùng chung SP-HAL và VNDK-SP. Ngoài ra, cấu hình này còn cung cấp khả năng cô lập trình liên kết động hoàn toàn. Điều này đảm bảo rằng các mô-đun trong phân vùng hệ thống sẽ không phụ thuộc vào các thư viện dùng chung trong phân vùng nhà cung cấp và ngược lại.
Trong Android 8.1 trở lên, cấu hình VNDK là cấu hình mặc định và bạn nên bật chế độ cách ly trình liên kết động hoàn toàn bằng cách đặt BOARD_VNDK_VERSION
thành current
.
Cấu hình VNDK
Cấu hình VNDK tách biệt các phần phụ thuộc của thư viện dùng chung giữa phân vùng hệ thống và phân vùng nhà cung cấp. So với các cấu hình được đề cập trong tiểu mục trước, sự khác biệt được nêu như sau:
-
Quy trình khung
- Không gian tên
default
,vndk
,sphal
vàrs
được tạo. - Tất cả các không gian tên đều được tách biệt.
- Các thư viện dùng chung của hệ thống được tải vào vùng chứa tên
default
. - SP-HAL được tải vào vùng chứa tên
sphal
. - Các thư viện dùng chung VNDK-SP được tải vào không gian tên
vndk
.
- Không gian tên
-
Quy trình của nhà cung cấp
- Không gian tên
default
,vndk
vàsystem
được tạo. - Không gian tên
default
được tách biệt. - Các thư viện dùng chung của nhà cung cấp được tải vào vùng chứa tên
default
. - Các thư viện dùng chung VNDK và VNDK-SP được tải vào vùng chứa tên
vndk
. - LL-NDK và các phần phụ thuộc của nó được tải vào không gian tên
system
.
- Không gian tên
Mối quan hệ giữa các không gian tên của trình liên kết được minh hoạ bên dưới.

Trong hình ảnh ở trên, LL-NDK và VNDK-SP là viết tắt của các thư viện dùng chung sau đây:
-
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
Bạn có thể xem thêm thông tin chi tiết trong /linkerconfig/ld.config.txt
trên thiết bị.
Cấu hình VNDK Lite
Kể từ Android 8.0, trình liên kết động được định cấu hình để tách biệt các thư viện dùng chung SP-HAL và VNDK-SP sao cho các biểu tượng của chúng không xung đột với các thư viện dùng chung khác của khung. Mối quan hệ giữa các không gian tên của trình liên kết được thể hiện bên dưới.

LL-NDK và VNDK-SP là viết tắt của các thư viện dùng chung sau:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(không có trong cấu hình)libsync.so
libvndksupport.so
libz.so
(đã chuyển sang VNDK-SP trong cấu hình)
-
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
Bảng dưới đây liệt kê cấu hình không gian tên cho các quy trình của khung, được trích từ phần [system]
trong cấu hình VNDK Lite.
Vùng chứa tên | Thuộc tính | Giá trị |
---|---|---|
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 (đối với 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 (đối với 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 (đối với nhân RS đã biên dịch)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
Bảng dưới đây trình bày cấu hình không gian tên cho các quy trình của nhà cung cấp, được trích từ phần [vendor]
trong cấu hình VNDK Lite.
Vùng chứa tên | Thuộc tính | Giá trị |
---|---|---|
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} (không dùng nữa)/product/${LIB} (không dùng nữa)
|
isolated |
false |
Bạn có thể xem thêm thông tin chi tiết trong /linkerconfig/ld.config.txt
trên thiết bị.
Nhật ký tài liệu
Các thay đổi về Android 11
- Trong Android 11, các tệp
ld.config.*.txt
tĩnh sẽ bị xoá khỏi cơ sở mã và LinkerConfig sẽ tạo các tệp đó trong thời gian chạy.
Các thay đổi về Android 9
- Trong Android 9, không gian tên trình liên kết
vndk
được thêm vào các quy trình của nhà cung cấp và các thư viện dùng chung VNDK được tách biệt với không gian tên trình liên kết mặc định. - Thay thế
PRODUCT_FULL_TREBLE
bằngPRODUCT_TREBLE_LINKER_NAMESPACES
cụ thể hơn. - Android 9 thay đổi tên của các tệp cấu hình trình liên kết động sau đây.
Android 8.x Android 9 Mô tả ld.config.txt.in
ld.config.txt
Đối với các thiết bị có tính năng tách biệt không gian tên trình liên kết thời gian chạy ld.config.txt
ld.config.vndk_lite.txt
Đối với các thiết bị có tính năng cô lập không gian tên trình liên kết VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Đối với các thiết bị cũ chạy Android 7.x trở xuống - Xoá
android.hardware.graphics.allocator@2.0.so
. - Đã thêm các phân vùng
product
vàodm
.