Tautan dinamis mengatasi dua tantangan dalam desain Treble VNDK:
- Pustaka bersama SP-HAL dan dependensinya, termasuk pustaka VNDK-SP, dimuat ke dalam proses kerangka kerja. Harus ada mekanisme untuk mencegah konflik simbol.
-
dlopen()
danandroid_dlopen_ext()
dapat menimbulkan beberapa dependensi runtime yang tidak terlihat pada waktu build dan mungkin sulit dideteksi menggunakan analisis statis.
Kedua tantangan ini dapat diselesaikan dengan mekanisme namespace linker . Mekanisme ini disediakan oleh linker dinamis. Itu dapat mengisolasi perpustakaan bersama di ruang nama linker yang berbeda sehingga perpustakaan dengan nama perpustakaan yang sama tetapi dengan simbol yang berbeda tidak akan konflik.
Di sisi lain, mekanisme namespace linker memberikan fleksibilitas sehingga beberapa perpustakaan bersama dapat diekspor oleh namespace linker dan digunakan oleh namespace linker lain. Pustaka bersama yang diekspor ini dapat menjadi antarmuka pemrograman aplikasi yang bersifat publik bagi program lain sambil menyembunyikan detail implementasinya di dalam namespace linkernya.
Misalnya, /system/lib[64]/libcutils.so
dan /system/lib[64]/vndk-sp-${VER}/libcutils.so
adalah dua perpustakaan bersama. Kedua perpustakaan ini dapat memiliki simbol yang berbeda. Mereka dimuat ke dalam namespace linker yang berbeda sehingga modul kerangka kerja dapat bergantung pada /system/lib[64]/libcutils.so
dan pustaka bersama SP-HAL dapat bergantung pada /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
Di sisi lain, /system/lib[64]/libc.so
adalah contoh perpustakaan umum 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 merangkum rincian implementasi sambil menyediakan antarmuka publik.
Bagaimana cara kerjanya?
Linker dinamis bertanggung jawab untuk memuat pustaka bersama yang ditentukan dalam entri DT_NEEDED
atau pustaka bersama yang ditentukan oleh argumen dlopen()
atau android_dlopen_ext()
. Dalam kedua kasus tersebut, linker dinamis menemukan namespace linker tempat pemanggil berada dan mencoba memuat dependensi ke dalam namespace linker yang sama. Jika penaut dinamis tidak dapat memuat pustaka bersama ke dalam namespace linker yang ditentukan, ia akan meminta namespace linker tertaut untuk mengekspor pustaka bersama.
Format file konfigurasi
Format file konfigurasi didasarkan pada format file INI. File konfigurasi tipikal 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 meliputi:
- Beberapa properti pemetaan bagian direktori di awal untuk linker dinamis untuk memilih bagian yang efektif.
- Beberapa bagian konfigurasi namespace linker:
- Setiap bagian berisi beberapa ruang nama (simpul grafik) dan beberapa link cadangan antar ruang nama (busur grafik).
- Setiap namespace memiliki isolasi, jalur pencarian, jalur yang diizinkan, dan pengaturan visibilitasnya sendiri.
Tabel di bawah ini menjelaskan arti masing-masing properti secara rinci.
Properti pemetaan bagian direktori
Properti | Keterangan | Contoh |
---|---|---|
| Jalur ke direktori tempat bagian Setiap properti memetakan executable di bawah 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 relasi
Properti | Keterangan | Contoh |
---|---|---|
additional. namespaces | Daftar namespace tambahan yang dipisahkan koma (selain namespace | Hal ini menunjukkan bahwa ada tiga namespace ( |
namespace. name . links | Daftar namespace cadangan yang dipisahkan koma. Jika perpustakaan bersama tidak dapat ditemukan di namespace saat ini, linker dinamis akan mencoba memuat perpustakaan bersama dari namespace fallback. Namespace yang ditentukan di awal daftar memiliki prioritas lebih tinggi. | Jika pustaka bersama atau yang dapat dieksekusi meminta pustaka bersama yang tidak dapat dimuat ke dalam namespace Lalu, jika pustaka bersama juga tidak dapat dimuat dari namespace Terakhir, jika semua upaya gagal, penaut dinamis akan mengembalikan kesalahan. |
namespace. name . link. other . shared_libs | Daftar perpustakaan bersama yang dipisahkan titik dua yang dapat dicari di namespace Properti ini tidak dapat digunakan dengan | Hal ini menunjukkan bahwa link fallback hanya menerima |
namespace. name . link. other . allow_all_shared_libs | Nilai boolean yang menunjukkan apakah semua perpustakaan bersama dapat dicari di namespace Properti ini tidak dapat digunakan dengan | Hal ini menunjukkan bahwa semua nama perpustakaan dapat berjalan melalui link fallback dari |
Properti ruang nama
Properti | Keterangan | Contoh |
---|---|---|
namespace. name . isolated | Nilai boolean yang menunjukkan apakah linker dinamis harus memeriksa lokasi perpustakaan bersama. Jika Jika | Hal ini menunjukkan bahwa hanya perpustakaan bersama di |
namespace. name . search.paths | Daftar direktori yang dipisahkan titik dua untuk mencari perpustakaan bersama. Direktori yang ditentukan dalam Ketika Misalnya, jika | Hal ini menunjukkan bahwa tautan dinamis mencari |
namespace. name . asan.search.paths | Daftar direktori yang dipisahkan titik dua untuk mencari perpustakaan bersama ketika AddressSanitizer (ASan) diaktifkan. | Hal ini menunjukkan bahwa ketika ASan diaktifkan, tautan dinamis akan menelusuri |
namespace. name . permitted.paths | Daftar direktori yang dipisahkan titik dua (termasuk subdirektori) tempat linker dinamis dapat memuat perpustakaan bersama (selain Pustaka bersama yang berada di bawah subdirektori yang Jika | Hal ini menunjukkan bahwa perpustakaan bersama di bawah Misalnya, tanpa |
namespace. name . asan.permitted.paths | Daftar direktori yang dipisahkan titik dua tempat tautan dinamis dapat memuat perpustakaan bersama ketika ASan diaktifkan. | Hal ini menunjukkan bahwa ketika ASan diaktifkan, perpustakaan bersama di bawah |
namespace. name . visible | 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 bawah /linkerconfig
alih-alih menggunakan file teks biasa di ${android-src}/system/core/rootdir/etc
. Konfigurasi dihasilkan pada waktu boot berdasarkan lingkungan runtime, yang mencakup item berikut:
- Jika perangkat mendukung VNDK
- Versi VNDK target partisi vendor
- Versi VNDK partisi produk
- Modul APEX yang terpasang
Konfigurasi linker dibuat dengan menyelesaikan ketergantungan antar namespace linker. Misalnya, jika ada pembaruan apa pun pada modul APEX yang menyertakan pembaruan ketergantungan, konfigurasi linker akan dibuat untuk mencerminkan perubahan ini. Detail lebih lanjut 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 terkait dibuat saat boot.
PRODUCT_TREBLE_ LINKER_NAMESPACES | BOARD_VNDK_ VERSION | Konfigurasi yang dipilih | Persyaratan VTS |
---|---|---|---|
true | current | VNDK | Wajib untuk perangkat yang diluncurkan dengan Android 9 atau 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 perpustakaan bersama SP-HAL dan VNDK-SP. Di Android 8.0, ini harus berupa file konfigurasi untuk penaut dinamis jika PRODUCT_TREBLE_LINKER_NAMESPACES
bernilai true
.
Konfigurasi VNDK juga mengisolasi perpustakaan bersama SP-HAL dan VNDK-SP. Selain itu, konfigurasi ini menyediakan isolasi linker dinamis penuh. Ini memastikan bahwa modul di partisi sistem tidak akan bergantung pada perpustakaan bersama di partisi vendor dan sebaliknya.
Di Android 8.1 atau lebih tinggi, konfigurasi VNDK adalah konfigurasi default dan sangat disarankan untuk mengaktifkan isolasi linker dinamis penuh dengan menyetel BOARD_VNDK_VERSION
ke current
.
Konfigurasi VNDK
Konfigurasi VNDK mengisolasi ketergantungan perpustakaan bersama antara partisi sistem dan partisi vendor. Dibandingkan dengan konfigurasi yang disebutkan pada subbagian sebelumnya, perbedaannya diuraikan sebagai berikut:
Proses kerangka
- namespace
default
,vndk
,sphal
, danrs
dibuat. - Semua namespace diisolasi.
- Pustaka bersama sistem dimuat ke dalam namespace
default
. - SP-HAL dimuat ke dalam namespace
sphal
. - Pustaka bersama VNDK-SP dimuat ke namespace
vndk
.
- namespace
Proses vendor
-
default
,vndk
, dan namespacesystem
dibuat. - Namespace
default
diisolasi. - Pustaka bersama vendor dimuat ke dalam namespace
default
. - Pustaka bersama VNDK dan VNDK-SP dimuat ke namespace
vndk
. - LL-NDK dan dependensinya dimuat ke dalam namespace
system
.
-
Hubungan antara namespace linker diilustrasikan di bawah ini.
Pada gambar di atas, LL-NDK dan VNDK-SP adalah singkatan dari perpustakaan 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 lebih lanjut di /linkerconfig/ld.config.txt
dari perangkat.
Konfigurasi VNDK Lite
Mulai Android 8.0, linker dinamis dikonfigurasi untuk mengisolasi pustaka bersama SP-HAL dan VNDK-SP sehingga simbolnya tidak bertentangan dengan pustaka bersama framework lainnya. Hubungan antara namespace linker ditunjukkan di bawah ini.
LL-NDK dan VNDK-SP adalah singkatan dari perpustakaan 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 kerangka kerja, yang dikutip dari bagian [system]
dalam konfigurasi VNDK Lite.
Ruang nama | 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 menyajikan konfigurasi namespace untuk proses vendor, yang dikutip dari bagian [vendor]
dalam konfigurasi VNDK Lite.
Ruang nama | 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 lebih lanjut dapat ditemukan di /linkerconfig/ld.config.txt
dari perangkat.
Sejarah dokumen
Perubahan Android 11
- Di Android 11, file
ld.config.*.txt
statis dihapus dari basis kode dan LinkerConfig menghasilkannya saat runtime.
Android 9 berubah
- Di Android 9, namespace linker
vndk
ditambahkan ke proses vendor dan pustaka 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 Keterangan 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 lebih rendah - Hapus
android.hardware.graphics.allocator@2.0.so
. - partisi
product
danodm
ditambahkan.