Bağlayıcı Ad Alanı

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Dinamik bağlayıcı, Treble VNDK tasarımındaki iki zorluğun üstesinden gelir:

  • VNDK-SP kitaplıkları da dahil olmak üzere SP-HAL paylaşılan kitaplıkları ve bağımlılıkları çerçeve işlemlerine yüklenir. Sembol çakışmalarını önlemek için bazı mekanizmalar olmalıdır.
  • dlopen() ve android_dlopen_ext() , derleme sırasında görünmeyen ve statik analiz kullanarak tespit edilmesi zor olabilecek bazı çalışma zamanı bağımlılıkları getirebilir.

Bu iki zorluk, bağlayıcı ad alanı mekanizması tarafından çözülebilir. Bu mekanizma dinamik bağlayıcı tarafından sağlanır. Aynı kitaplık adına sahip ancak farklı sembollere sahip kitaplıkların çakışmaması için paylaşılan kitaplıkları farklı bağlayıcı ad alanlarında izole edebilir.

Öte yandan, bağlayıcı ad alanı mekanizması, bazı paylaşılan kitaplıkların bir bağlayıcı ad alanı tarafından dışa aktarılabilmesi ve başka bir bağlayıcı ad alanı tarafından kullanılabilmesi için esneklik sağlar. Dışa aktarılan bu paylaşılan kitaplıklar, uygulama ayrıntılarını bağlayıcı ad alanlarında gizlerken diğer programlara açık olan uygulama programlama arabirimleri haline gelebilir.

Örneğin, /system/lib[64]/libcutils.so ve /system/lib[64]/vndk-sp-${VER}/libcutils.so paylaşılan iki kitaplıktır. Bu iki kütüphane farklı sembollere sahip olabilir. Çerçeve modüllerinin /system/lib[64]/libcutils.so ve SP-HAL paylaşımlı kitaplıklarının /system/lib[64]/vndk-sp-${VER}/libcutils.so bağlı olabilmesi için farklı bağlayıcı ad alanlarına yüklenirler. /system/lib[64]/vndk-sp-${VER}/libcutils.so .

Öte yandan, /system/lib[64]/libc.so , bir bağlayıcı ad alanı tarafından dışa aktarılan ve birçok bağlayıcı ad alanına aktarılan bir genel kitaplık örneğidir. libnetd_client.so gibi /system/lib[64]/libc.so bağımlılıkları, /system/lib[64]/libc.so bulunduğu ad alanına yüklenir. Diğer ad alanlarının bu bağımlılıklara erişimi olmayacaktır. Bu mekanizma, genel arayüzleri sağlarken uygulama ayrıntılarını kapsar.

O nasıl çalışır?

Dinamik bağlayıcı, DT_NEEDED girişlerinde belirtilen paylaşılan kitaplıkların veya dlopen() veya android_dlopen_ext() bağımsız değişkeni tarafından belirtilen paylaşılan kitaplıkların yüklenmesinden sorumludur. Her iki durumda da dinamik bağlayıcı, arayanın bulunduğu bağlayıcı ad alanını bulur ve bağımlılıkları aynı bağlayıcı ad alanına yüklemeye çalışır. Dinamik bağlayıcı, paylaşılan kitaplığı belirtilen bağlayıcı ad alanına yükleyemezse, dışa aktarılan paylaşılan kitaplıklar için bağlantılı bağlayıcı ad alanını sorar.

Yapılandırma dosyası biçimi

Yapılandırma dosyası formatı, INI dosya formatına dayanmaktadır. Tipik bir yapılandırma dosyası şöyle görünür:

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}

Yapılandırma dosyası şunları içerir:

  • Dinamik bağlayıcının etkin bölümü seçmesi için başlangıçta birkaç dizin bölümü eşleme özelliği.
  • Birkaç bağlayıcı ad alanı yapılandırma bölümü:
    • Her bölüm, birkaç ad alanı (grafik köşeleri) ve ad alanları (grafik yayları) arasında birkaç geri dönüş bağlantısı içerir.
    • Her ad alanının kendi izolasyonu, arama yolları, izin verilen yolları ve görünürlük ayarları vardır.

Aşağıdaki tablolar, her bir özelliğin anlamını ayrıntılı olarak açıklamaktadır.

Dizin bölümü eşleme özelliği

Mülk Tanım Örnek

dir. name

[ name ] bölümünün geçerli olduğu bir dizine giden yol.

Her özellik, dizin altındaki yürütülebilir dosyaları bir bağlayıcı ad alanları yapılandırma bölümüne eşler. Aynı name sahip ancak farklı dizinlere işaret eden iki (veya daha fazla) özellik olabilir.

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

Bu, [system] bölümünde belirtilen yapılandırmanın, /system/bin veya /system/xbin yüklenen yürütülebilir dosyalar için geçerli olduğunu gösterir.

