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()
veandroid_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 |
---|---|---|
|
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ı |
Bu,
|
İlişki özellikleri
Özellik | Açıklama | Örnek |
---|---|---|
additional. |
Ek ad alanlarının virgülle ayrılmış listesi (
|
Bu, üç ad alanı ( |
namespace. |
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. |
Paylaşılan bir kitaplık veya yürütülebilir bir dosya,
Ayrıca, 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 kitaplıklar Bu özellik kullanılamaz
|
Bu, yedek bağlantının yalnızca |
namespace. |
Tüm paylaşılan kitaplıkların
bu kitaplıklar tarafından işlenemediğinde Bu özellik kullanılamaz
|
Bu şekilde, tüm kitaplık adları yedek bağlantıda gezinebilir.
|
Ad alanı özellikleri
Özellik | Açıklama | Örnek |
---|---|---|
namespace. |
Dinamik bağlayıcının kontrol edip etmeyeceğini gösteren boole değeri kitaplığın bulunduğu yer.
|
Bu, yalnızca
|
namespace. |
Paylaşılan aranacak dizinlerin iki nokta üst üste ile ayrılmış listesi kitaplıklar.
Örneğin, |
Bu, dinamik bağlayıcının
Paylaşılan kitaplıklar için |
namespace. |
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.
|
Bu, ne zaman
ASan etkinleştirildiğinde
dinamik bağlayıcı önce |
namespace. |
İki nokta işaretiyle ayrılmış bir dizin listesi (alt dizinler dahil)
dinamik bağlayıcı, paylaşılan kitaplıkları (
Şu alt dizinlerin altındaki paylaşılan kitaplıklar:
|
Bu,
Örneğin, |
namespace. |
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.
|
Bu, ASan'ın etkinleştirildiğini gösterir
|
namespace. |
Programın (
|
Bu, |
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
vers
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
vesystem
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.
Ş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.
.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-NDKlibmediandk.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 spesifikPRODUCT_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ırproduct
veodm
bölümleri eklendi.