Bağlayıcı ad alanı

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

  • SP-HAL paylaşılan kitaplıkları ve VNDK-SP dahil bağımlılıklarını çerçeve işlemlerine yüklenir. Ekipmanlarda koruma mekanizmalarını nasıl kullanacağınızı öğreneceksiniz.
  • dlopen() ve android_dlopen_ext() şunları yapabilir: veya çalışma zamanında görülmeyen bazı çalışma zamanı bağımlılıklarını tespit edilmesi zordur.

Bu iki zorluk, bağlayıcı ad alanı ile çözülebilir. mekanizmasıdır. Bu mekanizma dinamik bağlayıcı tarafından sağlanır. Google paylaşılan kitaplıkları farklı bağlayıcı ad alanlarında aynı kitaplık adına sahip ancak farklı simgelere sahip kitaplıklar çakışmaz.

Öte yandan bağlayıcı ad alanı mekanizması, Böylece bazı paylaşılan kitaplıklar bir bağlayıcı ad alanı tarafından dışa aktarılabilir ve başka bir bağlayıcı ad alanı içerir. Dışa aktarılan bu paylaşılan kitaplıklar diğer programlarda da herkesin kullanımına açık olan kendi uygulama ayrıntılarını bağlayıcı ad alanlarında saklayabilir.

Örneğin, /system/lib[64]/libcutils.so ve /system/lib[64]/vndk-sp-${VER}/libcutils.so iki tanesi ortak kitaplıklar. Bu iki kütüphanenin farklı sembolleri olabilir. Yüklendiler farklı bağlayıcı ad alanlarına ayırır. Böylece çerçeve modülleri, /system/lib[64]/libcutils.so ve SP-HAL paylaşılan kitaplıkları şuna bağlıdır: /system/lib[64]/vndk-sp-${VER}/libcutils.so.

Diğer yandan, /system/lib[64]/libc.so, bağlayıcı ad alanı tarafından dışa aktarılan ve birçok bağlayıcı ad alanı bulunur. Bağımlılıkların /system/lib[64]/libc.so; ör. libnetd_client.so, /system/lib[64]/libc.so ürününün yer alır. Diğer ad alanları bu bağımlılıklara erişemez. Bu mekanizma, uygulama ayrıntılarını içerirken bir yandan da kamu yararına kullanır.

İşleyiş şekli

Dinamik bağlayıcı, belirtilen paylaşılan kitaplıkları yüklemekten sorumludur DT_NEEDED girişlerinde veya bağımsız değişkeni dlopen() veya android_dlopen_ext() olur. İkisinde de durumlarda, dinamik bağlayıcı, çağrıyı yapanın söz konusu bulunur ve bağımlılıkları aynı bağlayıcı ad alanına yüklemeye çalışır. Eğer dinamik bağlayıcı, paylaşılan kitaplığı belirtilen bağlayıcıya yükleyemiyor bağlı bağlayıcı ad alanını, dışa aktarılan paylaşılan kitaplıklar.

Yapılandırma dosyası biçimi

Yapılandırma dosyasının biçimi INI dosya biçimini temel alır. Normal 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ğlantı aracını kullanın.
  • Birkaç bağlayıcı ad alanı yapılandırma bölümü:
    • Her bölüm birkaç ad alanı (grafik köşeleri) ve birkaç ad alanı içerir. ad alanları arasındaki yedek bağlantılar (grafik yayları).
    • Her ad alanının kendine ait yalıtımı, arama yolları, izin verilen yolları ve ve görünürlük ayarlarınızı kontrol edin.

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

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

Özellik Açıklama Örnek

dir.name

[name] bölümünün bulunduğu bir dizine giden yol hakkında genel bilgi verir.

Her özellik, dizin altındaki yürütülebilir dosyaları bir bağlayıcıyla eşler ad alanı yapılandırma bölümüne gidin. İki (veya daha fazla) mülk olabilir aynı name öğesine sahip ancak farklı dizin oluşturabilirsiniz.

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

