Android 7.0, dahili API görünürlüğünü sınırlamak ve uygulamaların kendi kitaplıkları yerine yanlışlıkla platform kitaplıklarını kullandığı durumları çözmek için yerel kitaplıklar için ad alanları kullanıma sundu. Uygulamaya özel değişiklikler için Android 7.0'da Özel C/C++ Simge Kısıtlamalarıyla Kararlılığı İyileştirme başlıklı Android Developers blog yayınını inceleyin.
Mimari
Android 7.0 ve sonraki sürümlerde sistem kitaplıkları, uygulama kitaplıklarından ayrılır.

Ş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 kendi kitaplıkları yerine yanlışlıkla platform kitaplıklarını kullandığı durumları da ortadan kaldırır (libpng
'te görüldüğü gibi). Uygulama kitaplıklarının, dahili sistem kitaplıklarını yanlışlıkla kullanması (ve bunun tersi) zordur.
Ek yerel kitaplıklar ekleme
Standart herkese açık yerel kitaplıklara ek olarak, silikon tedarikçiler (Android 7.0'dan itibaren) ve cihaz üreticileri (Android 9'dan itibaren), ilgili kitaplık klasörlerinin altına yerleştirip .txt dosyalarında açıkça listeleyerek uygulamaların erişebileceği ek yerel kitaplıklar sunmayı seçebilir.
Kitaplık klasörleri şunlardır:
/vendor/lib
(32 bit için) ve/vendor/lib64
(64 bit için) silikon tedarikçi firmalarının kitaplıkları için- Cihaz üreticilerinin kitaplıkları için
/system/lib
(32 bit) ve/system/lib64
(64 bit)
.txt dosyaları şunlardır:
/vendor/etc/public.libraries.txt
silikon tedarikçi firmaların kitaplıkları için- Cihaz üreticilerinin kitaplıkları için
/system/etc/public.libraries-COMPANYNAME.txt
. BuradaCOMPANYNAME
, üreticinin adını (ör.awesome.company
) ifade eder.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 fazla .txt dosyası bulunabilir.
system
bölümündeki, cihaz üreticileri tarafından herkese açık olarak yayınlanan yerel kitaplıklar lib*COMPANYNAME.so
olarak adlandırılmalıdır (ör. libFoo.awesome.company.so
).
Diğer bir deyişle, şirket adı son eki olmadan libFoo.so
herkese açık olarak paylaşıLMAMALIDIR.
Kitaplık dosya adındaki COMPANYNAME
, kitaplık adının listelendiği txt dosya adındaki COMPANYNAME
ile EŞLEŞMELİDİR.
AOSP'nin bir parçası olan yerel kitaplıklar herkese açık hale GETİRİLMEMELİDİR (varsayılan olarak herkese açık olan standart herkese açık yerel kitaplıklar hariç). Yalnızca silikon tedarikçileri veya cihaz üreticileri tarafından eklenen ek kitaplıklar uygulamalar tarafından erişilebilir hale getirilebilir.
Android 8.0'dan itibaren, tedarikçinin herkese açık kitaplıkları aşağıdaki ek kısıtlamalara ve gerekli kurulumlara tabidir:
- Tedarikçi firmadaki yerel kitaplık, uygulamalar tarafından erişilebilmesi için doğru şekilde etiketlenmelidir. Herhangi bir uygulama (üçüncü taraf uygulamaları dahil) tarafından erişim gerekiyorsa kitaplık, tedarikçiye özgü bir
file_contexts
dosyasında aşağıdaki gibisame_process_hal_file
olarak etiketlenmelidir: Burada/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so
, yerel kitaplığın adıdır. - Kitaplık, doğrudan veya bağımlılıkları aracılığıyla VNDK-SP ve LLNDK 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
adresinde bulabilirsiniz.
Android 15'ten itibaren tedarikçi firmanın herkese açık kitaplıkları bir tedarikçi firma APEX'ine yerleştirilebilir. Tedarikçi APEX'e paketlendiğinde, kitaplıkları APEX manifest dosyasında bir provideNativeLibs
mülkünde listeleyin.
Uygulamaları, herkese açık olmayan yerel kitaplıkları kullanmaması için güncelleyin
Bu özellik yalnızca SDK 24 veya sonraki sürümleri hedefleyen uygulamalarda etkindir. Geriye dönük uyumluluk için Tablo 1'e bakın. Uygulamanız özel yerel kitaplıklara bağlıysa ne olur? Uygulamaların erişebildiği Android yerel kitaplıklarının listesi (herkese açık yerel kitaplıklar olarak da bilinir), CDD bölüm 3.1.1'de listelenmiştir. 24 veya daha yeni sürümleri hedefleyen ve herkese açık olmayan kitaplıklar kullanan uygulamalar güncellenmelidir. Daha fazla bilgi için Platform Kitaplıklarına Bağlanan NDK Uygulamaları başlıklı makaleyi inceleyin.
Uygulamaları yerel kitaplık bağımlılıklarıyla ilgili olarak güncelleme
SDK sürüm 31'i (Android 12) veya sonraki sürümleri hedefleyen uygulamalar, uygulama manifestinde <uses-native-library>
etiketini kullanarak yerel paylaşılan kitaplık bağımlılıklarını açıkça belirtmelidir. İstenen kitaplığın herhangi bir bölümü cihazda yoksa uygulama yüklü değildir. Uygulamalar yüklenirken yalnızca istenen yerel paylaşılan kitaplıklar sağlanır. Bu, uygulamaların uygulama manifestinde görünmeyen yerel paylaşılan kitaplıklara erişemeyeceği anlamına gelir.