Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Namespace Linker

Linker dinamis menangani dua tantangan dalam desain Treble VNDK:

  • SP-HAL shared library dan dependensinya, termasuk perpustakaan VNDK-SP, dimuat ke dalam proses kerangka kerja. Harus ada beberapa mekanisme untuk mencegah konflik simbol.
  • dlopen() dan android_dlopen_ext() dapat memperkenalkan beberapa dependensi run-time yang tidak terlihat saat build-time dan mungkin sulit dideteksi menggunakan analisis statis.

Dua tantangan ini dapat diatasi dengan mekanisme nameserver linker . Mekanisme namespace linker disediakan oleh dynamic linker. Ini dapat mengisolasi pustaka bersama di ruang nama tautan yang berbeda sehingga pustaka dengan nama pustaka yang sama tetapi dengan simbol yang berbeda tidak akan bertentangan.

Di sisi lain, mekanisme namespace linker memberikan fleksibilitas sehingga beberapa pustaka 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 untuk program lain sambil menyembunyikan detail implementasinya dalam ruang nama tautan mereka.

Sebagai contoh, /system/lib[64]/libcutils.so dan /system/lib[64]/vndk-sp-${VER}/libcutils.so adalah dua pustaka bersama. Kedua perpustakaan ini mungkin memiliki simbol yang berbeda. Mereka dimuat ke ruang nama /system/lib[64]/libcutils.so 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 /system/lib[64]/libc.so linker dan diimpor ke banyak /system/lib[64]/libc.so . Ketergantungan /system/lib[64]/libc.so , seperti libnetd_client.so , dimuat ke namespace di mana /system/lib[64]/libc.so berada. Ruang nama lain tidak akan memiliki akses ke dependensi tersebut. Mekanisme ini merangkum detail implementasi sambil menyediakan antarmuka publik.

Bagaimana cara kerjanya?

DT_NEEDED 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, penghubung dinamis menemukan ruang nama tautan di mana pemanggil berada dan mencoba memuat dependensi ke dalam namespace tautan yang sama. Jika tautan dinamis tidak dapat memuat pustaka bersama ke ruang nama tautan yang ditentukan, ia meminta ruang nama tautan yang ditautkan untuk pustaka bersama yang diekspor.

Format file konfigurasi

Format file konfigurasi didasarkan pada format file INI. File konfigurasi khas terlihat seperti:

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 penghubung dinamis untuk memilih bagian yang efektif.
  • Beberapa bagian konfigurasi ruang nama tautan:
    • Setiap bagian berisi beberapa ruang nama (simpul grafik) dan beberapa tautan mundur di antara ruang nama (busur grafik).
    • Setiap namespace memiliki isolasi sendiri, jalur pencarian, jalur yang diizinkan, dan pengaturan visibilitas.

Tabel di bawah ini menjelaskan arti setiap properti secara rinci.

Properti pemetaan bagian direktori

Properti Deskripsi Contoh

dir. name

Jalur ke direktori tempat bagian [ name ] berlaku.

Setiap properti memetakan yang dapat dieksekusi di bawah direktori ke bagian konfigurasi ruang nama tautan. Mungkin ada dua (atau lebih) properti dengan name sama tetapi arahkan ke direktori yang berbeda.

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

Ini menunjukkan bahwa konfigurasi yang ditentukan di bagian [system] berlaku untuk executable yang diambil dari /system/bin atau /system/xbin .

Konfigurasi yang ditentukan di bagian [vendor] berlaku untuk executable yang diambil dari /vendor/bin .

Properti hubungan

Properti Deskripsi Contoh
additional. namespaces

Daftar ruang nama tambahan yang dipisahkan koma (selain ruang nama default ) untuk bagian ini.

additional. namespaces = sphal, vndk

Ini menunjukkan ada tiga ruang nama ( default , sphal , dan vndk ) dalam konfigurasi [system] .

namespace. name . links

Daftar ruang nama fallback yang dipisahkan koma.

