Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Ruang Nama Linker

Linker dinamis menangani dua tantangan dalam desain Treble VNDK:

  • Library bersama SP-HAL dan dependensinya, termasuk library VNDK-SP, dimuat ke dalam proses kerangka kerja. Harus ada beberapa mekanisme untuk mencegah konflik simbol.
  • dlopen() dan android_dlopen_ext() bisa memperkenalkan beberapa dependensi waktu proses yang tidak terlihat pada waktu build dan bisa sulit dideteksi menggunakan analisis statis.

Kedua tantangan ini dapat diatasi dengan mekanisme namespace linker . Mekanisme ini disediakan oleh dynamic linker. Itu dapat mengisolasi pustaka bersama di ruang nama penaut yang berbeda sehingga pustaka dengan nama pustaka yang sama tetapi dengan simbol yang berbeda tidak akan konflik.

Di sisi lain, mekanisme namespace linker memberikan fleksibilitas sehingga beberapa library bersama dapat diekspor oleh namespace linker dan digunakan oleh namespace linker lain. Pustaka bersama yang diekspor ini dapat menjadi antarmuka pemrograman aplikasi yang tersedia untuk umum bagi program lain sambil menyembunyikan detail implementasinya dalam ruang nama penautnya.

Misalnya, /system/lib[64]/libcutils.so dan /system/lib[64]/vndk-sp-${VER}/libcutils.so adalah dua perpustakaan bersama. Kedua pustaka ini dapat memiliki simbol yang berbeda. Mereka 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 merangkum detail 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, penaut dinamis menemukan ruang nama penaut tempat pemanggil berada dan mencoba memuat dependensi ke dalam ruang nama penaut yang sama. Jika penaut dinamis tidak dapat memuat pustaka bersama ke dalam ruang nama penaut yang ditentukan, ia meminta ruang nama penaut tertaut untuk pustaka bersama yang diekspor.

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 penaut dinamis untuk memilih bagian yang efektif.
  • Beberapa bagian konfigurasi namespace linker:
    • Setiap bagian berisi beberapa ruang nama (simpul grafik) dan beberapa tautan balik antar ruang nama (busur grafik).
    • Setiap namespace memiliki isolasi, jalur pencarian, jalur yang diizinkan, dan setelan visibilitasnya sendiri.

Tabel di bawah menjelaskan arti setiap properti secara mendetail.

Properti pemetaan bagian direktori

Properti Deskripsi Contoh

dir. name

Path ke direktori tempat bagian [ name ] diterapkan.

Setiap properti memetakan executable di bawah direktori ke bagian konfigurasi namespaces linker. Mungkin ada dua (atau lebih) properti yang memiliki name sama tetapi mengarah 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 dimuat dari /system/bin atau /system/xbin .

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

Properti hubungan

Properti Deskripsi Contoh
additional. namespaces

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

additional. namespaces = sphal, vndk

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

namespace. name . links

Daftar namespace fallback yang dipisahkan koma.

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

namespace. sphal. links = default, vndk

Jika perpustakaan bersama atau permintaan eksekusi perpustakaan bersama yang tidak dapat dimuat ke dalam ruang nama sphal , linker dinamis mencoba untuk memuat perpustakaan bersama dari ruang nama default .

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

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

namespace. name . link. other . shared_libs

Daftar pustaka bersama yang dipisahkan titik dua yang bisa dicari di ruang nama other saat pustaka tersebut tidak dapat ditemukan di ruang name nama.

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 fallback hanya menerima libc.so atau libm.so sebagai nama pustaka yang diminta. Linker dinamis mengabaikan link fallback 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 dicari di namespace other ketika pustaka tersebut tidak 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 vndk ke namespace sphal .

Properti ruang nama

Properti Deskripsi Contoh
namespace. name . isolated

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

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

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

namespace. sphal. isolated = true

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

namespace. name . search.paths

Daftar direktori yang dipisahkan titik dua untuk mencari perpustakaan bersama.

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

Jika isolated true , pustaka bersama yang ada di salah satu direktori search.paths (tidak termasuk subdirektori) bisa dimuat terlepas dari properti 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 bisa dimuat.

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

Ini menunjukkan bahwa pencarian linker dinamis /system/${LIB} untuk perpustakaan bersama.

namespace. name . asan.search.paths

Daftar direktori yang dipisahkan titik dua untuk mencari pustaka bersama saat AddressSanitizer (ASan) diaktifkan.

