Namespace untuk library native

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.

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). 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.txt untuk library dari vendor silicon
  • /system/etc/public.libraries-COMPANYNAME.txt untuk library dari produsen perangkat, dengan COMPANYNAME mengacu pada nama produsen (seperti awesome.company). COMPANYNAME harus 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:

  1. 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_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 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.