Jika pustaka bersama tidak dapat ditemukan di namespace saat ini, linker dinamis mencoba memuat pustaka bersama dari ruang nama fallback. Namespace yang ditentukan di awal daftar memiliki prioritas lebih tinggi.

namespace. sphal. links = default, vndk

Jika pustaka bersama atau executable meminta pustaka bersama yang tidak dapat dimuat ke ruang nama sphal , penghubung dinamis mencoba memuat pustaka bersama dari namespace default .

Dan kemudian, jika pustaka bersama juga tidak bisa dimuat dari namespace default , linker dinamis mencoba memuat pustaka bersama dari namespace vndk .

Akhirnya, jika semua upaya gagal, penghubung dinamis mengembalikan kesalahan.

namespace. name . link. other . shared_libs

Daftar pustaka bersama yang dipisahkan oleh titik dua yang dapat dicari di ruang nama other saat pustaka 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

Ini menunjukkan bahwa tautan mundur hanya menerima libc.so atau libm.so sebagai nama pustaka yang diminta. Dynamic linker mengabaikan tautan sphal dari sphal ke namespace default jika nama pustaka yang diminta bukan libc.so atau libm.so

namespace. name . link. other . allow_all_shared_libs

Sebuah nilai boolean yang menunjukkan apakah semua perpustakaan bersama dapat dicari di other namespace ketika perpustakaan tersebut tidak dapat ditemukan dalam name namespace.

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

namespace. vndk. link. sphal. allow_all_shared_libs = true

Ini menunjukkan semua nama perpustakaan dapat berjalan melalui tautan mundur dari vndk ke sphal namespace.

Properti namespace

Properti Deskripsi Contoh
namespace. name . isolated

Nilai boolean yang menunjukkan apakah tautan dinamis harus memeriksa di mana perpustakaan bersama berada.

Jika isolated true , hanya perpustakaan bersama yang ada di salah satu direktori search.paths (tidak termasuk sub-direktori) atau berada di bawah salah satu direktori yang permitted.paths (termasuk sub-direktori) dapat dimuat.

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

namespace. sphal. isolated = true

Ini menunjukkan bahwa hanya perpustakaan bersama di search.paths atau di bawah permitted.paths dapat dimuat ke namespace sphal .

namespace. name . search.paths

Daftar direktori yang dipisahkan oleh titik dua untuk mencari pustaka bersama.

Direktori yang ditentukan dalam search.paths diawali dengan nama pustaka yang diminta jika fungsi memanggil ke dlopen() atau entri DT_NEEDED tidak menentukan path lengkap. Direktori yang ditentukan di awal daftar memiliki prioritas lebih tinggi.

Ketika isolated true , pustaka bersama yang berada di salah satu direktori search.paths (tidak termasuk sub-direktori) dapat dimuat terlepas dari properti yang permitted.paths .

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 pencari tautan dinamis mencari /system/${LIB} untuk perpustakaan bersama.

namespace. name . asan.search.paths

Daftar direktori yang dipisahkan oleh titik dua untuk mencari pustaka bersama ketika Address Sanitizer diaktifkan.

namespace. name . search.paths diabaikan ketika Address Sanitizer diaktifkan.

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

Ini menunjukkan bahwa ketika Sanitizer Alamat diaktifkan, pencari link dinamis /data/asan/system/${LIB} pertama dan kemudian pencarian /system/${LIB} .

namespace. name . permitted.paths

Daftar direktori yang dipisahkan oleh titik dua (termasuk sub-direktori) di mana tautan dinamis dapat memuat pustaka bersama (di samping search.paths ) ketika isolated true .

Pustaka bersama yang berada di bawah sub-direktori dari permitted.paths juga dapat dimuat. Misalnya, jika permitted.paths adalah /system/${LIB} , keduanya /system/${LIB}/libc.so dan /system/${LIB}/vndk/libutils.so dapat dimuat.

Jika isolated false , jalur permitted.paths dan peringatan diberikan.

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

Ini menunjukkan bahwa pustaka bersama di /system/${LIB}/hw dapat dimuat ke namespace default terisolasi.

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

