AIDL hizmetlerini dinamik olarak çalıştırma

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ş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 varsa bunların tümü bu özellikle uyumlu olması için dinamik olarak kaydedilmelidir. Tüm hizmetler kullanılmadığında bu işlem de kapatılır.

Bir hizmetin init .rc dosyasını yapılandırma

Bir hizmeti dinamik olarak çalıştırmak için hizmetin ilk service <name> <cmd> satırından sonra başlangıç .rc dosyasına aşağıdaki seçenekleri ekleyin.

interface aidl serviceName
disabled
oneshot

Bu seçenekler aşağıdaki işlemleri gerçekleştirir:

  • interface aidl serviceName: servicemanager'ın hizmeti bulmasına olanak tanır. Hizmet birden fazla arayüz kullanıyorsa her arayüzü kendi satırında tanımlayın. Bu adlar, servicemanager'ün tam olarak beklediği adlar olmalıdır ve işlem adından farklı olabilir.
  • disabled: Hizmetin, önyüklemede 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 Readme'ye bakın.

Örnekler:

Hizmet kaydı

Her hizmet servicemanager ile oluşturulur ve kaydedilir. Kayıt 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);

Kayıt işlemi bazen yukarıdaki kodu çağıran BinderService::publish veya BinderService::instantiate tarafından soyutlanır.

Bir hizmeti dinamik olarak kaydettirmek 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, referans sayılarına göre hizmetleri kapatmak için LazyServiceRegistrar ile iletişim kurar.

Örnekler:

AIDL hizmet istemcilerini yapılandırma

Hizmeti alma

Tembel bir hizmetin alınması için hizmetin başlatılması ve ardından alınması gerekir. Hizmet yöneticisinde getService çağrısı yapıldığında hizmet başlatılır ancak genellikle hizmeti kullanılabilir hale gelir gelmez almak istersiniz ve waitForService varyantları kullanılmalıdır. Bunların nasıl kullanılacağıyla ilgili arka uçla ilgili belgelere göz atın.

Hizmeti yayınlama

Dinamik kapatma, referans saymaya dayanır. Bu nedenle, istemciler kullanılmadığında hizmeti tutmamalıdır.

Ö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 kapatma özelliğini etkinleştirmek ve devre dışı bırakmak için LazyServiceRegistrar::forcePersist işlevini kullanabilirsiniz. Bu işlev sunucu tarafında çağrılırsa registerService işlevinden önce çağrılmalıdır.

Örnek: apexservice