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ş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