Mulai Android 11, layanan AIDL native yang berjalan di partisi sistem dapat dimulai dan dihentikan secara dinamis sesuai kebutuhan. Layanan dinamis dimulai saat pertama kali diminta dan secara otomatis berhenti ketika yang 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 tempat layanan berjalan. Jika ada beberapa layanan dalam proses yang sama, semuanya harus didaftarkan dinamis agar kompatibel dengan fitur ini. Proses tersebut kemudian akan dimatikan ketika semua layanan tidak digunakan.
Mengonfigurasi file .rc init layanan
Untuk menjalankan layanan secara dinamis, tambahkan opsi berikut ke file .rc
init layanan setelah baris service <name> <cmd>
utama.
interface aidl serviceName
disabled
oneshot
Opsi ini akan melakukan hal berikut:
interface aidl serviceName
: Memungkinkanservicemanager
menemukan layanan. Jika layanan menggunakan beberapa antarmuka, deklarasikan setiap antarmuka di barisnya masing-masing. Nama ini harus persis seperti yang diharapkanservicemanager
dan mungkin berbeda dari nama proses.disabled
: Mencegah layanan dimulai secara otomatis saat booting.oneshot
: Mencegah layanan dimulai ulang secara otomatis setiap kali layanan dimulai akan dihentikan.
Untuk informasi selengkapnya, lihat Readme Bahasa Init Android di AOSP.
Contoh:
Mendaftarkan layanan
Setiap layanan dibuat dan didaftarkan dengan servicemanager
. Sering mendaftar
muncul 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
di pengelola layanan akan memulai layanan, tetapi biasanya,
Anda ingin mendapatkan layanan segera setelah tersedia, dan varian
waitForService
harus digunakan. Lihat khusus backend
dokumentasi
bagaimana cara menggunakannya.
Merilis layanan
Penonaktifan dinamis didasarkan pada penghitungan referensi, jadi klien tidak boleh menunggu lama layanan saat tidak digunakan.
Contoh:
Menonaktifkan penonaktifan sementara
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 penonaktifan dinamis. Jika
dipanggil dari sisi server, tapi harus dipanggil sebelum
registerService
.
Contoh: apexservice