Android 7.0 memperkenalkan namespace untuk library native guna membatasi visibilitas API internal dan mengatasi situasi saat aplikasi secara tidak sengaja menggunakan library platform, bukan library miliknya sendiri. Lihat postingan blog Android Developers Improving Stability dengan Pembatasan Simbol C/C++ Pribadi di Android 7.0 untuk mengetahui perubahan khusus aplikasi.
Arsitektur
Di Android 7.0 dan yang lebih tinggi, library sistem dipisahkan dari library aplikasi.
Gambar 1. Namespace untuk library native.
Namespace untuk library native mencegah aplikasi menggunakan API native platform pribadi (seperti yang dilakukan dengan OpenSSL). Namespace ini juga menghilangkan situasi saat aplikasi secara tidak sengaja menggunakan library platform, bukan library miliknya sendiri (seperti yang terjadi dengan libpng). Library aplikasi sulit menggunakan library sistem internal secara tidak sengaja (dan sebaliknya).
Menambahkan library native tambahan
Selain library native publik standar, vendor silicon (mulai Android 7.0) dan produsen perangkat (mulai 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 silicon/system/lib(untuk 32-bit) dan/system/lib64(untuk 64-bit) untuk library dari produsen perangkat
File .txt adalah:
/vendor/etc/public.libraries.txtuntuk library dari vendor silicon/system/etc/public.libraries-COMPANYNAME.txtuntuk library dari produsen perangkat, denganCOMPANYNAMEmengacu pada nama produsen (sepertiawesome.company).COMPANYNAMEharus cocok dengan[A-Za-z0-9_.-]+; karakter alfanumerik, _, . (titik), dan -. Perangkat dapat memiliki beberapa file .txt seperti itu 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 tercantum.
Library native yang merupakan bagian dari AOSP TIDAK BOLEH dipublikasikan (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 Android 8.0, library publik vendor memiliki batasan tambahan dan penyiapan yang diperlukan berikut:
- Library native di vendor harus diberi label yang tepat agar dapat diakses oleh aplikasi. Jika akses diperlukan oleh aplikasi apa pun (termasuk aplikasi pihak ketiga), library harus diberi label sebagai
same_process_hal_filedalam filefile_contextskhusus vendor sebagai berikut: dengan/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.soadalah 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 dikemas 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.Hal yang dapat Anda harapkan jika aplikasi Anda ditautkan ke library native pribadi. Daftar library native Android yang dapat diakses oleh aplikasi (juga dikenal sebagai library native publik) tercantum di bagian 3.1.1 CDD. Aplikasi yang menargetkan 24 atau yang lebih baru dan menggunakan library non-publik harus diupdate. Lihat Aplikasi NDK Penautan ke Library Platform untuk mengetahui detail selengkapnya.
Mengupdate aplikasi untuk dependensi library native
Aplikasi yang menargetkan SDK versi 31 (Android 12) atau yang lebih tinggi harus
menentukan secara eksplisit dependensi library bersama native 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 disediakan dengan library bersama native yang telah diminta. Artinya, aplikasi tidak dapat mengakses library bersama native yang tidak muncul dalam manifes aplikasi.