Trình liên kết động giải quyết hai thách thức trong thiết kế Treble VNDK:
- 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ả thư viện VNĐK-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ể đưa ra một số phần phụ thuộc thời gian chạy không hiển thị tại thời điểm 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.
Hai thách thức này có thể được giải quyết bằng cơ chế không gian tên của trình liên kết . Cơ chế này được cung cấp bởi trình liên kết động. Nó có thể tách biệt 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ó ký hiệu 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 cung cấp tính linh hoạt để một số thư viện dùng chung có thể được xuất bởi một không gian tên của trình liên kết và được sử dụng bởi một không gian tên của trình liên kết khác. Các thư viện chia sẻ đã xuất này có thể trở thành giao diện lập trình ứng dụng được công khai cho các chương trình khác trong khi ẩn chi tiết triển khai của chúng trong không gian tên trình liên kết của chúng.
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 ký hiệu khác nhau. Chúng đượ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 chia sẻ 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 cộng được xuất bởi một không gian tên trình liên kết và được nhập vào nhiều không gian tên 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 trong đó /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 các vùng phụ thuộc đó. Cơ chế này gói gọn các chi tiết triển khai trong khi cung cấp các giao diện công cộng.
Làm thế nào nó 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 bởi đối số của dlopen()
hoặc android_dlopen_ext()
. Trong cả hai trường hợp, trình liên kết động tìm thấy không gian tên của 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 của 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 của trình liên kết đã chỉ định, thì nó sẽ yêu cầu không gian tên của 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 tin 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 điển hình trông như thế này:
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 ở đầu để trình liên kết động chọn phần hiệu quả.
- Một số phần cấu hình không gian tên liên kết:
- Mỗi phần chứa một số không gian tên (đỉnh đồ thị) và một số 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ó sự cách ly, đường dẫn tìm kiếm, đường dẫn được phép và 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 ánh xạ phần thư mục
Tài sản | Sự miêu tả | Ví dụ |
---|---|---|
| Đường dẫn đến 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 tới 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 rằng cấu hình được chỉ định trong phần Cấu hình được chỉ định trong phần |
Thuộc tính quan hệ
Tài sản | Sự miêu tả | Ví dụ |
---|---|---|
additional. namespaces | 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 chỉ ra rằng có ba không gian tên ( |
namespace. name . links | 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 thể 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ố tải thư viện dùng chung từ 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 thư viện dùng chung hoặc tệp thực thi yêu cầu thư viện dùng chung không thể tải vào không gian tên Và sau đó, nếu thư viện dùng chung cũng không thể tải được từ không gian tên Cuối cùng, nếu tất cả các lần thử đều thất bại, trình liên kết động sẽ trả về lỗi. |
namespace. name . link. other . shared_libs | 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 có thể được tìm kiếm trong các không gian tên Thuộc tính này không thể được sử dụng với | Điều này cho biết rằng liên kết dự phòng chỉ chấp nhận |
namespace. name . link. other . allow_all_shared_libs | Một giá trị boolean cho biết liệu tất cả các thư viện dùng chung có thể được tìm kiếm trong không gian tên Thuộc tính này không thể được sử dụng với | Điều này chỉ ra rằng tất cả các tên thư viện có thể đi qua liên kết dự phòng từ |
Thuộc tính không gian tên
Tài sản | Sự miêu tả | Ví dụ |
---|---|---|
namespace. name . isolated | Một giá trị boolean cho biết liệu trình liên kết động có nên kiểm tra xem thư viện dùng chung nằm ở đâu hay không. Nếu Nếu | Điều này chỉ ra rằng chỉ các thư viện dùng chung trong |
namespace. name . search.paths | Danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm 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 rằng trình liên kết động tìm kiếm |
namespace. name . asan.search.paths | Danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm thư viện dùng chung khi bật Trình khử trùng địa chỉ (ASan) . | Điều này chỉ ra rằng khi ASan được bật, trình liên kết động sẽ tìm kiếm |
namespace. name . permitted.paths | Danh sách các thư mục được phân tách bằng dấu hai chấm (bao gồm cả các thư mục con) trong đó trình liên kết động có thể tải các thư viện dùng chung (ngoài Các thư viện dùng chung nằm trong 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. name . asan.permitted.paths | Danh sách các thư mục đượ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 khi ASan được bật. | Điều này cho thấy rằng khi bật ASan, các thư viện dùng chung trong |
namespace. name . visible | Giá trị boolean cho biết liệu chương trình (không phải Nếu Nếu | Điều này chỉ ra rằng |
Tạo không gian tên 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 tệp văn bản thuần túy trong ${android-src}/system/core/rootdir/etc
. Cấu hình được tạo khi 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ợ VNĐK
- Phiên bản VNĐK mục tiêu của phân vùng nhà cung cấp
- Phiên bản VNĐK 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 giải quyết sự phụ thuộc giữa các không gian tên của trình liên kết. Ví dụ: nếu có bất kỳ bản cập nhật nào trên mô-đun APEX bao gồm các bản cập nhật phụ thuộc, 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ể tìm 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ó ba loại cấu hình. Tùy 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 khi khởi động.
PRODUCT_TREBLE_ LINKER_NAMESPACES | BOARD_VNDK_ VERSION | Cấu hình đã chọn | Yêu cầu VTS |
---|---|---|---|
true | current | VNDK | Bắt buộc đối với các 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 các thiết bị không phải Treble |
Cấu hình VNDK Lite cô lập các thư viện chia sẻ 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 cô lập các thư viện chia sẻ SP-HAL và VNDK-SP. Ngoài ra, cấu hình này còn cung cấp khả năng cách ly trình liên kết động đầy đủ. Nó đả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 của nhà cung cấp và ngược lại.
Trong Android 8.1 trở lên, cấu hình VNĐK là cấu hình mặc định và chúng tôi khuyên bạn nên bật 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 VNĐK
Cấu hình VNDK cô lập các phụ thuộc 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 ra như sau:
Quy trình khung
- Các không gian tên
default
,vndk
,sphal
vàrs
được tạo. - Tất cả các không gian tên đều bị cô lập.
- Thư viện chia sẻ hệ thống được tải vào không gian tên
default
. - SP-HAL được tải vào không gian tên
sphal
. - Thư viện chia sẻ VNDK-SP được tải vào không gian tên
vndk
.
- Các không gian tên
Quy trình của nhà cung cấp
- các không gian tên
default
,vndk
vàsystem
được tạo. - Không gian tên
default
bị cô lập. - Thư viện chia sẻ của nhà cung cấp được tải vào không gian tên
default
. - Thư viện chia sẻ VNĐK và VNĐK-SP được tải vào không gian 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
.
- các 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 họa dưới đây.
Trong hình trên, 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
-
libGLESv3.so
-
libandroid_net.so
-
libc.so
-
libdl.so
-
liblog.so
-
libm.so
-
libnativewindow.so
-
libneuralnetworks.so
-
libsync.so
-
libvndksupport.so
-
libvulkan.so
-
- VNĐK-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ể tìm thêm chi tiết trong /linkerconfig/ld.config.txt
từ thiết bị.
Cấu hình VNĐK Lite
Kể từ Android 8.0, trình liên kết động được cấu hình để cách ly các thư viện chia sẻ SP-HAL và VNDK-SP sao cho các ký hiệu của chúng không xung đột với các thư viện chia sẻ khung khác. Mối quan hệ giữa các không gian tên của trình liên kết được hiển thị 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 VNĐK-SP trong cấu hình)
-
- VNĐK-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 bên dưới liệt kê cấu hình namespaces cho các tiến trình framework, được trích từ phần [system]
trong cấu hình VNDK Lite.
Không gian tên | Tài sản | 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 | VNĐK-SP | |
link.rs.shared_libs | libRS_internal.so | |
vndk (đối với VNĐK-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 hạt 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 | VNĐK-SP |
Bảng bên dưới trình bày cấu hình không gian tên cho quy trình của nhà cung cấp, được trích từ phần [vendor]
trong cấu hình VNĐK Lite.
Không gian tên | Tài sản | 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 được dùng nữa)/product/${LIB} (không được dùng nữa) |
isolated | false |
Bạn có thể tìm thêm thông tin chi tiết trong /linkerconfig/ld.config.txt
từ thiết bị.
Tài liệu Lịch sử
Những thay đổi của Android 11
- Trong Android 11, các tệp
ld.config.*.txt
tĩnh sẽ bị xóa khỏi cơ sở mã và thay vào đó, LinkerConfig sẽ tạo chúng trong thời gian chạy.
Những thay đổi của Android 9
- Trong Android 9, không gian tên trình liên kết
vndk
được thêm vào quy trình của nhà cung cấp và các thư viện chia sẻ VNĐK được tách biệt khỏ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.
Android 8.x Android 9 Sự miêu tả ld.config.txt.in
ld.config.txt
Đối với các thiết bị có cách ly không gian tên 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ó cách ly không gian tên liên kết VNĐK-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 - Xóa
android.hardware.graphics.allocator@2.0.so
. - phân vùng
product
vàodm
được thêm vào.