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 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şlemin kapatılmasıyla çalışır. Aynı işlemde birden fazla hizmet varsa bu özellikle uyumlu olması 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 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 şunları sağlar:

  • interface aidl serviceName: servicemanager ürününün hizmeti bulmasını sağlar. Hizmet birden fazla arayüz kullanıyorsa her arayüzü kendi satırında bildirin. Bu adlar, servicemanager tarafından beklenen şekilde olmalıdır ve işlem adından farklı olabilir.
  • disabled: Hizmetin başlatma 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 Readme (Android Init Dili Okundu) bölümünü inceleyin.

Örnekler:

Hizmet kaydetme

Her hizmet servicemanager ile oluşturulup kaydedilir. Kayıt genellikle main.cpp adlı bir dosyada gerçekleşir ancak uygulama değişiklik 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ğıdaki kodla 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 alın

Tembel bir hizmeti almak için hizmetin başlatılması ve sonra alınması gerekir. Hizmet yöneticisinde getService çağrısı yapıldığında hizmet başlatılır. Ancak genellikle hizmeti kullanıma sunulduğu anda almak istersiniz ve waitForService varyantlarını kullanmanız gerekir. Bunların nasıl kullanılacağıyla ilgili arka uca özel belgeleri inceleyin.

Hizmeti yayınlayın

Dinamik kapatma işlemi referans sayımına dayanır. Bu nedenle, müşteriler kullanılmadığı zamanlarda hizmeti kullanmaya devam etmemelidir.

Örnekler:

Kapatmayı geçici olarak devre dışı bırakma

Bir hizmetin, belirli görevler tamamlanana kadar bağımsız olarak çalışmasını, ardından dinamik davranışa geçiş yapmasını istiyorsanız dinamik kapatmayı açmak ve kapatmak için LazyServiceRegistrar::forcePersist öğesini kullanabilirsiniz. Bu işlev sunucu tarafından çağrılıyorsa registerService tarihinden önce çağrılmalıdır.

Örnek: apexservice