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ı, 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 tam tersi).
Ek yerel kitaplıklar ekleme
Standart genel yerel kitaplıklara ek olarak, silikon satıcıları (Android 7.0'dan itibaren) 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.companygibi).
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:
- 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_contextsdosyasında
same_process_hal_fileolarak etiketlenmelidir:
/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0burada
libnative.soyerel kitaplığın adıdır.
- 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.csvadresinde 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.