AIDL hizmetlerini dinamik olarak çalıştırma

Android 11'den itibaren şurada çalışan yerel AIDL hizmetleri: sistem bölümü 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 paketlerindeki hizmetler desteklenmez ve bunun yerine bağlı hizmetler kullanılmalıdır.

Dinamik kapatma, hizmetin çalıştığı işlemin kapatılmasıyla çalışır. Aynı işlemde birden fazla hizmet varsa bunların tümünün kaydedilmesi gerekir dinamik olarak ayarlayabilirsiniz. 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 başlangıcına aşağıdaki seçenekleri ekleyin .rc dosyası, ilk service <name> <cmd> satırdan sonra.

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 başına bildirin satırında görünür. Bu adlar, servicemanager'ün tam olarak beklediği adlar 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 seferinde otomatik olarak yeniden başlatılmasını engeller durdurulur.

Daha fazla bilgi için bkz. Android Init Dili Benioku AOSP'de.

Ö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 aşağıdaki gibi 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ınlayın

Dinamik kapatma işlemi referans sayımına dayanır, bu nedenle istemcilerin kullanıma sokmaması.

Örnekler:

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

Bir hizmetin belirli görevler tamamlanana kadar bağımsız olarak çalışmasını istiyorsanız sonra dinamik davranışa geçiş yaparsanız, Dinamik kapatmayı açmak ve kapatmak için LazyServiceRegistrar::forcePersist tuşlarına basın. Eğer adı, sunucu tarafından çağrılır, öncekinden registerService.

Örnek: apexservice