Namespace penaut

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() dan android_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

dir.name

Jalur ke direktori yang menjadi bagian [name] berlaku.

Setiap properti memetakan file yang dapat dieksekusi di bawah direktori ke penaut konfigurasi namespace. Mungkin ada dua (atau lebih) properti yang memiliki name yang sama tetapi mengarah ke direktori.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Ini menunjukkan bahwa konfigurasi yang ditentukan dalam Bagian [system] berlaku untuk file yang dapat dieksekusi yang dimuat dari /system/bin atau /system/xbin.

Konfigurasi yang ditentukan di bagian [vendor] berlaku ke file yang dapat dieksekusi yang dimuat dari /vendor/bin.

Properti relasi

Properti Deskripsi Contoh
additional.namespaces

Daftar yang dipisahkan koma untuk namespace tambahan (selain default) untuk bagian tersebut.

additional.namespaces = sphal,vndk

Hal ini menunjukkan bahwa ada tiga namespace (default, sphal, dan vndk) di [system] konfigurasi Anda.

namespace.name.links

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.

namespace.sphal.links = default,vndk

Jika {i>shared library<i} atau {i>executable<i} meminta pustaka bersama yang tidak dapat dimuat ke namespace sphal, linker dinamis mencoba memuat galeri foto bersama dari default namespace.

Dan kemudian, jika pustaka bersama tidak dapat dimuat dari Namespace default baik, penaut dinamis akan mencoba memuat library bersama dari namespace vndk.

Terakhir, jika semua upaya gagal, linker dinamis akan menampilkan error.

namespace.name.link.other.shared_libs

Daftar library bersama yang dipisahkan titik dua yang dapat dicari di other namespace jika library tersebut tidak dapat ditemukan di Namespace name.

Properti ini tidak dapat digunakan dengan namespace.name.link.other.allow_all_shared_libs.

namespace.sphal.link.default.shared_libs = libc.so:libm.so

Hal ini menunjukkan bahwa link penggantian hanya menerima libc.so atau libm.so sebagai nama library yang diminta. Penaut dinamis mengabaikan link penggantian dari sphal ke Namespace default jika nama library yang diminta bukan libc.so atau libm.so.

namespace.name.link.other.allow_all_shared_libs

Nilai boolean yang menunjukkan apakah semua pustaka bersama dapat menelusuri di namespace other saat library tersebut tidak dapat dapat ditemukan di namespace name.

Properti ini tidak dapat digunakan dengan namespace.name.link.other.shared_libs.

namespace.vndk.link.sphal.allow_all_shared_libs = true

Hal ini menunjukkan bahwa semua nama library dapat berjalan melalui link fallback dari namespace vndk hingga sphal.

Properti namespace

Properti Deskripsi Contoh
namespace.name.isolated

Nilai boolean yang menunjukkan apakah penaut dinamis harus memeriksa di mana {i>shared library<i} berada.

Jika isolated adalah true, hanya library bersama yang ada di salah satu direktori search.paths (tidak termasuk subdirektori) atau berada di dalam salah satu Direktori permitted.paths (termasuk subdirektori) dapat dimuat.

Jika isolated adalah false (default), parameter penaut tidak memeriksa jalur pustaka bersama.

namespace.sphal.isolated = true

Ini menunjukkan bahwa hanya {i>shared library<i} di search.paths atau kurang dari permitted.paths dapat dimuat ke namespace sphal.

namespace.name.search.paths

Daftar direktori yang dipisahkan titik dua untuk menelusuri direktori bersama library.

Direktori yang ditentukan dalam search.paths ditambahkan di awal ke nama library yang diminta jika fungsi memanggil dlopen() atau Entri DT_NEEDED tidak menentukan jalur lengkap. Direktori yang ditentukan di awal daftar memiliki prioritas yang lebih tinggi.