[vendor] bölümünde belirtilen yapılandırma, /vendor/bin yüklenen yürütülebilir dosyalar için geçerlidir.

ilişki özellikleri

Mülk Tanım Örnek
additional. namespaces

Bölüm için ek ad alanlarının virgülle ayrılmış listesi ( default ad alanına ek olarak).

additional. namespaces = sphal, vndk

Bu, [system] yapılandırmasında üç ad alanı ( default , sphal ve vndk ) olduğunu gösterir.

namespace. name . links

Geri dönüş ad alanlarının virgülle ayrılmış listesi.

Geçerli ad alanında paylaşılan bir kitaplık bulunamazsa, dinamik bağlayıcı, paylaşılan kitaplığı yedek ad alanlarından yüklemeye çalışır. Listenin başında belirtilen ad alanı daha yüksek önceliğe sahiptir.

namespace. sphal. links = default, vndk

Paylaşılan bir kitaplık veya yürütülebilir bir dosya, sphal ad alanına yüklenemeyen bir paylaşılan kitaplık isterse, dinamik bağlayıcı, default ad alanından paylaşılan kitaplığı yüklemeye çalışır.

Ardından, paylaşılan kitaplık default ad alanından da yüklenemiyorsa, dinamik bağlayıcı, paylaşılan kitaplığı vndk ad alanından yüklemeye çalışır.

Son olarak, tüm denemeler başarısız olursa dinamik bağlayıcı bir hata döndürür.

namespace. name . link. other . shared_libs

name alanında bu kitaplıklar bulunamadığında other ad alanlarında aranabilen, iki nokta üst üste ayrılmış paylaşılan kitaplıklar listesi.

Bu özellik namespace. name . link. other . allow_all_shared_libs .

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

Bu, yedek bağlantının istenen kitaplık adı olarak yalnızca libc.so veya libm.so kabul ettiğini gösterir. İstenen kitaplık adı libc.so veya libm.so değilse, dinamik bağlayıcı, sphal default ad alanına geri dönüş bağlantısını yok sayar.

namespace. name . link. other . allow_all_shared_libs

name alanında bu kitaplıklar bulunamadığında, paylaşılan tüm kitaplıkların other ad alanında aranıp aranamayacağını belirten bir boole değeri.

Bu özellik namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

Bu, tüm kitaplık adlarının geri dönüş bağlantısı üzerinden vndk sphal ad alanına geçebileceğini gösterir.

Ad alanı özellikleri

Mülk Tanım Örnek
namespace. name . isolated

Dinamik bağlayıcının paylaşılan kitaplığın bulunduğu yeri kontrol edip etmeyeceğini gösteren bir boole değeri.

isolated true ise, yalnızca search.paths dizinlerinden birinde (alt dizinler hariç) veya permitted.paths verilen.paths dizinlerinden birinin (alt dizinler dahil) altında bulunan paylaşılan kitaplıklar yüklenebilir.

isolated false (varsayılan), dinamik bağlayıcı, paylaşılan kitaplıkların yolunu kontrol etmez.

namespace. sphal. isolated = true

Bu, yalnızca sphal permitted.paths search.paths yüklenebileceğini gösterir.

namespace. name . search.paths

Paylaşılan kitaplıkları aramak için iki nokta üst üste ayrılmış dizin listesi.

dlopen() veya DT_NEEDED girişlerine yapılan işlev çağrıları tam yolu belirtmiyorsa, search.paths içinde belirtilen dizinler istenen kitaplık adının başına eklenir. Listenin başında belirtilen dizin daha yüksek önceliğe sahiptir.

isolated true olduğunda, search.paths dizinlerinden birinde (alt dizinler hariç) bulunan paylaşılan kitaplıklar, permitted.paths özelliğinden bağımsız olarak yüklenebilir.

Örneğin, search.paths /system/${LIB} ise ve permitted.paths boşsa, /system/${LIB}/libc.so yüklenebilir ancak /system/${LIB}/vndk/libutils.so yüklenemez.

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

Bu, dinamik bağlayıcının /system/${LIB} paylaşılan kitaplıkları aradığını gösterir.

namespace. name . asan.search.paths

AddressSanitizer (ASan) etkinleştirildiğinde paylaşılan kitaplıkları aramak için iki nokta üst üste ayrılmış dizin listesi.

namespace. name . search.paths etkinleştirildiğinde search.paths yok sayılır.

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

Bu, ASan etkinleştirildiğinde, dinamik bağlayıcının önce /data/asan/system/${LIB} öğesini ve ardından /system/${LIB} öğesini aradığını gösterir.

namespace. name . permitted.paths

