Namespaces untuk Perpustakaan Asli

Android 7.0 memperkenalkan ruang nama untuk pustaka asli untuk membatasi visibilitas API internal dan mengatasi situasi di mana aplikasi secara tidak sengaja menggunakan pustaka platform, bukan miliknya sendiri. Lihat Meningkatkan Stabilitas dengan Pembatasan Simbol C/C++ Pribadi di entri blog Pengembang Android Android 7.0 untuk perubahan khusus aplikasi.

Arsitektur

Di Android 7.0 dan yang lebih tinggi, pustaka sistem dipisahkan dari pustaka aplikasi.

Ruang nama untuk perpustakaan asli

Gambar 1. Ruang nama untuk pustaka asli

Ruang nama untuk pustaka asli mencegah aplikasi menggunakan API asli platform pribadi (seperti yang dilakukan dengan OpenSSL). Ini juga menghapus situasi di mana aplikasi secara tidak sengaja menggunakan pustaka platform alih-alih miliknya sendiri (seperti yang disaksikan dengan libpng ). Sulit bagi pustaka aplikasi untuk menggunakan pustaka sistem internal secara tidak sengaja (dan sebaliknya).

Menambahkan perpustakaan asli tambahan

Selain pustaka asli publik standar, vendor silikon (mulai dari Android 7.0) dan produsen perangkat (mulai dari Android 9) dapat memilih untuk menyediakan pustaka asli tambahan yang dapat diakses oleh aplikasi dengan meletakkannya di bawah folder pustaka masing-masing dan secara eksplisit mencantumkannya di .txt file.

Folder perpustakaan adalah:

  • /vendor/lib (untuk 32-bit) dan /vendor/lib64 (untuk 64-bit) untuk perpustakaan dari vendor silikon
  • /system/lib (untuk 32-bit) dan /system/lib64 (untuk 64-bit) untuk perpustakaan dari produsen perangkat

File .txt adalah:

  • /vendor/etc/public.libraries.txt untuk perpustakaan dari vendor silikon
  • /system/etc/public.libraries-COMPANYNAME.txt untuk library dari produsen perangkat, di mana COMPANYNAME merujuk ke nama produsen (seperti awesome.company ). COMPANYNAME harus cocok dengan [A-Za-z0-9_.-]+ ; karakter alfanumerik, _, . (titik) dan -. Dimungkinkan untuk memiliki beberapa file .txt di perangkat jika beberapa pustaka berasal dari penyedia solusi eksternal.

Pustaka asli di partisi system yang dibuat publik oleh produsen perangkat HARUS diberi nama lib*COMPANYNAME.so , misalnya, libFoo.awesome.company.so . Dengan kata lain, libFoo.so tanpa akhiran nama perusahaan TIDAK HARUS dipublikasikan. COMPANYNAME dalam nama file pustaka HARUS cocok dengan COMPANYNAME dalam nama file txt yang mencantumkan nama pustaka.

Pustaka asli yang merupakan bagian dari AOSP TIDAK HARUS dipublikasikan (kecuali pustaka asli publik standar yang bersifat publik secara default). Hanya pustaka tambahan yang ditambahkan oleh vendor silikon atau produsen perangkat yang dapat diakses oleh aplikasi.

Mulai dari Android 8.0, pustaka publik vendor memiliki batasan tambahan berikut dan penyiapan yang diperlukan:

  1. Pustaka asli di vendor harus diberi label dengan benar sehingga dapat diakses oleh aplikasi. Jika akses diperlukan oleh aplikasi apa pun (termasuk aplikasi pihak ketiga), perpustakaan harus diberi label sebagai same_process_hal_file dalam file file_contexts khusus vendor sebagai berikut:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    di mana libnative.so adalah nama perpustakaan asli.
  2. Pustaka, baik secara langsung atau transitif melalui dependensinya, tidak boleh bergantung pada pustaka sistem selain pustaka VNDK-SP dan LLNDK. Temukan daftar pustaka VNDK-SP dan LLNDK di development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Memperbarui aplikasi agar tidak menggunakan perpustakaan asli non-publik

Fitur ini diaktifkan hanya untuk aplikasi yang menargetkan SDK versi 24 atau yang lebih baru; untuk kompatibilitas mundur, lihat Tabel 1. Apa yang diharapkan jika aplikasi Anda ditautkan ke perpustakaan asli pribadi . Daftar pustaka asli Android yang dapat diakses oleh aplikasi (juga dikenal sebagai pustaka asli publik) tercantum di bagian CDD 3.1.1. Aplikasi yang menargetkan 24 atau lebih baru dan menggunakan perpustakaan non-publik apa pun harus diperbarui. Lihat Penautan Aplikasi NDK ke Platform Library untuk detail selengkapnya.

Memperbarui aplikasi untuk dependensi perpustakaan asli mereka

Aplikasi yang menargetkan SDK versi 31 (Android 12) atau lebih tinggi harus secara eksplisit menentukan dependensi pustaka bersama bawaannya dengan menggunakan <uses-native-library> di manifes aplikasi. Jika ada bagian dari perpustakaan yang diminta tidak ada di perangkat, aplikasi tidak diinstal. Saat aplikasi diinstal, mereka hanya diberikan pustaka bersama asli yang mereka minta. Ini berarti aplikasi tidak dapat mengakses pustaka bersama asli yang tidak muncul di manifes aplikasi.