Ketika isolated adalah true, library bersama yang berada di salah satu direktori search.paths (tidak termasuk subdirektori) dapat dimuat, apa pun permitted.paths saat ini.

Misalnya, jika search.paths adalah /system/${LIB} dan permitted.paths kosong, /system/${LIB}/libc.so dapat dimuat, tetapi /system/${LIB}/vndk/libutils.so tidak dapat dimuat.

namespace.default.search.paths = /system/${LIB}

Ini menunjukkan bahwa penaut dinamis menelusuri /system/${LIB} untuk galeri foto bersama.

namespace.name.asan.search.paths

Daftar direktori yang dipisahkan titik dua untuk mencari {i>shared library<i} ketika AddressSanitizer (ASan) diaktifkan.

namespace.name.search.paths sama dengan diabaikan saat ASan adalah mengaktifkan pembuatan versi.

namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}

Hal ini menunjukkan bahwa ketika ASan mengaktifkan penaut dinamis menelusuri /data/asan/system/${LIB} terlebih dahulu dan kemudian menelusuri /system/${LIB}.

namespace.name.permitted.paths

Daftar direktori yang dipisahkan titik dua (termasuk subdirektori) dengan penaut dinamis dapat memuat pustaka bersama (selain search.paths) saat isolated adalah true.

{i>Shared library<i} yang ada di bawah subdirektori dari permitted.paths juga dapat dimuat. Misalnya, jika permitted.paths adalah /system/${LIB}, /system/${LIB}/libc.so dan /system/${LIB}/vndk/libutils.so dapat dimuat.

Jika isolated adalah false, permitted.paths akan diabaikan dan peringatan akan dikeluarkan.

namespace.default.permitted.paths = /system/${LIB}/hw

Ini menunjukkan bahwa pustaka bersama di bawah /system/${LIB}/hw dapat dimuat ke dalam elemen Namespace default.

Misalnya, tanpa permitted.paths, libaudiohal.so tidak dapat dimuat /system/${LIB}/hw/audio.a2dp.default.so ke Namespace default.

namespace.name.asan.permitted.paths

Daftar direktori yang dipisahkan titik dua tempat penaut dinamis dapat dimuat library bersama saat ASan diaktifkan.

namespace.name.permitted.paths sama dengan diabaikan jika ASan diaktifkan.

namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

Hal ini menunjukkan bahwa saat ASan diaktifkan library bersama di /data/asan/system/${LIB}/hw atau /system/${LIB}/hw dapat dimuat ke elemen Namespace default.

namespace.name.visible

Nilai boolean yang menunjukkan apakah program (selain libc) dapat memperoleh handle namespace penaut dengan android_get_exported_namespace() dan buka pustaka bersama di namespace penaut dengan meneruskan handle ke android_dlopen_ext().

Jika visible adalah true, android_get_exported_namespace() selalu menampilkan handle jika namespace ada.

Jika visible adalah false (default), android_get_exported_namespace() selalu kembali NULL terlepas dari keberadaan namespace. Galeri foto bersama dapat dimuat ke namespace ini hanya jika (1) permintaan tersebut diminta oleh namespace penaut yang memiliki tautan pengganti ke namespace ini, atau (2) mereka diminta oleh pustaka bersama lainnya atau file yang dapat dieksekusi dalam namespace ini.

namespace.sphal.visible = true

Hal ini menunjukkan bahwa android_get_exported_namespace("sphal") dapat menampilkan handle namespace penaut yang valid.

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, Namespace sphal dan rs 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, dan system 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.

Hubungan antara namespace penaut diilustrasikan di bawah ini.

Grafik namespace penaut dijelaskan dalam konfigurasi VNDK

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.

Grafik namespace penaut yang dijelaskan dalam konfigurasi VNDK Lite
Gambar 2. Isolasi namespace penaut (konfigurasi VNDK Lite)

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-NDK
libmediandk.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 spesifik PRODUCT_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 dan odm ditambahkan.