Mulai Android 11, layanan AIDL asli yang berjalan di partisi sistem dapat dimulai dan dihentikan secara dinamis sesuai kebutuhan. 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 asli yang siklus hidupnya dapat dikontrol oleh init
dan servicemanager
. Layanan dalam paket aplikasi tidak didukung dan sebaiknya menggunakan layanan terikat .
Shutdown dinamis bekerja dengan mematikan proses di mana layanan berjalan. Jika ada beberapa layanan dalam proses yang sama, semuanya harus didaftarkan sebagai dinamis agar kompatibel dengan fitur ini. Proses itu kemudian akan dimatikan ketika semua layanan tidak digunakan.
Mengonfigurasi file init .rc layanan
Untuk menjalankan layanan secara dinamis, tambahkan opsi berikut ke file init .rc
layanan setelah baris service <name> <cmd>
utama.
interface aidl serviceName
disabled
oneshot
Opsi ini melakukan hal berikut:
-
interface aidl serviceName
: Memungkinkanservicemanager
menemukan layanan. Jika layanan menggunakan beberapa antarmuka, deklarasikan setiap antarmuka pada barisnya sendiri. Nama-nama ini harus persis seperti yang diharapkan olehservicemanager
dan mungkin berbeda dari nama proses. -
disabled
: Mencegah layanan dimulai secara otomatis saat boot. -
oneshot
: Mencegah layanan dimulai ulang secara otomatis setiap kali dihentikan.
Untuk informasi lebih lanjut, lihat Readme Bahasa Init Android di AOSP.
Contoh:
Mendaftarkan layanan
Setiap layanan dibuat dan didaftarkan dengan servicemanager
. Registrasi sering kali terjadi pada file bernama main.cpp
, namun implementasinya bisa berbeda-beda. Pendaftarannya 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 registrasinya dengan yang berikut ini:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
berkomunikasi dengan LazyServiceRegistrar
untuk mematikan layanan berdasarkan jumlah referensinya.
Contoh:
Mengonfigurasi klien layanan AIDL
Mendapatkan layanan
Untuk mengambil layanan yang lambat, layanan harus dimulai dan kemudian diambil. Memanggil getService
pada manajer layanan akan memulai layanan, namun biasanya, Anda ingin mendapatkan layanan segera setelah tersedia, dan varian waitForService
harus digunakan. Lihat dokumentasi khusus backend tentang cara menggunakannya.
Merilis layanan
Shutdown dinamis didasarkan pada penghitungan referensi, sehingga klien tidak boleh mempertahankan layanan saat tidak digunakan.
Contoh:
Menonaktifkan sementara shutdown
Jika Anda ingin layanan berjalan secara independen hingga tugas tertentu selesai dan kemudian beralih ke perilaku dinamis, Anda dapat menggunakan LazyServiceRegistrar::forcePersist
untuk mengaktifkan dan menonaktifkan pematian dinamis. Jika ini dipanggil dari sisi server, ini harus dipanggil sebelum registerService
.
Contoh: layanan puncak