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()
veandroid_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 |
---|---|---|
|
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ı |
Bu,
|
İlişki özellikleri
Özellik | Açıklama | Örnek |
---|---|---|
additional. |
Bölüm için |
Bu, |
namespace. |
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. |
Paylaşılan bir kitaplık veya yürütülebilir dosya, Ardı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. |
Bu mülk |
Bu, yedek bağlantının istenen kitaplık adı olarak yalnızca |
namespace. |
Bu mülk |
Bu, tüm kitaplık adlarının |
Ad alanı özellikleri
Özellik | Açıklama | Örnek |
---|---|---|
namespace. |
Dinamik bağlayıcının, paylaşılan kitaplığın bulunduğu yeri kontrol edip etmeyeceği
|
Bu, yalnızca |
namespace. |
Paylaşılan kitaplıkların aranacağı, iki nokta işaretiyle ayrılmış bir dizin listesi.
Örneğin, |
Bu, dinamik bağlayıcının paylaşılan kitaplıklar için |
namespace. |