Yerel Kütüphaneler için Ad Alanları

Android 7.0, dahili API görünürlüğünü sınırlamak ve uygulamaların yanlışlıkla kendi kitaplıkları yerine platform kitaplıklarını kullandığı durumları çözmek için yerel kitaplıklara yönelik ad alanları sundu. Uygulamaya özel değişiklikler için Android 7.0 Android Geliştiricileri blog gönderisindeki Özel C/C++ Sembol Kısıtlamalarıyla Kararlılığın Artırılması bölümüne bakın.

Mimari

Android 7.0 ve sonraki sürümlerde sistem kitaplıkları uygulama kitaplıklarından ayrılmıştır.

Yerel kitaplıklar için ad alanları

Şekil 1. Yerel kütüphaneler için ad alanları

Yerel kitaplıklara yönelik ad alanları, uygulamaların özel platform yerel API'lerini kullanmasını engeller (OpenSSL'de yapıldığı gibi). Ayrıca uygulamaların yanlışlıkla kendi kitaplıkları yerine platform kitaplıklarını kullandığı durumları da ortadan kaldırır ( libpng görüldüğü gibi). Uygulama kitaplıklarının dahili sistem kitaplıklarını kazara kullanması (veya tam tersi) zordur.

Ek yerel kitaplıklar ekleme

Standart genel yerel kitaplıklara ek olarak, silikon satıcıları (Android 7.0'dan başlayarak) ve cihaz üreticileri (Android 9'dan başlayarak), ilgili kitaplık klasörlerinin altına yerleştirerek ve bunları .txt dosyasında açıkça listeleyerek uygulamalar tarafından erişilebilen ek yerel kitaplıklar sağlamayı seçebilir. Dosyalar.

Kütüphane klasörleri şunlardır:

  • Silikon satıcılarının kitaplıkları için /vendor/lib (32 bit için) ve /vendor/lib64 (64 bit için)
  • Cihaz üreticilerinin kitaplıkları için /system/lib (32 bit için) ve /system/lib64 (64 bit için)

.txt dosyaları şunlardır:

  • Silikon satıcılarının kütüphaneleri için /vendor/etc/public.libraries.txt
  • Cihaz üreticilerinin kitaplıkları için /system/etc/public.libraries-COMPANYNAME.txt ; burada COMPANYNAME üreticinin adını belirtir (örneğin awesome.company ). COMPANYNAME [A-Za-z0-9_.-]+ ile eşleşmelidir; alfanümerik karakterler, _, . (nokta) ve -. Bazı kitaplıklar harici çözüm sağlayıcılardan geliyorsa, bir aygıtta bu tür birden fazla .txt dosyasının bulunması mümkündür.

Cihaz üreticileri tarafından genel kullanıma sunulan system bölümündeki yerel kitaplıkların lib*COMPANYNAME.so olarak adlandırılması GEREKİR ; örneğin, libFoo.awesome.company.so . Başka bir deyişle, şirket adı son eki olmayan libFoo.so kamuya açıklanmamalıdır. Kütüphane dosya adındaki COMPANYNAME , kütüphane adının listelendiği txt dosyası adındaki COMPANYNAME ile eşleşmelidir ZORUNLU.

AOSP'nin parçası olan yerel kütüphaneler herkese açık hale getirilmemelidir ZORUNLU (varsayılan olarak herkese açık olan standart genel yerel kütüphaneler hariç). Yalnızca silikon satıcıları veya cihaz üreticileri tarafından eklenen ek kitaplıklar uygulamalara erişilebilir hale getirilebilir.

Android 8.0'dan itibaren satıcı genel kitaplıkları aşağıdaki ek kısıtlamalara ve gerekli ayarlara sahiptir:

  1. Satıcıdaki yerel kitaplığın, uygulamalar tarafından erişilebilmesi için uygun şekilde etiketlenmesi gerekir. Herhangi bir uygulama için erişim gerekiyorsa (üçüncü taraf uygulamalar dahil), kitaplığın satıcıya özel bir file_contexts dosyasında aşağıdaki şekilde same_process_hal_file olarak etiketlenmesi gerekir:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    burada libnative.so yerel kitaplığın adıdır.
  2. Kitaplık, doğrudan veya bağımlılıkları aracılığıyla geçişli olarak, VNDK-SP ve LLLNDK kitaplıkları dışındaki sistem kitaplıklarına bağlı olmamalıdır. VNDK-SP ve LLNDK kitaplıklarının listesini development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv bulun.

Uygulamaları, herkese açık olmayan yerel kitaplıkları kullanmayacak şekilde güncelleme

Bu özellik yalnızca SDK sürüm 24 veya üstünü hedefleyen uygulamalar için etkinleştirilir; Geriye dönük uyumluluk için Tablo 1'e bakın. Uygulamanız özel yerel kitaplıklara bağlantı veriyorsa neler beklenebilir ? Uygulamaların erişebildiği Android yerel kitaplıklarının listesi (genel yerel kitaplıklar olarak da bilinir) CDD bölüm 3.1.1'de listelenmiştir. 24 veya sonraki sürümleri hedefleyen ve herkese açık olmayan kitaplıkları kullanan uygulamalar güncellenmelidir. Daha fazla ayrıntı için Platform Kitaplıklarına Bağlantı Veren NDK Uygulamalarına bakın.

Uygulamaları yerel kitaplık bağımlılıklarına göre güncelleme

SDK sürüm 31 (Android 12) veya üstünü hedefleyen uygulamaların, uygulama bildirimindeki <uses-native-library> etiketini kullanarak yerel paylaşılan kitaplık bağımlılıklarını açıkça belirtmesi gerekir. İstenilen kitaplığın herhangi bir kısmı cihazda mevcut değilse uygulama yüklenmemiştir. Uygulamalar yüklendiğinde yalnızca istedikleri yerel paylaşılan kitaplıklar sağlanır. Bu, uygulamaların, uygulama bildiriminde görünmeyen yerel paylaşılan kitaplıklara erişemeyeceği anlamına gelir.