Bu, [system] bölümü, yüklenen yürütülebilir dosyalar için geçerlidir /system/bin veya /system/xbin arasından.

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

İlişki özellikleri

Özellik Açıklama Örnek
additional.namespaces

Ek ad alanlarının virgülle ayrılmış listesi ( default ad alanı) kaldırın.

additional.namespaces = sphal,vndk

Bu, üç ad alanı (default, sphal ve vndk) sonra [system] yapılandırma.

namespace.name.links

Yedek ad alanlarının virgülle ayrılmış listesi.

Paylaşılan bir kitaplık mevcut ad alanında bulunamazsa dinamik bağlayıcı, yedek ad alanlarından paylaşılan kitaplığı yüklemeye çalışır. İlgili içeriği oluşturmak için kullanılan listenin başında belirtilen ad alanının daha yüksek önceliğe sahip olduğunu gösterir.

namespace.sphal.links = default,vndk

Paylaşılan bir kitaplık veya yürütülebilir bir dosya, sphal ad alanına (dinamik bağlayıcı) yüklenemiyor paylaşılan kitaplığı default kaynağından yüklemeye çalışır tıklayın.

Ayrıca, paylaşılan kitaplık default ad alanını seçerseniz dinamik bağlayıcı, vndk ad alanından paylaşılan kitaplık.

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

Bu kitaplıklarother name ad alanı.

Bu özellik kullanılamaz namespace.name.link.other.allow_all_shared_libs

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

Bu, yedek bağlantının yalnızca libc.so kabul ettiğini gösterir veya istenen kitaplık adı olarak libm.so. Dinamik bağlayıcı sphal alanındaki yedek bağlantıyı yoksayar İstenen kitaplık adı değilse default ad alanı libc.so veya libm.so.

namespace.name.link.other.allow_all_shared_libs

Tüm paylaşılan kitaplıkların bu kitaplıklar tarafından işlenemediğinde other ad alanında aranamaz name ad alanında bulunur.

Bu özellik kullanılamaz namespace.name.link.other.shared_libs

namespace.vndk.link.sphal.allow_all_shared_libs = true

Bu şekilde, tüm kitaplık adları yedek bağlantıda gezinebilir. vndk değerinden sphal ad alanına geçiş yapın.

Ad alanı özellikleri

Özellik Açıklama Örnek
namespace.name.isolated

Dinamik bağlayıcının kontrol edip etmeyeceğini gösteren boole değeri kitaplığın bulunduğu yer.

isolated değeri true ise yalnızca paylaşılan kitaplıklar search.paths dizinlerinden birinde yer alan (alt dizinler hariç) veya permitted.paths dizin (alt dizinler dahil) yüklendi.

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

namespace.sphal.isolated = true

Bu, yalnızca search.paths veya permitted.paths yaşından küçük kullanıcılar sphal ad alanına yüklenir.

namespace.name.search.paths

Paylaşılan aranacak dizinlerin iki nokta üst üste ile ayrılmış listesi kitaplıklar.

search.paths öğesinde belirtilen dizinler başa eklenmiş işlev dlopen() veya DT_NEEDED girişlerinde tam yolu belirtmiyor. Dizin listenin başında belirtilen daha yüksek önceliğe sahip.

isolated true olduğunda, şu sayıda paylaşılan kitaplıklar: search.paths dizinden birinde yer alıyor ( alt dizinleri) sağlanan permitted.paths etiketinden bağımsız olarak yüklenebilir.

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

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

Bu, dinamik bağlayıcının Paylaşılan kitaplıklar için /system/${LIB}.

namespace.name.asan.search.paths

Aşağıdaki durumlarda paylaşılan kitaplıkların aranacağı dizinlerin iki nokta üst üste ile ayrılmış listesi Adres Temizleyici (ASan) etkin olmalıdır.

namespace.name.search.paths ASan olduğunda yoksayılır etkin.

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

Bu, ne zaman ASan etkinleştirildiğinde dinamik bağlayıcı önce /data/asan/system/${LIB} ve ardından /system/${LIB} araması yapar.

namespace.name.permitted.paths

