Namespace untuk library native

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

Gambar 1. Namespace untuk library native.

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, dengan COMPANYNAME merujuk pada nama produsen (misalnya awesome.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:

  1. 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 file file_contexts khusus vendor sebagai berikut:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    dengan libnative.so adalah nama library native.
  2. 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.