Yerel Kitaplıklar için Ad Alanları

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

Mimari

Android 7.0 ve sonraki sürümlerde, sistem kitaplıkları uygulama kitaplıklarından ayrılır.

Yerel kitaplıklar için ad alanları

Şekil 1. Yerel kitaplıklar için ad alanları

Yerel kitaplıklar için ad alanları, uygulamaların özel platform yerel API'lerini kullanmasını engeller (OpenSSL'de olduğu gibi). Ayrıca, uygulamaların yanlışlıkla kendi platform kitaplıkları yerine platform kitaplıklarını kullandığı durumları da ortadan kaldırır ( libpng ile tanık olunduğu gibi). Uygulama kitaplıklarının dahili sistem kitaplıklarını kazara kullanması zordur (ve tersi).

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 itibaren) ilgili kitaplık klasörlerinin altına yerleştirerek ve açıkça .txt dosyasında listeleyerek uygulamalar için erişilebilir ek yerel kitaplıklar sağlamayı seçebilir. Dosyalar.

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

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

.txt dosyaları şunlardır:

  • silikon satıcılarından kitaplıklar için /vendor/etc/public.libraries.txt
  • /system/etc/public.libraries-COMPANYNAME.txt , cihaz üreticilerine ait kitaplıklar için, COMPANYNAME üreticinin adını ifade eder ( awesome.company gibi). 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 cihazda bu tür birden çok .txt dosyası olması mümkündür.

Cihaz üreticileri tarafından herkese açık hale getirilen system bölümündeki yerel kitaplıklar, lib*COMPANYNAME.so olarak adlandırılmalıdır, libFoo.awesome.company.so . Başka bir deyişle, şirket adı son eki olmadan libFoo.so herkese açık YAPILMAMALIDIR. COMPANYNAME dosya adındaki ŞİRKET ADI, kitaplık adının listelendiği txt dosyası adındaki COMPANYNAME ile eşleşmelidir ZORUNLU.

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

Android 8.0'dan başlayarak, satıcı genel kitaplıklarında aşağıdaki ek kısıtlamalar ve gerekli kurulumlar bulunur:

  1. Satıcıdaki yerel kitaplık, uygulamalar tarafından erişilebilir olması için uygun şekilde etiketlenmelidir. Herhangi bir uygulama (üçüncü taraf uygulamalar dahil) için erişim gerekiyorsa, kitaplık satıcıya özel bir file_contexts dosyasında same_process_hal_file olarak etiketlenmelidir:
    /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 LLNDK kitaplıkları dışındaki sistem kitaplıklarına bağlı olmamalıdır. development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv adresinde VNDK-SP ve LLNDK kitaplıklarının listesini bulun.

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

Bu özellik yalnızca SDK 24 veya sonraki sürümünü hedefleyen uygulamalar için etkinleştirilmiştir; geriye dönük uyumluluk için bkz. Tablo 1. Uygulamanız özel yerel kitaplıklara bağlanıyorsa ne beklenir . Uygulamalar tarafından erişilebilen 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 daha yenisini hedefleyen ve herkese açık olmayan kitaplıkları kullanan uygulamalar güncellenmelidir. Daha fazla ayrıntı için Platform Kitaplıklarına Bağlanan NDK Uygulamalarına bakın.

Yerel kitaplık bağımlılıkları için uygulamaları güncelleme

SDK 31 (Android 12) veya sonraki sürümünü hedefleyen uygulamalar, uygulama bildiriminde <uses-native-library> etiketini kullanarak yerel paylaşılan kitaplık bağımlılıklarını açıkça belirtmelidir . İstenen kitaplığın herhangi bir parçası cihazda yoksa uygulama yüklenmez. Uygulamalar yüklendiğinde, yalnızca talep ettikleri 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.