Android 7.0, dahili API görünürlüğünü sınırlamak ve uygulamaların kendi platform kitaplıklarını yanlışlıkla 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.
Yerel kitaplıklar için ad alanları, uygulamaların özel platform yerel API'lerini (OpenSSL ile yapıldığı gibi) kullanmasını engeller. Ayrıca, uygulamaların kendi kitaplıkları yerine yanlışlıkla platform kitaplıklarını kullandığı durumları (libpng
'te görüldüğü gibi) ortadan kaldırır. 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ıkların yanı sıra silikon satıcıları (Android 7.0'dan itibaren) ve cihaz üreticileri (Android 9'dan itibaren) uygulamaları ilgili kitaplık klasörlerinin altına yerleştirip .txt dosyalarında açık bir şekilde listeleyerek uygulamaların kullanabildiği ek yerel kitaplıklar sağlamayı tercih edebilirler.
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ı:
/vendor/etc/public.libraries.txt
for libraries from silicon vendors- 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 hale getirilen 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 dosyası adındaki COMPANYNAME
ile eşleşmelidir.
AOSP kapsamındaki yerel kitaplıklar (varsayılan olarak herkese açık olan standart yerel kitaplıklar hariç) herkese açık ÜRETİLMEMELİDİR. 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ığın, uygulamaların erişebilmesi için doğru şekilde etiketlenmesi gerekir. 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 satıcının herkese açık kitaplıkları, bir sağlayıcı APEX'ine yerleştirilebilir. Bir 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 bir sürümü hedefleyen uygulamalar için etkinleştirilir. Geriye dönük uyumluluk için bkz. Tablo 1.Uygulamanız özel yerel kitaplıklara bağlantı veriyorsa 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.
Yerel kitaplık bağımlılıkları için uygulamaları 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.