namespace. name . asan.permitted.paths

Daftar direktori yang dipisahkan oleh titik dua tempat penghubung dinamis dapat memuat pustaka bersama ketika Address Sanitizer diaktifkan.

namespace. name . permitted.paths diabaikan ketika Address Sanitizer diaktifkan.

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

Ini menunjukkan bahwa ketika Sanitizer Alamat diaktifkan perpustakaan bersama di /data/asan/system/${LIB}/hw atau /system/${LIB}/hw dapat dimuat ke namespace default terisolasi.

namespace. name . visible

Nilai boolean yang menunjukkan apakah program (selain libc ) dapat memperoleh pegangan android_get_exported_namespace() linker dengan android_get_exported_namespace() dan membuka perpustakaan bersama di android_dlopen_ext() linker dengan mengirimkan handle ke android_dlopen_ext() .

Jika visible true , android_get_exported_namespace() selalu mengembalikan pegangan jika namespace ada.

Jika visible false (default), android_get_exported_namespace() selalu mengembalikan NULL terlepas dari keberadaan namespace. Pustaka bersama hanya dapat dimuat ke namespace ini jika (1) mereka diminta oleh nameserver linker lain yang memiliki link fallback ke namespace ini atau (2) mereka diminta oleh pustaka atau executable bersama lainnya di namespace ini.

namespace. sphal. visible = true

Ini menunjukkan bahwa android_get_exported_namespace("sphal") dapat mengembalikan pegangan android_get_exported_namespace("sphal") linker yang valid.

Isolasi ruang nama tautan

Ada tiga file konfigurasi di ${android-src}/system/core/rootdir/etc Bergantung pada nilai PRODUCT_TREBLE_LINKER_NAMESPACES dan BOARD_VNDK_VERSION di BoardConfig.mk , berbagai konfigurasi dipilih:

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Konfigurasi yang dipilih Persyaratan VTS
true current ld.config.txt Wajib untuk perangkat yang diluncurkan dengan Android P.
kosong ld.config.vndk_lite.txt Wajib untuk perangkat yang diluncurkan dengan Android 8.x.
false kosong ld.config.legacy.txt Untuk perangkat non-Treble

${android-src}/system/core/rootdir/etc/ld.config.vndk_lite.txt mengisolasi perpustakaan bersama SP-HAL dan VNDK-SP. Di Android 8.0 dan lebih tinggi, ini harus menjadi file konfigurasi untuk tautan dinamis ketika PRODUCT_TREBLE_LINKER_NAMESPACES true .

${android-src}/system/core/rootdir/etc/ld.config.txt mengisolasi pustaka bersama SP-HAL dan VNDK-SP. Selain itu, ld.config.txt juga menyediakan isolasi tautan dinamis penuh. Itu memastikan bahwa modul di partisi sistem tidak akan bergantung pada pustaka bersama di partisi vendor dan sebaliknya.

Di Android 8.1, ld.config.txt adalah file konfigurasi default dan sangat disarankan untuk mengaktifkan isolasi linker dinamis penuh dengan mengatur BOARD_VNDK_VERSION ke current .

ld.config.txt

ld.config.txt mengisolasi dependensi pustaka bersama antara partisi sistem dan partisi vendor. Dibandingkan dengan ld.config.txt disebutkan dalam ayat sebelumnya, perbedaannya diuraikan sebagai item berikut:

  • Proses Kerangka

    • Empat ruang nama ( default , vndk , sphal , dan rs ) dibuat.
    • Semua ruang nama terisolasi.
    • Pustaka bersama sistem dimuat ke namespace default .
    • SP-HAL dimuat ke dalam namespace sphal .
    • Perpustakaan bersama VNDK-SP dimuat ke dalam namespace vndk .
  • Proses Vendor

    • Tiga ruang nama ( default , vndk , dan system ) dibuat.
    • Namespace default terisolasi.
    • Pustaka bersama vendor dimuat ke namespace default .
    • Pustaka bersama VNDK dan VNDK-SP dimuat ke dalam namespace vndk .
    • LL-NDK dan dependensinya dimuat ke dalam namespace system .