İki nokta işaretiyle ayrılmış bir dizin listesi (alt dizinler dahil) dinamik bağlayıcı, paylaşılan kitaplıkları ( search.paths), isolated bu durumda true.

Şu alt dizinlerin altındaki paylaşılan kitaplıklar: permitted.paths de yüklenebilir. Örneğin, permitted.paths /system/${LIB}, hem /system/${LIB}/libc.so hem de /system/${LIB}/vndk/libutils.so yüklenebilir.

isolated değeri false ise permitted.paths yoksayılır ve bir uyarı gönderilir.

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

Bu, /system/${LIB}/hw, izole edilmiş default ad alanı.

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

namespace.name.asan.permitted.paths

Dinamik bağlayıcının yükleyebileceği dizinlerin, iki nokta üst üste ile ayrılmış listesi ASan etkinleştirildiğinde paylaşılan kitaplıklar için geçerlidir.

namespace.name.permitted.paths ASan etkinleştirildiğinde yoksayılır.

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

Bu, ASan'ın etkinleştirildiğini gösterir /data/asan/system/${LIB}/hw altındaki paylaşılan kitaplıklar veya /system/${LIB}/hw, izole edilmiş default ad alanı.

namespace.name.visible

Programın ( libc) aşağıdakileri içeren bir bağlayıcı ad alanı işleyicisi elde edebilir: android_get_exported_namespace() ve paylaşılan bir kitaplığı şurada açın: tanıtıcı ad alanını android_dlopen_ext().

visible değeri true ise android_get_exported_namespace(), şu durumlarda her zaman herkese açık kullanıcı adını döndürür: ad alanının mevcut olduğundan emin olun.

visible, false (varsayılan) ise android_get_exported_namespace() her zaman dönüyor NULL. Paylaşılan kitaplıklar Bu ad alanına, yalnızca (1) başka bir alan tarafından istenmesi durumunda yüklenebilir bu ad alanına yedek bir bağlantıya sahip bağlayıcı ad alanı veya (2) bu ad alanındaki diğer paylaşılan kitaplıklar veya yürütülebilir dosyalar tarafından istekte bulunuldu.

namespace.sphal.visible = true

Bu, android_get_exported_namespace("sphal") geçerli bir bağlayıcı ad alanı işleyicisi döndürebilir.

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

Android 11'de bağlayıcı yapılandırması, çalışma zamanında şunun altında oluşturulur: Bunun yerine /linkerconfig ${android-src}/system/core/rootdir/etc. Yapılandırma, başlatma sırasında oluşturulur süresi, aşağıdaki öğeleri de içeren çalışma zamanı ortamına göre değişir:

  • Cihaz VNDK'yı destekliyorsa
  • Tedarikçi firma bölümünün hedef VNDK sürümü
  • Ürün bölümünün VNDK sürümü
  • APEX modülleri yüklendi

Bağlayıcı yapılandırması, bağlayıcı ad alanları arasındaki bağımlılıkların çözümlenmesiyle oluşturulur. Örneğin, Örneğin, APEX modüllerinde bağımlılık güncellemelerini, bağlayıcıyı ve bu değişiklikleri yansıtan yapılandırma oluşturulur. Bağlayıcı yapılandırması oluşturma hakkında daha fazla bilgi şuradan bulunabilir: ${android-src}/system/linkerconfig.

Bağlayıcı ad alanı izolasyonu

Üç yapılandırma türü vardır. Projenin değerine bağlı olarak, PRODUCT_TREBLE_LINKER_NAMESPACES ve BoardConfig.mk içinde BOARD_VNDK_VERSION, başlatma sırasında oluşturulur.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Seçili yapılandırma VTS gereksinimi
true current VNDK Android 9 veya sonraki sürümlerin yüklü olduğu cihazlar için zorunludur
Boş VNDK Lite Android 8.x ile kullanıma sunulan cihazlar için zorunludur
false Boş Legacy Treble olmayan cihazlar için

