Bağlayıcı ad alanı

Dinamik bağlayıcı, Treble VNDK tasarımında iki zorlukla mücadele eder:

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

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

Ö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ılıp 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 programlama arayüzleri haline gelebilir. Bu arayüzler, uygulama ayrıntılarını bağlayıcı ad alanlarında gizleyerek diğer programlar tarafından kullanılabilir.

Örneğin, /system/lib[64]/libcutils.so ve /system/lib[64]/vndk-sp-${VER}/libcutils.so iki paylaşılan kitaplıktır. Bu iki kitaplığın farklı sembolleri olabilir. Çerçeve modüllerinin /system/lib[64]/libcutils.so'e, SP-HAL paylaşılan kitaplıklarının ise /system/lib[64]/vndk-sp-${VER}/libcutils.so'a bağımlı olabilmesi için farklı bağlayıcı ad alanlarında yüklenir.

Ö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 içe aktarılan herkese açık bir kitaplık örneğidir. /system/lib[64]/libc.so'ün bağımlılıkları (ör. libnetd_client.so), /system/lib[64]/libc.so'ün bulunduğu ad alanına yüklenir. Diğer ad alanlarının bu bağımlılıklara erişimi olmaz. Bu mekanizma, herkese açık arayüzleri sağlarken uygulama ayrıntılarını kapsar.

İşleyiş şekli

Dinamik bağlayıcı, DT_NEEDED girişlerinde belirtilen paylaşılan kitaplıkları veya dlopen() ya da android_dlopen_ext() bağımsız değişkeni tarafından belirtilen paylaşılan kitaplıkları yüklemekten 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ğlı bağlayıcı ad alanını ister.

Yapılandırma dosyası biçimi

Yapılandırma dosyası biçimi, INI dosya biçimini temel alır. Tipik bir yapılandırma dosyası şu şekilde 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 etkili 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ümde birkaç ad alanı (grafik köşeleri) ve ad alanları arasında birkaç yedek bağlantı (grafik yayları) bulunur.
    • Her ad alanının kendi yalıtımı, arama yolları, izin verilen yolları ve görünürlük ayarları vardır.

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

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

Özellik Açıklama Örnek

dir.name

[name] bölümünün geçerli olduğu bir dizinin yolu.

Her mülk, dizin altındaki yürütülebilir dosyaları bir bağlayıcı ad alanı yapılandırma bölümüne eşler. Aynı name değerine sahip ancak farklı dizinleri gösteren iki (veya daha fazla) mülk 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'den 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'dan yüklenen yürütülebilir dosyalara uygulanır.

İlişki özellikleri

Özellik Açıklama Örnek
additional.namespaces

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

additional.namespaces = sphal,vndk

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

namespace.name.links

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

Mevcut 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ının önceliği daha yüksektir.

namespace.sphal.links = default,vndk

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

Ardından, paylaşılan kitaplık default ad alanından da yüklenemezse 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 ad alanında bulunamayan paylaşılan kitaplıkların, other ad alanlarında aranabileceği iki nokta işareti ile ayrılmış liste.

Bu mülk namespace.name.link.other.allow_all_shared_libs ile kullanılamaz.

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 değerini kabul ettiğini gösterir. Dinamik bağlayıcı, istenen kitaplık adı libc.so veya libm.so değilse sphal ile default ad alanı arasındaki yedek bağlantıyı yoksayar.

namespace.name.link.other.allow_all_shared_libs

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

Bu mülk namespace.name.link.other.shared_libs ile kullanılamaz.

namespace.vndk.link.sphal.allow_all_shared_libs = true

Bu, tüm kitaplık adlarının vndk ad alanından sphal ad alanına yedek bağlantı üzerinden gidebileceğini gösterir.

Ad alanı özellikleri

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

Dinamik bağlayıcının, paylaşılan kitaplığın bulunduğu yeri kontrol edip etmeyeceği

isolated true ise yalnızca search.paths dizinlerinden birinde (alt dizinler hariç) bulunan veya permitted.paths dizinlerinden birinde (alt dizinler dahil) altında bulunan ortak kitaplıklar yüklenebilir.

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

namespace.sphal.isolated = true

Bu, yalnızca search.paths içinde veya permitted.paths altındaki paylaşılan kitaplıkların sphal ad alanına yüklenebileceğini gösterir.

namespace.name.search.paths

Paylaşılan kitaplıkların aranacağı, iki nokta işaretiyle ayrılmış bir dizin listesi.

dlopen() veya DT_NEEDED girişlerinde tam yol belirtilmezse search.paths içinde belirtilen dizinler, istenen kitaplık adına eklenir. Listenin başında belirtilen dizin daha yüksek önceliğe sahiptir.

isolated true olduğunda, search.paths dizinlerinden birinde bulunan (alt dizinler hariç) ortak kitaplıklar, permitted.paths mülkünden 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 paylaşılan kitaplıklar için /system/${LIB}'te arama yaptığını gösterir.

namespace.name.asan.search.paths