Android 11'den itibaren, sistem bölümünde çalışan yerel AIDL hizmetleri gerektiğinde dinamik olarak başlatılıp durdurulabilir. Dinamik hizmetler ilk kez istendiğinde başlatılır ve kullanılmadığında otomatik olarak durdurulur.
Dinamik olarak çalıştırılabilen hizmetler
Bu özellik yalnızca yaşam döngüleri init
ve servicemanager
tarafından kontrol edilebilen yerel hizmetlerde kullanılabilir. Uygulama paketlerindeki hizmetler desteklenmez ve bunun yerine bağlı hizmetler kullanılmalıdır.
Dinamik kapatma, hizmetin çalıştığı süreci kapatarak çalışır. Aynı işlemde birden fazla hizmet varsa bu özellik ile uyumlu olmaları için hepsinin dinamik olarak kaydedilmesi gerekir. Bu işlem, tüm hizmetler kullanılmadığında kapatılır.
Bir hizmetin init .rc dosyasını yapılandırma
Bir hizmeti dinamik olarak çalıştırmak için hizmetin init
.rc
dosyasına, baştaki service <name> <cmd>
satırından sonra aşağıdaki seçenekleri ekleyin.
interface aidl serviceName
disabled
oneshot
Bu seçenekler şunları yapar:
interface aidl serviceName
:servicemanager
hizmeti bulabilir. Hizmet birden fazla arayüz kullanıyorsa her arayüzü kendi satırında belirtin. Bu adlar,servicemanager
'nın beklediği adlar olmalı ve işlem adından farklı olabilir.disabled
: Hizmetin açılışta otomatik olarak başlatılmasını önler.oneshot
: Hizmetin her durdurulduğunda otomatik olarak yeniden başlatılmasını engeller.
Daha fazla bilgi için AOSP'deki Android Init Language Readme başlıklı makaleyi inceleyin.
Örnekler:
Hizmet kaydetme
Her hizmet servicemanager
ile oluşturulur ve kaydedilir. Kayıt işlemi genellikle main.cpp
adlı bir dosyada gerçekleşir ancak uygulama değişiklik gösterebilir. Kayıt genellikle şu şekilde görünür:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Kaydolma işlemi bazen yukarıdaki kodu çağıran BinderService::publish
veya BinderService::instantiate
tarafından soyutlaştırılır.
Bir hizmeti dinamik olarak kaydetmek için kayıt kodunu aşağıdakilerle değiştirin:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
, referans sayılarına göre hizmetleri kapatmak için LazyServiceRegistrar
ile iletişim kurar.
Örnekler:
AIDL hizmet istemcilerini yapılandırma
Hizmeti edinme
Geç yüklenen bir hizmeti almak için hizmetin başlatılması ve ardından alınması gerekir.
Hizmet yöneticisinde getService
işlevini çağırmak hizmeti başlatır ancak genellikle hizmeti kullanıma sunulur sunulmaz almak istersiniz ve waitForService
varyantları kullanılmalıdır. Bunları nasıl kullanacağınızla ilgili arka uca özel dokümanları inceleyin.
Hizmeti yayınlama
Dinamik kapatma, referans sayımına dayalıdır. Bu nedenle, istemciler kullanılmadığı zamanlarda hizmeti tutmamalıdır.
Örnekler:
Kapatmayı geçici olarak devre dışı bırakma
Belirli görevler tamamlanana kadar bir hizmetin bağımsız olarak çalışmasını ve ardından dinamik davranışa geçmesini istiyorsanız LazyServiceRegistrar::forcePersist
kullanarak dinamik kapatmayı etkinleştirebilir ve devre dışı bırakabilirsiniz. Bu işlev sunucu tarafında çağrılıyorsa registerService
işlevinden önce çağrılmalıdır.
Örnek: apexservice