Menjalankan layanan AIDL secara dinamis

Mulai Android 11, layanan AIDL native yang berjalan di partisi sistem dapat dimulai dan dihentikan secara dinamis saat diperlukan. Layanan dinamis dimulai saat pertama kali diminta dan otomatis berhenti saat tidak lagi digunakan.

Layanan yang dapat berjalan secara dinamis

Fitur ini hanya tersedia untuk layanan native yang siklus prosesnya dapat dikontrol oleh init dan servicemanager. Layanan dalam paket aplikasi tidak didukung dan harus menggunakan layanan terikat sebagai gantinya.

Penonaktifan dinamis berfungsi dengan menonaktifkan proses saat layanan berjalan. Jika beberapa layanan ada dalam proses yang sama, semuanya harus terdaftar sebagai dinamis agar kompatibel dengan fitur ini. Proses itu kemudian akan dihentikan ketika semua layanan tidak digunakan.

Mengonfigurasi file .rc init layanan

Untuk menjalankan layanan secara dinamis, tambahkan opsi berikut ke file init .rc layanan setelah baris service <name> <cmd> di awal.

interface aidl serviceName
disabled
oneshot

Opsi ini akan melakukan hal berikut:

  • interface aidl serviceName: Mengizinkan servicemanager menemukan layanan. Jika layanan menggunakan beberapa antarmuka, deklarasikan setiap antarmuka pada barisnya sendiri. Nama ini harus persis seperti yang diharapkan servicemanager dan mungkin berbeda dari nama proses.
  • disabled: Mencegah layanan dimulai secara otomatis saat booting.
  • oneshot: Mencegah layanan dimulai ulang secara otomatis setiap kali dihentikan.

Untuk mengetahui informasi selengkapnya, lihat Readme Bahasa Init Android di AOSP.

Contoh:

Daftarkan layanan

Setiap layanan dibuat dan didaftarkan dengan servicemanager. Pendaftaran sering terjadi dalam file bernama main.cpp, tetapi implementasinya dapat bervariasi. Pendaftaran biasanya terlihat seperti ini:

using android::defaultServiceManager;

defaultServiceManager()->addService(serviceName, service);

Pendaftaran terkadang diabstraksi oleh BinderService::publish atau BinderService::instantiate, yang memanggil kode di atas.

Untuk mendaftarkan layanan sebagai dinamis, ganti kode pendaftarannya dengan kode berikut:

#include <binder/LazyServiceRegistrar.h>

using android::binder::LazyServiceRegistrar;

auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);

servicemanager berkomunikasi dengan LazyServiceRegistrar untuk menonaktifkan layanan berdasarkan jumlah referensinya.

Contoh:

Mengonfigurasi klien layanan AIDL

Mendapatkan layanan

Untuk mengambil layanan lambat, layanan harus dimulai lalu diambil. Memanggil getService pada pengelola layanan akan memulai layanan, tetapi biasanya, Anda ingin mendapatkan layanan segera setelah tersedia, dan varian waitForService harus digunakan. Lihat dokumentasi khusus backend tentang cara menggunakannya.

Merilis layanan

Penonaktifan dinamis didasarkan pada penghitungan referensi, sehingga klien tidak boleh memegang layanan jika tidak digunakan.

Contoh:

Nonaktifkan penonaktifan sementara

Jika Anda ingin layanan berjalan secara independen hingga tugas tertentu selesai, lalu beralih ke perilaku dinamis, Anda dapat menggunakan LazyServiceRegistrar::forcePersist untuk mengaktifkan dan menonaktifkan penonaktifan dinamis. Jika dipanggil dari sisi server, layanan harus dipanggil sebelum registerService.

Contoh: apexservice