Penaut dinamis mengatasi dua tantangan dalam desain Treble VNDK:
- Library bersama SP-HAL dan dependensinya, termasuk VNDK-SP library, dimuat ke dalam proses framework. Seharusnya 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 dengan analisis statis.
Kedua tantangan ini dapat diselesaikan oleh namespace penaut mekanisme atensi. Mekanisme ini disediakan oleh penaut dinamis. Ini dapat mengisolasi pustaka bersama dalam namespace penaut yang berbeda sehingga {i>library<i} dengan nama pustaka yang sama tetapi dengan simbol yang berbeda tidak akan bertentangan.
Di sisi lain, mekanisme namespace penaut memberikan fleksibilitas sehingga beberapa pustaka bersama dapat diekspor oleh namespace penaut dan digunakan oleh namespace penaut lain. {i>Shared library<i} yang diekspor dapat menjadi {i>application programming interface<i} (antarmuka pemrograman aplikasi) yang bersifat publik untuk program lain, menyembunyikan detail implementasinya dalam namespace penautnya.
Misalnya, /system/lib[64]/libcutils.so
dan
/system/lib[64]/vndk-sp-${VER}/libcutils.so
adalah dua dibagikan
library. Kedua library ini dapat memiliki simbol yang berbeda. Mereka dimuat
menjadi namespace penaut yang berbeda sehingga modul framework dapat bergantung pada
Library bersama /system/lib[64]/libcutils.so
dan 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 {i>namespace
<i}penaut dan diimpor ke dalam
banyak namespace penaut. Ketergantungan dari
/system/lib[64]/libc.so
, seperti libnetd_client.so
,
dimuat ke namespace tempat /system/lib[64]/libc.so
tinggal. Namespace lain tidak akan memiliki akses ke dependensi tersebut. Ini
yang merangkum detail implementasi
sekaligus menyediakan
antarmuka.
Cara kerjanya
Penaut dinamis bertanggung jawab untuk memuat pustaka bersama yang ditentukan
dalam entri DT_NEEDED
atau library bersama yang ditentukan oleh
argumen dlopen()
atau android_dlopen_ext()
. Di keduanya
kasus, penaut dinamis menemukan namespace penaut tempat pemanggil
berada dan mencoba memuat dependensi ke dalam namespace penaut yang sama. Jika
penaut dinamis tidak dapat memuat pustaka bersama ke penaut yang ditentukan
namespace, instance akan meminta namespace penaut tertaut untuk fitur bersama yang diekspor
library.
Format file konfigurasi
Format file konfigurasi didasarkan pada format file INI. Karakteristik file konfigurasi 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 bagian direktori di awal untuk penaut dinamis untuk memilih bagian efektif.
-
Beberapa bagian konfigurasi namespace penaut:
- Setiap bagian berisi beberapa namespace (verteks grafik) dan beberapa link fallback antar namespace (arc grafik).
- Setiap namespace memiliki isolasi, jalur penelusuran, jalur yang diizinkan, dan setelan visibilitas.
Tabel di bawah menjelaskan arti setiap properti secara mendetail.
Properti pemetaan bagian direktori
Properti | Deskripsi | Contoh |
---|---|---|
|
Jalur ke direktori yang menjadi bagian Setiap properti memetakan file yang dapat dieksekusi di bawah direktori ke penaut
konfigurasi namespace. Mungkin ada dua (atau lebih) properti
yang memiliki |
Ini menunjukkan bahwa konfigurasi yang ditentukan dalam
Bagian Konfigurasi yang ditentukan di bagian |
Properti relasi
Properti | Deskripsi | Contoh |
---|---|---|
additional. |
Daftar yang dipisahkan koma untuk namespace tambahan (selain
|
Hal ini menunjukkan bahwa ada tiga namespace ( |
namespace. |
Daftar namespace penggantian yang dipisahkan koma. Jika library bersama tidak dapat ditemukan di namespace saat ini, library penaut mencoba memuat library bersama dari namespace penggantian. Tujuan yang ditentukan di awal daftar memiliki prioritas lebih tinggi. |
Jika {i>shared library<i} atau {i>executable<i}
meminta pustaka bersama yang
tidak dapat dimuat ke namespace Dan kemudian, jika pustaka bersama
tidak dapat dimuat dari
Namespace Terakhir, jika semua upaya gagal, linker dinamis akan menampilkan error. |
namespace. |
Daftar library bersama yang dipisahkan titik dua yang dapat dicari di
Properti ini tidak dapat digunakan dengan
|
Hal ini menunjukkan bahwa link penggantian hanya menerima |
namespace. |
Nilai boolean yang menunjukkan apakah semua pustaka bersama dapat
menelusuri di namespace Properti ini tidak dapat digunakan dengan
|
Hal ini menunjukkan bahwa semua nama library dapat berjalan melalui link fallback
dari namespace |
Properti namespace
Properti | Deskripsi | Contoh |
---|---|---|
namespace. |
Nilai boolean yang menunjukkan apakah penaut dinamis harus memeriksa di mana {i>shared library<i} berada. Jika Jika |
Ini menunjukkan bahwa
hanya {i>shared library<i} di
|
namespace. |
Daftar direktori yang dipisahkan titik dua untuk menelusuri direktori bersama library. Direktori yang ditentukan dalam Ketika Misalnya, jika |
Ini menunjukkan bahwa penaut dinamis menelusuri
|
namespace. |
Daftar direktori yang dipisahkan titik dua untuk mencari {i>shared library<i} ketika AddressSanitizer (ASan) diaktifkan.
|
Hal ini menunjukkan bahwa ketika
ASan mengaktifkan
penaut dinamis menelusuri |
namespace. |
Daftar direktori yang dipisahkan titik dua (termasuk subdirektori) dengan
penaut dinamis dapat memuat pustaka bersama (selain
{i>Shared library<i} yang ada
di bawah subdirektori dari
Jika |
Ini menunjukkan bahwa
pustaka bersama di bawah
Misalnya, tanpa |
namespace. |
Daftar direktori yang dipisahkan titik dua tempat penaut dinamis dapat dimuat 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 penaut dibuat saat runtime di
/linkerconfig
alih-alih menggunakan file teks biasa di
${android-src}/system/core/rootdir/etc
. Konfigurasi dibuat saat booting
berdasarkan lingkungan runtime, yang mencakup item berikut:
- Jika perangkat mendukung VNDK
- Versi VNDK target partisi vendor
- Versi VNDK partisi produk
- Modul APEX yang terinstal
Konfigurasi penaut dibuat dengan me-resolve dependensi di antara namespace penaut. Sebagai
misalnya, jika ada update pada modul APEX yang menyertakan update dependensi,
akan dibuat untuk mencerminkan perubahan tersebut. Detail selengkapnya untuk membuat konfigurasi penaut
dapat ditemukan di
${android-src}/system/linkerconfig
Isolasi namespace linker
Ada tiga jenis konfigurasi. Tergantung pada nilai
PRODUCT_TREBLE_LINKER_NAMESPACES
dan
BOARD_VNDK_VERSION
di BoardConfig.mk
,
konfigurasi yang sesuai dibuat pada saat {i>booting<i}.
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 baru |
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,
harus berupa file konfigurasi untuk penaut 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. Ini memastikan bahwa modul dalam partisi sistem tidak akan bergantung pada {i>shared<i} {i>library<i} di partisi vendor dan sebaliknya.
Di Android 8.1 atau yang lebih tinggi, konfigurasi VNDK adalah konfigurasi default
dan sangat direkomendasikan untuk mengaktifkan isolasi penaut dinamis penuh dengan menetapkan
BOARD_VNDK_VERSION
hingga current
.
Konfigurasi VNDK
Konfigurasi VNDK mengisolasi dependensi library bersama antara partisi sistem dan partisi vendor. Dibandingkan dengan yang disebutkan di subbagian sebelumnya, perbedaan diuraikan sebagai berikut:
-
Proses framework
default
,vndk
, Namespacesphal
danrs
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 dalam namespace
system
.
- Namespace
Hubungan antara namespace penaut diilustrasikan di bawah ini.
Gambar 1. Isolasi namespace penaut (konfigurasi VNDK).
Pada gambar di atas, LL-NDK dan VNDK-SP adalah singkatan dari {i>shared library<i}:
-
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, penaut dinamis dikonfigurasikan untuk mengisolasi SP-HAL dan Library bersama VNDK-SP sedemikian rupa sehingga simbolnya tidak bertentangan dengan perpustakaan bersama kerangka kerja ini. Hubungan antara namespace penaut seperti yang ditampilkan di bawah ini.
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 ini mencantumkan konfigurasi namespace untuk framework
proses, 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 ini menyajikan konfigurasi namespace untuk proses vendor,
yang dikutip dari bagian [vendor]
pada
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 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 di runtime.
Perubahan Android 9
- Di Android 9, namespace penaut
vndk
ditambahkan ke vendor dan pustaka bersama VNDK diisolasi dari linker default namespace. - Ganti
PRODUCT_FULL_TREBLE
dengan yang lebih spesifikPRODUCT_TREBLE_LINKER_NAMESPACES
. - Android 9 mengubah nama konfigurasi penaut 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 penaut 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.