Linker dinamis mengatasi dua tantangan dalam desain VNDK Treble:
- Library bersama SP-HAL dan dependensinya, termasuk library VNDK-SP, dimuat ke dalam proses framework. Harus ada beberapa mekanisme untuk mencegah konflik simbol.
dlopen()
danandroid_dlopen_ext()
dapat memperkenalkan beberapa dependensi runtime yang tidak terlihat pada waktu build dan sulit dideteksi menggunakan analisis statis.
Kedua tantangan ini dapat diselesaikan dengan mekanisme namespace linker. Mekanisme ini disediakan oleh linker dinamis. Hal ini dapat mengisolasi library bersama di ruang nama linker yang berbeda sehingga library dengan nama library yang sama, tetapi dengan simbol yang berbeda tidak akan berkonflik.
Di sisi lain, mekanisme namespace linker memberikan fleksibilitas sehingga beberapa library bersama dapat diekspor oleh namespace linker dan digunakan oleh namespace linker lain. Library bersama yang diekspor ini dapat menjadi antarmuka pemrograman aplikasi yang bersifat publik untuk program lain sekaligus menyembunyikan detail implementasinya dalam namespace linker-nya.
Misalnya, /system/lib[64]/libcutils.so
dan
/system/lib[64]/vndk-sp-${VER}/libcutils.so
adalah dua pustaka
bersama. Kedua pustaka ini dapat memiliki simbol yang berbeda. Library ini dimuat
ke dalam namespace linker yang berbeda sehingga modul framework dapat bergantung pada
/system/lib[64]/libcutils.so
dan library bersama SP-HAL dapat
bergantung pada /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
Di sisi lain, /system/lib[64]/libc.so
adalah contoh
library publik yang diekspor oleh namespace linker dan diimpor ke
banyak namespace linker. Dependensi
/system/lib[64]/libc.so
, seperti libnetd_client.so
,
dimuat ke dalam namespace tempat /system/lib[64]/libc.so
berada. Namespace lain tidak akan memiliki akses ke dependensi tersebut. Mekanisme
ini mengenkapsulasi detail penerapan sekaligus menyediakan antarmuka
publik.
Cara kerjanya
Linker dinamis bertanggung jawab untuk memuat library bersama yang ditentukan dalam entri DT_NEEDED
atau library bersama yang ditentukan oleh argumen dlopen()
atau android_dlopen_ext()
. Dalam kedua
kasus, linker dinamis menemukan namespace linker tempat pemanggil
berada dan mencoba memuat dependensi ke namespace linker yang sama. Jika
linker dinamis tidak dapat memuat library bersama ke dalam namespace linker yang ditentukan, linker dinamis akan meminta namespace linker yang ditautkan untuk library bersama yang diekspor.
Format file konfigurasi
Format file konfigurasi didasarkan pada format file INI. File konfigurasi standar terlihat seperti 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}
File konfigurasi mencakup:
- Beberapa properti pemetaan directory-section di awal agar linker dinamis memilih bagian yang efektif.
-
Beberapa bagian konfigurasi namespace linker:
- Setiap bagian berisi beberapa namespace (verteks grafik) dan beberapa link penggantian antara namespace (busur grafik).
- Setiap namespace memiliki isolasi, jalur penelusuran, jalur yang diizinkan, dan setelan visibilitasnya sendiri.
Tabel di bawah menjelaskan arti setiap properti secara mendetail.
Properti pemetaan bagian direktori
Properti | Deskripsi | Contoh |
---|---|---|
|
Jalur ke direktori yang berlaku untuk bagian Setiap properti memetakan file yang dapat dieksekusi di direktori ke bagian konfigurasi
namespace linker. Mungkin ada dua (atau lebih) properti
yang memiliki |
Hal ini menunjukkan bahwa konfigurasi yang ditentukan di bagian
Konfigurasi yang ditentukan di bagian |
Properti hubungan
Properti | Deskripsi | Contoh |
---|---|---|
additional. |
Daftar namespace tambahan yang dipisahkan koma (selain namespace
|
Hal ini menunjukkan bahwa ada tiga namespace ( |
namespace. |
Daftar namespace penggantian yang dipisahkan koma. Jika galeri foto bersama tidak dapat ditemukan di namespace saat ini, linker dinamis akan mencoba memuat galeri foto bersama dari namespace penggantian. Namespace yang ditentukan di awal daftar memiliki prioritas yang lebih tinggi. |
Jika library bersama atau file executable meminta library bersama yang
tidak dapat dimuat ke namespace Kemudian, jika library bersama tidak dapat dimuat dari namespace
Terakhir, jika semua upaya gagal, linker dinamis akan menampilkan error. |
namespace. |
Daftar library bersama yang dipisahkan dengan titik dua yang dapat dicari di
namespace Properti ini tidak dapat digunakan dengan
|
Hal ini menunjukkan bahwa link penggantian hanya menerima |
namespace. |
Nilai boolean yang menunjukkan apakah semua library bersama dapat
dicari di namespace Properti ini tidak dapat digunakan dengan
|
Hal ini menunjukkan bahwa semua nama library dapat membuka link penggantian
dari namespace |
Properti namespace
Properti | Deskripsi | Contoh |
---|---|---|
namespace. |
Nilai boolean yang menunjukkan apakah linker dinamis harus memeriksa lokasi library bersama. Jika Jika |
Hal ini menunjukkan bahwa hanya library bersama di
|
namespace. |
Daftar direktori yang dipisahkan titik dua untuk menelusuri library bersama. Direktori yang ditentukan dalam Jika Misalnya, jika |
Hal ini menunjukkan bahwa linker dinamis menelusuri
|
namespace. |
Daftar direktori yang dipisahkan dengan titik dua untuk menelusuri library bersama saat AddressSanitizer (ASan) diaktifkan.
|
Hal ini menunjukkan bahwa saat
ASan diaktifkan, linker
dinamis akan menelusuri |
namespace. |
Daftar direktori (termasuk subdirektori) yang dipisahkan dengan titik dua tempat
linker dinamis dapat memuat library bersama (selain
Library bersama yang berada di subdirektori
Jika |
Hal ini menunjukkan bahwa library bersama di bawah
Misalnya, tanpa |
namespace. |
Daftar direktori yang dipisahkan dengan titik dua tempat linker dinamis dapat memuat library bersama saat ASan diaktifkan.
|
Hal ini menunjukkan bahwa saat ASan diaktifkan, library bersama di |
namespace. |
Nilai boolean yang menunjukkan apakah program (selain
Jika Jika |
Hal ini menunjukkan bahwa |
Pembuatan namespace linker
Di Android 11, konfigurasi linker dibuat saat runtime di
/linkerconfig
, bukan menggunakan file teks biasa di
${android-src}/system/core/rootdir/etc
. Konfigurasi dibuat saat waktu booting
berdasarkan lingkungan runtime, yang mencakup item berikut:
- Jika perangkat mendukung VNDK
- Versi VNDK target partisi vendor
- Versi VNDK partisi produk
- Modul APEX yang diinstal
Konfigurasi linker dibuat dengan menyelesaikan dependensi antar-namespace linker. Misalnya, jika ada update pada modul APEX yang mencakup update dependensi, konfigurasi linker akan dibuat yang mencerminkan perubahan ini. Detail selengkapnya untuk membuat konfigurasi linker
dapat ditemukan di
${android-src}/system/linkerconfig
.
Isolasi namespace linker
Ada tiga jenis konfigurasi. Bergantung pada nilai
PRODUCT_TREBLE_LINKER_NAMESPACES
dan
BOARD_VNDK_VERSION
di BoardConfig.mk
, konfigurasi
yang sesuai dibuat pada waktu booting.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Konfigurasi yang dipilih | Persyaratan VTS |
---|---|---|---|
true |
current |
VNDK |
Wajib untuk perangkat yang diluncurkan dengan Android 9 atau yang lebih tinggi |
Kosong | VNDK Lite |
Wajib untuk perangkat yang diluncurkan dengan Android 8.x | |
false |
Kosong | Legacy |
Untuk perangkat non-Treble |
Konfigurasi VNDK Lite mengisolasi library bersama SP-HAL dan VNDK-SP. Di Android 8.0, ini harus berupa file konfigurasi untuk linker dinamis saat PRODUCT_TREBLE_LINKER_NAMESPACES
adalah true
.
Konfigurasi VNDK juga mengisolasi library bersama SP-HAL dan VNDK-SP. Selain itu, konfigurasi ini menyediakan isolasi linker dinamis penuh. Hal ini memastikan bahwa modul di partisi sistem tidak akan bergantung pada library bersama di partisi vendor dan sebaliknya.
Di Android 8.1 atau yang lebih tinggi, konfigurasi VNDK adalah konfigurasi default
dan sangat direkomendasikan untuk mengaktifkan isolasi linker dinamis penuh dengan menyetel
BOARD_VNDK_VERSION
ke current
.
Konfigurasi VNDK
Konfigurasi VNDK mengisolasi dependensi library bersama antara partisi sistem dan partisi vendor. Dibandingkan dengan konfigurasi yang disebutkan di subbagian sebelumnya, perbedaannya diuraikan sebagai berikut:
-
Proses framework
default
,vndk
,sphal
, danrs
namespace dibuat.- Semua namespace diisolasi.
- Library bersama sistem dimuat ke dalam namespace
default
. - SP-HAL dimuat ke namespace
sphal
. - Library bersama VNDK-SP dimuat ke dalam namespace
vndk
.
-
Proses vendor
- Namespace
default
,vndk
, dansystem
dibuat. - Namespace
default
diisolasi. - Library bersama vendor dimuat ke dalam namespace
default
. - Library bersama VNDK dan VNDK-SP dimuat ke dalam namespace
vndk
. - LL-NDK dan dependensinya dimuat ke namespace
system
.
- Namespace
Hubungan antara namespace linker diilustrasikan di bawah.

Gambar 1. Isolasi namespace linker (konfigurasi VNDK).
Pada gambar di atas, LL-NDK dan VNDK-SP adalah singkatan dari library bersama berikut:
-
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
Anda dapat menemukan detail selengkapnya di /linkerconfig/ld.config.txt
dari perangkat.
Konfigurasi VNDK Lite
Mulai Android 8.0, linker dinamis dikonfigurasi untuk mengisolasi library bersama SP-HAL dan VNDK-SP sehingga simbolnya tidak berkonflik dengan library bersama framework lainnya. Hubungan antara namespace linker ditampilkan di bawah.

LL-NDK dan VNDK-SP adalah singkatan dari library bersama berikut:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(tidak ada dalam konfigurasi)libsync.so
libvndksupport.so
libz.so
(dipindahkan ke VNDK-SP dalam konfigurasi)
-
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
Tabel di bawah mencantumkan konfigurasi namespace untuk proses framework, yang diambil dari bagian [system]
dalam konfigurasi VNDK Lite.
Namespace | Properti | Nilai |
---|---|---|
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 (untuk 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 (untuk 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 (untuk kernel RS yang dikompilasi)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
Tabel di bawah ini menampilkan konfigurasi namespace untuk proses vendor, yang diambil dari bagian [vendor]
dalam konfigurasi VNDK Lite.
Namespace | Properti | Nilai |
---|---|---|
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} (tidak digunakan lagi)/product/${LIB} (tidak digunakan lagi)
|
isolated |
false |
Detail selengkapnya dapat ditemukan di /linkerconfig/ld.config.txt
dari perangkat.
Histori dokumen
Perubahan Android 11
- Di Android 11, file
ld.config.*.txt
statis dihapus dari codebase dan LinkerConfig akan membuatnya saat runtime.
Perubahan Android 9
- Di Android 9, namespace linker
vndk
ditambahkan ke proses vendor dan library bersama VNDK diisolasi dari namespace linker default. - Ganti
PRODUCT_FULL_TREBLE
denganPRODUCT_TREBLE_LINKER_NAMESPACES
yang lebih spesifik. - Android 9 mengubah nama file konfigurasi linker dinamis berikut.
Android 8.x Android 9 Deskripsi ld.config.txt.in
ld.config.txt
Untuk perangkat dengan isolasi namespace linker runtime ld.config.txt
ld.config.vndk_lite.txt
Untuk perangkat dengan isolasi namespace linker VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Untuk perangkat lama yang menjalankan Android 7.x atau yang lebih lama - Menghapus
android.hardware.graphics.allocator@2.0.so
. - Partisi
product
danodm
ditambahkan.