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