Hubungan antara ruang nama linker digambarkan pada gambar di bawah ini:

Linker namespace graph dijelaskan dalam ld.config.txt
Gambar 1. Isolasi ruang nama ld.config.txt ( ld.config.txt )

Dalam grafik di atas, LL-NDK dan VNDK-SP adalah singkatan dari shared library 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

Tabel di bawah ini menyajikan konfigurasi namespaces untuk proses kerangka kerja, yang dikutip dari bagian [system] di ld.config.txt :

Namespace Properti Nilai
default search.paths /system/${LIB}
/product/${LIB}
permitted.paths /system/${LIB}/drm
/system/${LIB}/extractors
/system/${LIB}/hw
/product/${LIB}
/system/framework
/system/app
/system/priv-app
/vendor/app
/vendor/priv-app
/odm/app
/odm/priv-app
/oem/app
/product/framework
/product/app
/product/priv-app
/data
/mnt/expand
isolated true
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 , sphal
link.default.shared_libs LL-NDK
link.default.allow_all_shared_libs true
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 namespaces untuk proses vendor, yang dikutip dari bagian [vendor] di ld.config.txt :

Namespace Properti Nilai
default search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm
/vendor
isolated true
visible true
links system , vndk
link.system.shared_libs LL-NDK
link.vndk.shared_libs VNDK , VNDK-SP (vendor tersedia)
vndk search.paths /odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
isolated true
links system , default
link.system.shared_libs LL-NDK
link.default.allow_all_shared_libs true
system search.paths /system/${LIB}
isolated false

Rincian lebih lanjut dapat ditemukan di ${android-src}/system/core/rootdir/etc/ld.config.txt .

ld.config.vndk_lite.txt

Pada Android 8.0, dynamic linker dikonfigurasikan untuk mengisolasi SP-HAL dan VNDK-SP shared library sehingga simbol-simbol mereka tidak bertentangan dengan framework shared library lain. Hubungan antara ruang nama tautan ditampilkan di bawah ini:

Linker namespace graph dijelaskan dalam ld.config.vndk_lite.txt
Gambar 2. Isolasi ruang nama ld.config.vndk_lite.txt ( ld.config.vndk_lite.txt )

LL-NDK dan VNDK-SP adalah singkatan dari shared library berikut:

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (Tidak di ld.config.txt )
    • libsync.so
    • libvndksupport.so
    • libz.so (Pindah ke VNDK-SP di ld.config.txt )
  • 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 menyajikan konfigurasi namespaces untuk proses kerangka kerja, yang dikutip dari bagian [system] di ld.config.vndk_lite.txt :

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-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

Tabel di bawah ini menyajikan konfigurasi namespaces untuk proses vendor, yang dikutip dari bagian [vendor] di ld.config.vndk_lite.txt :

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} (Sudah usang)
/product/${LIB} (Sudah usang)
isolated false

Rincian lebih lanjut dapat ditemukan di ${android-src}/system/core/rootdir/etc/ld.config.vndk_lite.txt .

Riwayat dokumen

Android P berubah

  • Di Android P, namespace linker vndk ditambahkan ke proses vendor dan pustaka bersama VNDK diisolasi dari namespace linker default.

  • Ganti PRODUCT_FULL_TREBLE dengan lebih spesifik PRODUCT_TREBLE_LINKER_NAMESPACES .

  • Android P mengubah nama file konfigurasi tautan dinamis berikut:

    Android 8.x Android P Deskripsi
    ld.config.txt.in ld.config.txt Untuk perangkat dengan isolasi namespace runtime linker
    ld.config.txt ld.config.vndk_lite.txt Untuk perangkat dengan isolasi namespace VNDK-SP linker
    ld.config.legacy.txt ld.config.legacy.txt Untuk perangkat lawas yang menjalankan Android 7.x dan sebelumnya
  • Hapus android.hardware.graphics.allocator@2.0.so .

  • partisi product dan odm ditambahkan.