Android 11'den başlayarak, sistem bölümünde çalışan yerel AIDL hizmetleri ihtiyaç duyulduğunda dinamik olarak başlatılıp durdurulabilir. Dinamik hizmetler, ilk talep edildiğinde başlar ve artık kullanılmadığında otomatik olarak durur.
Dinamik olarak çalışabilen hizmetler
Bu özellik yalnızca yaşam döngüleri init
ve servicemanager
tarafından kontrol edilebilen yerel hizmetler için kullanılabilir. Uygulama paketleri içindeki hizmetler desteklenmez ve bunun yerine bağlı hizmetleri kullanmalıdır.
Dinamik kapatma, hizmetin çalıştığı işlemi kapatarak çalışır. Aynı süreçte birden fazla hizmet mevcutsa bu özellikle uyumlu olması için hepsinin dinamik olarak kaydedilmesi gerekir. Daha sonra tüm hizmetler kullanılmadığında bu işlem kapatılacaktır.
Bir hizmetin init .rc dosyasını yapılandırma
Bir hizmeti dinamik olarak çalıştırmak için, hizmetin init .rc
dosyasına, service <name> <cmd>
satırından sonra aşağıdaki seçenekleri ekleyin.
interface aidl serviceName
disabled
oneshot
Bu seçenekler aşağıdakileri yapar:
-
interface aidl serviceName
:servicemanager
servisi bulmasına izin verir. Hizmet birden fazla arayüz kullanıyorsa, her arayüzü kendi satırında bildirin. Bu adlar tam olarakservicemanager
beklediği gibi olmalıdır ve süreç adından farklı olabilir. -
disabled
: Hizmetin önyükleme sırasında otomatik olarak başlatılmasını engeller. -
oneshot
: Hizmetin her durdurulduğunda otomatik olarak yeniden başlatılmasını engeller.
Daha fazla bilgi için AOSP'deki Android Init Language Benioku dosyasına bakın.
Örnekler:
Bir hizmetin kaydedilmesi
Her hizmet servicemanager
ile oluşturulur ve kaydedilir. Kayıt genellikle main.cpp
adlı bir dosyada gerçekleşir ancak uygulama farklılık gösterebilir. Kayıt genellikle şuna benzer:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Kayıt bazen yukarıdaki kodu çağıran BinderService::publish
veya BinderService::instantiate
tarafından soyutlanır.
Bir hizmeti dinamik olarak kaydetmek için kayıt kodunu aşağıdakiyle değiştirin:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
hizmetleri referans sayılarına göre kapatmak için LazyServiceRegistrar
ile iletişim kurar.
Örnekler:
AIDL hizmet istemcilerini yapılandırma
Hizmeti almak
Tembel bir hizmeti almak için hizmetin başlatılması ve ardından alınması gerekir. Hizmet yöneticisinde getService
çağırmak hizmeti başlatacaktır, ancak genellikle hizmeti mümkün olan en kısa sürede almak istersiniz ve waitForService
değişkenleri kullanılmalıdır. Bunların nasıl kullanılacağına ilişkin arka uca özel belgelere bakın.
Hizmetin serbest bırakılması
Dinamik kapatma, referans sayımına dayalı olduğundan, istemcilerin hizmet kullanılmadığında hizmete tutunmamaları gerekir.
Örnekler:
Kapatmayı geçici olarak devre dışı bırakma
Bir hizmetin belirli görevler tamamlanana kadar bağımsız olarak çalışmasını ve ardından dinamik davranışa geçmesini istiyorsanız dinamik kapatmayı açıp kapatmak için LazyServiceRegistrar::forcePersist
kullanabilirsiniz. Eğer bu sunucu tarafından çağrılırsa, registerService
önce çağrılmalıdır.
Örnek: apexservice