VNDK Lite yapılandırması, SP-HAL ve VNDK-SP paylaşılan kitaplıkları birbirinden ayırır. Android 8.0'da bu, şu durumda dinamik bağlayıcı için yapılandırma dosyası olmalıdır: PRODUCT_TREBLE_LINKER_NAMESPACES true.

VNDK yapılandırması, SP-HAL ve VNDK-SP paylaşılan kitaplıkları da izole eder. Ayrıca, bu yapılandırma, tam dinamik bağlayıcı izolasyonu sağlar. Sistem bölümündeki modüllerin, paylaşılan kitaplıklarında veya tam tersi geçerlidir.

Android 8.1 veya sonraki sürümlerde varsayılan yapılandırma VNDK yapılandırmasıdır ve BOARD_VNDK_VERSION - current.

VNDK yapılandırması

VNDK yapılandırması, paylaşılan kitaplık bağımlılıklarını izole eder ayırmalarını öneririz. Şuna kıyasla: önceki alt bölümde belirtilen yapılandırmaların şu şekilde özetlenmiştir:

  • Çerçeve süreçleri

    • default, vndk, sphal ve rs ad alanları oluşturuldu.
    • Tüm ad alanları izole edilir.
    • Sistem tarafından paylaşılan kitaplıklar, default ad alanına yüklenir.
    • SP-HAL'ler, sphal ad alanına yüklenir.
    • vndk ad alanına yüklenen VNDK-SP paylaşılan kitaplıkları.
  • Tedarikçi işlemleri

    • default, vndk ve system ad alanları oluşturuldu.
    • default ad alanı izole edildi.
    • Tedarikçi firma 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österilmektedir.

VNDK yapılandırmasında açıklanan bağlayıcı ad alanı grafiği

Şekil 1. Bağlayıcı ad alanı izolasyonu (VNDK yapılandırması).

Yukarıdaki resimde LL-NDK ve VNDK-SP açılımı paylaşılan kitaplıklar:

  • 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

Cihazdaki /linkerconfig/ld.config.txt bölümünde daha fazla bilgi bulabilirsiniz.

VNDK Lite yapılandırması

Android 8.0 sürümünden itibaren, dinamik bağlayıcı SP-HAL ve VNDK-SP, simgelerinin başkalarıyla çakışmayacağı şekilde paylaşılan çerçeve paylaşımlı kitaplıklar da dahildir. 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ı izolasyonu (VNDK Lite yapılandırması)
ziyaret edin.

LL-NDK ve VNDK-SP, şu paylaşılan kitaplıklar anlamına gelir:

  • 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 (şurada VNDK-SP'ye taşındı: yapılandırma)
  • 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 tabloda çerçeve için ad alanı yapılandırması listelenmektedir (bu belgedeki [system] bölümünden alınmıştır) VNDK Lite yapılandırması.

Ad alanı Özellik 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 tabloda tedarikçi firma işlemleri için ad alanı yapılandırması gösterilmektedir. alınan metindir.[vendor] VNDK Lite yapılandırması.

Ad alanı Özellik 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} (desteği sonlandırılmış)
/product/${LIB} (kullanımdan kaldırıldı)
isolated false

Daha fazla ayrıntıyı cihazdaki /linkerconfig/ld.config.txt bölümünde bulabilirsiniz.

Doküman 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 vndk bağlayıcı ad alanı, tedarikçi firmaya eklenir. işlemler ve VNDK paylaşılan kitaplıkları, varsayılan bağlayıcıdan izole edilir tıklayın.
  • PRODUCT_FULL_TREBLE yerine daha spesifik PRODUCT_TREBLE_LINKER_NAMESPACES.
  • Android 9, aşağıdaki dinamik bağlayıcı yapılandırmasının adlarını değiştirir dosyası olarak da kaydedebilir.
    Android 8.x Android 9 Açıklama
    ld.config.txt.in ld.config.txt Çalışma zamanı bağlayıcı ad alanı izolasyonuna sahip cihazlar için
    ld.config.txt ld.config.vndk_lite.txt VNDK-SP bağlayıcı ad alanı izolasyonuna 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 öğesini kaldır
  • product ve odm bölümleri eklendi.