namespace. name . search.paths diabaikan saat ASan diaktifkan.

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

Ini menunjukkan bahwa ketika ASan diaktifkan, penaut dinamis menelusuri /data/asan/system/${LIB} terlebih dahulu, kemudian menelusuri /system/${LIB} .

namespace. name . permitted.paths

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

Pustaka bersama yang berada di bawah subdirektori permitted.paths juga bisa dimuat. Misalnya, jika permitted.paths adalah /system/${LIB} , /system/${LIB}/libc.so dan /system/${LIB}/vndk/libutils.so dapat dimuat.

Jika isolated false , permitted.paths . permitted.paths diabaikan dan peringatan dibunyikan.

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

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

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

namespace. name . asan.permitted.paths

Daftar direktori yang dipisahkan titik dua tempat linker dinamis dapat memuat pustaka bersama saat ASan diaktifkan.

namespace. name . permitted.paths diabaikan saat ASan diaktifkan.

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

Ini menunjukkan bahwa ketika ASan diaktifkan, library bersama di bawah /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 ) bisa mendapatkan pegangan namespace linker dengan android_get_exported_namespace() dan membuka library bersama di namespace linker dengan meneruskan pegangan 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 dapat dimuat ke dalam namespace ini hanya jika (1) diminta oleh namespace penaut lain yang memiliki tautan cadangan ke namespace ini, atau (2) diminta oleh pustaka bersama atau file executable lain di namespace ini.

namespace. sphal. visible = true

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

Pembuatan namespace linker

Di Android 11, konfigurasi linker dibuat pada waktu proses di bawah /linkerconfig daripada menggunakan file teks biasa di ${android-src}/system/core/rootdir/etc Konfigurasi dibuat pada saat boot 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 antara namespace linker. Misalnya, jika ada pembaruan apa pun pada modul APEX yang menyertakan pembaruan ketergantungan, konfigurasi linker 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 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 pustaka bersama SP-HAL dan VNDK-SP. Di Android 8.0, ini harus menjadi file konfigurasi untuk linker dinamis jika PRODUCT_TREBLE_LINKER_NAMESPACES true .

Konfigurasi VNDK juga mengisolasi library bersama SP-HAL dan VNDK-SP. Selain itu, konfigurasi ini menyediakan isolasi linker dinamis penuh. Itu memastikan bahwa modul di partisi sistem tidak akan bergantung pada pustaka 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 dependensi pustaka bersama antara partisi sistem dan partisi vendor. Dibandingkan dengan konfigurasi yang disebutkan di sub-bagian sebelumnya, perbedaannya diuraikan sebagai berikut:

  • Proses kerangka kerja

    • default , ruang nama vndk , sphal , dan rs dibuat.
    • Semua ruang nama diisolasi.
    • Perpustakaan bersama sistem dimuat ke dalam namespace default .
    • SP-HAL dimuat ke dalam namespace sphal .
    • Pustaka bersama VNDK-SP dimuat ke namespace vndk .
  • Proses vendor

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

Hubungan antara ruang nama penaut diilustrasikan di bawah ini.

Grafik namespace linker dijelaskan dalam konfigurasi VNDK
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, dynamic linker dikonfigurasi untuk mengisolasi library bersama SP-HAL dan VNDK-SP sehingga simbolnya tidak bertentangan dengan library bersama framework lainnya. Hubungan antara ruang nama penaut ditunjukkan di bawah ini.

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

LL-NDK dan VNDK-SP adalah singkatan dari pustaka bersama berikut:

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (tidak 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 ruang nama untuk proses kerangka kerja, yang dikutip 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-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

Tabel di bawah ini menyajikan konfigurasi ruang nama untuk proses vendor, yang dikutip 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.

Sejarah dokumen

Android 11 Perubahan

  • Di Android 11, file statis ld.config.*.txt dihapus dari basis kode dan LinkerConfig membuatnya dalam waktu proses.

Android 9 berubah

  • Di Android 9, namespace linker vndk ditambahkan ke proses vendor dan library bersama VNDK diisolasi dari namespace linker default.
  • Ganti PRODUCT_FULL_TREBLE dengan lebih spesifik PRODUCT_TREBLE_LINKER_NAMESPACES .
  • 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 lawas yang menjalankan Android 7.x atau lebih rendah
  • Hapus android.hardware.graphics.allocator@2.0.so .
  • product dan partisi odm ditambahkan.