Android 7.0 memperkenalkan namespace untuk library native guna membatasi visibilitas API internal dan menyelesaikan situasi saat aplikasi tidak sengaja menggunakan library platform, bukan library-nya sendiri. Lihat postingan blog Developer Android Meningkatkan Stabilitas dengan Pembatasan Simbol C/C++ Pribadi di Android 7.0 untuk perubahan khusus aplikasi.
Arsitektur
Di Android 7.0 dan yang lebih tinggi, library sistem dipisahkan dari library aplikasi.
Namespace untuk library native mencegah aplikasi menggunakan API native
platform pribadi (seperti yang dilakukan dengan OpenSSL). Cara ini juga menghapus situasi saat aplikasi
tidak sengaja menggunakan library platform, bukan library miliknya sendiri (seperti yang disaksikan
dengan libpng
). Library aplikasi yang mengalami error tidak sengaja menggunakan
library sistem internal (begitu pula sebaliknya).
Menambahkan library native tambahan
Selain library native publik standar, vendor silicon (mulai dari Android 7.0) dan produsen perangkat (mulai dari Android 9) dapat memilih untuk menyediakan library native tambahan yang dapat diakses oleh aplikasi dengan menempatkannya di folder library masing-masing dan mencantumkannya secara eksplisit dalam file .txt.
Folder library adalah:
/vendor/lib
(untuk 32-bit) dan/vendor/lib64
(untuk 64-bit) untuk library dari vendor silikon/system/lib
(untuk 32-bit) dan/system/lib64
(untuk 64-bit) untuk library dari produsen perangkat
File .txt adalah:
/vendor/etc/public.libraries.txt
untuk library dari vendor silicon/system/etc/public.libraries-COMPANYNAME.txt
untuk library dari produsen perangkat, denganCOMPANYNAME
merujuk pada nama produsen (misalnyaawesome.company
).COMPANYNAME
harus cocok dengan[A-Za-z0-9_.-]+
; karakter alfanumerik, _, . (titik) dan -. Anda dapat memiliki beberapa file .txt tersebut di perangkat jika beberapa library berasal dari penyedia solusi eksternal.
Library native di partisi system
yang dipublikasikan oleh produsen perangkat
HARUS diberi nama lib*COMPANYNAME.so
, misalnya, libFoo.awesome.company.so
.
Dengan kata lain, libFoo.so
tanpa akhiran nama perusahaan TIDAK BOLEH dipublikasikan.
COMPANYNAME
dalam nama file library HARUS cocok dengan COMPANYNAME
dalam
nama file txt tempat nama library dicantumkan.
Library native yang merupakan bagian dari AOSP TIDAK BOLEH dijadikan publik (kecuali library native publik standar yang bersifat publik secara default). Hanya library tambahan yang ditambahkan oleh vendor silicon atau produsen perangkat yang dapat diakses oleh aplikasi.
Mulai dari Android 8.0, library publik vendor memiliki pembatasan tambahan dan penyiapan yang diperlukan berikut:
- Library native di vendor harus diberi label dengan benar agar dapat
diakses oleh aplikasi. Jika akses diperlukan oleh aplikasi apa pun (termasuk aplikasi
pihak ketiga), library harus diberi label sebagai
same_process_hal_file
dalam filefile_contexts
khusus vendor sebagai berikut: dengan/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so
adalah nama library native. - Library, baik secara langsung maupun transitif melalui dependensinya, tidak boleh
bergantung pada library sistem selain library VNDK-SP dan LLNDK. Temukan daftar
library VNDK-SP dan LLNDK di
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
.
Mulai Android 15, library publik vendor dapat ditempatkan di
APEX vendor. Saat dipaketkan dalam APEX vendor, cantumkan library
dalam properti provideNativeLibs
di manifes APEX.
Mengupdate aplikasi agar tidak menggunakan library native non-publik
Fitur ini hanya diaktifkan untuk aplikasi yang menargetkan SDK versi 24 atau yang lebih baru. Untuk kompatibilitas mundur, lihat Tabel 1. Yang akan terjadi jika aplikasi Anda menautkan ke library native pribadi. Daftar library native Android yang dapat diakses oleh aplikasi (juga dikenal sebagai library native publik) tercantum di CDD bagian 3.1.1. Aplikasi yang menargetkan 24 atau yang lebih baru dan menggunakan library non-publik harus diupdate. Lihat Penautan Aplikasi NDK ke Library Platform untuk detail selengkapnya.
Mengupdate aplikasi untuk dependensi library native-nya
Aplikasi yang menargetkan SDK versi 31 (Android 12) atau yang lebih tinggi harus
menentukan secara eksplisit dependensi library bersama native-nya menggunakan
tag <uses-native-library>
dalam manifes aplikasi. Jika ada bagian dari library
yang diminta tidak ada di perangkat, aplikasi tidak akan diinstal. Saat diinstal, aplikasi
hanya akan diberi library bersama native yang telah diminta. Artinya,
aplikasi tidak dapat mengakses library bersama native yang tidak muncul di manifes aplikasi.