Dinamik bağlayıcının, isolated olduğunda paylaşılan kitaplıkları ( search.paths 'a ek olarak) yükleyebildiği, iki nokta üst üste ayrılmış bir dizin listesi (alt dizinler dahil) true .

permitted.paths yolların alt dizinleri altındaki paylaşılan kitaplıklar da yüklenebilir. Örneğin, permitted.paths /system/${LIB} ise, hem /system/${LIB}/libc.so hem de /system/${LIB}/vndk/libutils.so yüklenebilir.

isolated false , permitted.paths yollar yok sayılır ve bir uyarı verilir.

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

Bu, /system/${LIB}/hw altındaki paylaşılan kitaplıkların yalıtılmış default ad alanına yüklenebileceğini gösterir.

Örneğin, permitted.paths olmadan, libaudiohal.so , /system/${LIB}/hw/audio.a2dp.default.so öğesini default ad alanına yükleyemez.

namespace. name . asan.permitted.paths

ASan etkinleştirildiğinde dinamik bağlayıcının paylaşılan kitaplıkları yükleyebileceği iki nokta üst üste ayrılmış dizin listesi.

namespace. name . permitted.paths Asan etkinleştirildiğinde allow.paths namespace. name . permitted.paths sayılır.

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

Bu, ASan etkinleştirildiğinde /data/asan/system/${LIB}/hw veya /system/${LIB}/hw altındaki paylaşılan kitaplıkların yalıtılmış default ad alanına yüklenebileceğini gösterir.

namespace. name . visible

Programın ( libc dışında) android_get_exported_namespace() ile bir bağlayıcı ad alanı tanıtıcısı elde edip edemediğini ve tutamacı android_dlopen_ext() ileterek bağlayıcı ad alanında paylaşılan bir kitaplık açıp açamayacağını gösteren bir boole değeri.

visible true ise, android_get_exported_namespace() ad alanı varsa her zaman tanıtıcıyı döndürür.

visible false (varsayılan), android_get_exported_namespace() , ad alanının varlığından bağımsız olarak her zaman NULL döndürür. Paylaşılan kitaplıklar bu ad alanına yalnızca (1) bu ad alanına bir geri dönüş bağlantısı olan başka bir bağlayıcı ad alanı tarafından istenirse veya (2) bu ad alanındaki diğer paylaşılan kitaplıklar veya yürütülebilir dosyalar tarafından istenirse yüklenebilir.

namespace. sphal. visible = true

Bu, android_get_exported_namespace("sphal") geçerli bir bağlayıcı ad alanı tanıtıcısı döndürebileceğini gösterir.

Bağlayıcı ad alanı oluşturma

Android 11'de, ${android-src}/system/core/rootdir/etc içindeki düz metin dosyaları kullanmak yerine, linker yapılandırması /linkerconfig altında çalışma zamanında oluşturulur. Yapılandırma, aşağıdaki öğeleri içeren çalışma zamanı ortamına dayalı olarak önyükleme sırasında oluşturulur:

  • Cihaz VNDK'yı destekliyorsa
  • Satıcı bölümünün hedef VNDK sürümü
  • Ürün bölümünün VNDK sürümü
  • Kurulu APEX modülleri

Bağlayıcı yapılandırması, bağlayıcı ad alanları arasındaki bağımlılıkları çözerek oluşturulur. Örneğin, APEX modüllerinde bağımlılık güncellemeleri içeren herhangi bir güncelleme varsa, bu değişiklikleri yansıtan linker konfigürasyonu oluşturulur. Bağlayıcı yapılandırması oluşturmak için daha fazla ayrıntı ${android-src}/system/linkerconfig .

Bağlayıcı ad alanı yalıtımı

Üç yapılandırma türü vardır. BoardConfig.mk PRODUCT_TREBLE_LINKER_NAMESPACES ve BOARD_VNDK_VERSION değerine bağlı olarak, önyükleme sırasında ilgili yapılandırma oluşturulur.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Seçilen konfigürasyon VTS gereksinimi
true current VNDK Android 9 veya sonraki sürümlerle başlatılan cihazlar için zorunlu
Boş VNDK Lite Android 8.x ile başlatılan cihazlar için zorunlu
false Boş Legacy Tiz olmayan cihazlar için

VNDK Lite yapılandırması, SP-HAL ve VNDK-SP paylaşılan kitaplıklarını yalıtır. Android 8.0'da, PRODUCT_TREBLE_LINKER_NAMESPACES true olduğunda bu, dinamik bağlayıcı için yapılandırma dosyası olmalıdır.

VNDK yapılandırması ayrıca SP-HAL ve VNDK-SP paylaşılan kitaplıklarını da yalıtır. Ayrıca, bu yapılandırma tam dinamik bağlayıcı izolasyonu sağlar. Sistem bölümündeki modüllerin satıcı bölümlerindeki paylaşılan kitaplıklara bağlı olmamasını ve bunun tersini sağlar.

Android 8.1 veya sonraki sürümlerde, VNDK yapılandırması varsayılan yapılandırmadır ve BOARD_VNDK_VERSION current olarak ayarlayarak tam dinamik bağlayıcı yalıtımını etkinleştirmeniz önemle tavsiye edilir.

VNDK yapılandırması

VNDK yapılandırması, sistem bölümü ve satıcı bölümleri arasındaki paylaşılan kitaplık bağımlılıklarını yalıtır. Önceki alt bölümde bahsedilen konfigürasyonlarla karşılaştırıldığında, farklılıklar şu şekilde özetlenmiştir:

  • çerçeve süreçleri

    • default , vndk , sphal ve rs ad alanları oluşturulur.
    • Tüm ad alanları yalıtılmıştır.
    • Sistem paylaşılan kitaplıkları default ad alanına yüklenir.
    • SP- sphal ad alanına yüklenir.
    • vndk ad alanına yüklenen VNDK-SP paylaşılan kitaplıkları.
  • Satıcı süreçleri

    • default , vndk ve system ad alanları oluşturulur.
    • default ad alanı yalıtılmıştır.
    • Satıcı tarafından paylaşılan kitaplıklar, default ad alanına yüklenir.
    • VNDK ve VNDK-SP paylaşılan kitaplıkları, vndk ad alanına yüklenir.
    • LL-NDK ve bağımlılıkları system ad alanına yüklenir.

Bağlayıcı ad alanları arasındaki ilişki aşağıda gösterilmiştir.

VNDK yapılandırmasında açıklanan bağlayıcı ad alanı grafiği
Şekil 1. Bağlayıcı ad alanı yalıtımı (VNDK yapılandırması)

Yukarıdaki resimde, LL-NDK ve VNDK-SP , aşağıdaki paylaşılan kitaplıkları temsil eder:

  • 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

Daha fazla ayrıntıyı cihazdan /linkerconfig/ld.config.txt içinde bulabilirsiniz.

VNDK Lite yapılandırması

Android 8.0'dan itibaren, dinamik bağlayıcı, SP-HAL ve VNDK-SP paylaşılan kitaplıklarını, sembolleri diğer çerçeve paylaşılan kitaplıklarıyla çakışmayacak şekilde yalıtacak şekilde yapılandırılmıştır. Bağlayıcı ad alanları arasındaki ilişki aşağıda gösterilmiştir.

VNDK Lite yapılandırmasında açıklanan bağlayıcı ad alanı grafiği
Şekil 2. Bağlayıcı ad alanı yalıtımı (VNDK Lite yapılandırması)

LL-NDK ve VNDK-SP , aşağıdaki paylaşılan kitaplıkları temsil eder:

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (yapılandırmada yok)
    • libsync.so
    • libvndksupport.so
    • libz.so (yapılandırmada VNDK-SP'ye taşındı)
  • 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

Aşağıdaki tablo, VNDK Lite yapılandırmasındaki [system] bölümünden alınan çerçeve işlemleri için ad alanları yapılandırmasını listeler.

ad alanı Mülk Değer
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 (VNDK-SP için) 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 (RenderScript için) 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 (derlenmiş RS çekirdeği için)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

Aşağıdaki tablo, VNDK Lite yapılandırmasındaki [vendor] bölümünden alınan satıcı işlemleri için ad alanları yapılandırmasını sunar.

ad alanı Mülk Değer
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} (kullanımdan kaldırıldı)
/product/${LIB} (kullanımdan kaldırıldı)
isolated false

Daha fazla ayrıntı, cihazdan /linkerconfig/ld.config.txt içinde bulunabilir.

Belge geçmişi

Android 11 Değişiklikleri

  • Android 11'de, statik ld.config.*.txt dosyaları kod tabanından kaldırılır ve LinkerConfig bunları çalışma zamanında oluşturur.

Android 9 değişiklikleri

  • Android 9'da, satıcı işlemlerine vndk bağlayıcı ad alanı eklenir ve VNDK paylaşılan kitaplıkları varsayılan bağlayıcı ad alanından yalıtılır.
  • PRODUCT_TREBLE_LINKER_NAMESPACES PRODUCT_FULL_TREBLE değiştirin.
  • Android 9, aşağıdaki dinamik bağlayıcı yapılandırma dosyalarının adlarını değiştirir.
    Android 8.x Android 9 Tanım
    ld.config.txt.in ld.config.txt Çalışma zamanı bağlayıcı ad alanı yalıtımına sahip cihazlar için
    ld.config.txt ld.config.vndk_lite.txt VNDK-SP bağlayıcı ad alanı yalıtımına sahip cihazlar için
    ld.config.legacy.txt ld.config.legacy.txt Android 7.x veya önceki sürümleri çalıştıran eski cihazlar için
  • android.hardware.graphics.allocator@2.0.so kaldırın.
  • product ve odm bölümleri eklendi.