Namespace untuk library native

Android 7.0 memperkenalkan namespace untuk library native guna membatasi API internal dan mengatasi situasi saat aplikasi tidak sengaja menggunakan platform {i>library<i} alih-alih milik mereka sendiri. Lihat dokumentasi Peningkatan Stabilitas dengan Pembatasan Simbol C/C++ Pribadi di Android 7.0 Android Postingan blog developer 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 native platform pribadi API (seperti yang dilakukan dengan OpenSSL). Hal ini juga menghapus situasi saat aplikasi tidak sengaja menggunakan library platform alih-alih milik mereka sendiri (seperti yang dengan libpng). Sulit bagi library aplikasi untuk menggunakan library sistem secara tidak sengaja (dan sebaliknya).

Menambahkan library native tambahan

Selain standar perpustakaan asli publik, vendor silicon (mulai dari Android 7.0) dan produsen perangkat (mulai dari Android 9) dapat memilih untuk menyediakan library native tambahan 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 perpustakaan dari vendor silicon
  • /system/lib (untuk 32-bit) dan /system/lib64 (untuk 64-bit) untuk library dari produsen perangkat

File .txt tersebut 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 -. Anda dapat memiliki beberapa file .txt seperti itu di perangkat jika beberapa library berasal dari solusi eksternal penyedia layanan.

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 sesuai dengan COMPANYNAME di {i>file<i} .txt yang mencantumkan nama {i>library<i}.

Library native yang merupakan bagian dari AOSP TIDAK BOLEH dipublikasikan (kecuali library library native publik yang bersifat publik secara default). Hanya pustaka tambahan yang ditambahkan oleh vendor silikon atau produsen perangkat dapat diakses oleh aplikasi.

Mulai dari Android 8.0, pustaka publik vendor memiliki pembatasan dan penyiapan yang diperlukan:

  1. Pustaka asli di vendor harus diberi label dengan benar sehingga dapat dapat diakses oleh aplikasi. Jika akses diperlukan oleh aplikasi (termasuk aplikasi pihak ketiga aplikasi pihak ketiga), library harus diberi label 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. Cari daftar Library VNDK-SP dan LLNDK di development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv.

Mulai dari Android 15, library publik vendor dapat ditempatkan ke dalam APEX vendor. Jika dikemas dalam APEX vendor, cantumkan library di properti provideNativeLibs di manifes APEX.

Mengupdate aplikasi agar tidak menggunakan library native nonpublik

Fitur ini hanya diaktifkan untuk aplikasi yang menargetkan SDK versi 24 atau yang lebih baru; untuk kompatibilitas mundur, lihat Tabel Akun Layanan 1.Hal yang akan terjadi jika aplikasi Anda ditautkan ke library native pribadi. Daftar library native Android yang dapat diakses oleh aplikasi (juga dikenal sebagai perpustakaan asli publik) terdaftar dalam CDD bagian 3.1.1. Aplikasi yang menargetkan 24 atau nanti dan menggunakan perpustakaan non-publik harus diperbarui. Lihat NDK Penautan Aplikasi 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 <uses-native-library> di manifes aplikasi. Jika ada bagian dari library tidak ada di perangkat, aplikasi belum diinstal. Saat diinstal, aplikasi akan disediakan hanya dengan library native bersama yang mereka minta. Hal ini berarti bahwa aplikasi tidak dapat mengakses library bersama native yang tidak muncul di manifes aplikasi.