AIDL Hizmetlerini Dinamik Olarak Çalıştırma

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 olarak servicemanager 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