Dinamik kapatmanın uygulanması, aşağıdaki bölümlerde ayrıntılı olarak açıklandığı gibi veri akışlarının kablolanmasını ve dinamik süreçlerin yürütülmesini içerir.
HAL tanımlarındaki değişiklikler
Dinamik kapatma, hangi işlemlerin hangi HAL arayüzlerine hizmet ettiğine dair bilgi gerektirir (bu bilgi daha sonra başka bağlamlarda da yararlı olabilir), ayrıca süreçlerin önyükleme sırasında başlatılmaması ve çıktıklarında yeniden başlatılmaması (tekrar isteninceye kadar).
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
init ve hwservicemanager'daki değişiklikler
Dinamik kapatma ayrıca hwservicemanager
init
istenen hizmetleri başlatmasını söylemesini gerektirir. Android 9'da init
üç ek kontrol mesajı içerir (örneğin ctl.start
): ctl.interface_start
, ctl.interface_stop
ve ctl.interface_restart
. Bu mesajlar, belirli donanım arayüzlerini yukarı ve aşağı getirmek üzere init
sinyali vermek için kullanılabilir. Bir hizmet istendiğinde ve kayıtlı olmadığında hwservicemanager
hizmetin başlatılmasını ister. Ancak dinamik HAL'ler bunlardan herhangi birinin kullanılmasını gerektirmez.
HAL çıkışını belirle
Android 9'da HAL çıkışının manuel olarak belirlenmesi gerekiyor. Android 10 ve üzeri için otomatik yaşam döngüleri ile de belirlenebilir.
Dinamik kapatma, bir HAL'in ne zaman başlatılacağına ve ne zaman kapatılacağına karar vermek için birden fazla politika gerektirir. Bir HAL herhangi bir nedenle çıkış yapmaya karar verirse, HAL tanımında sağlanan bilgiler ve init
ve hwservicemanager
yapılan değişikliklerin sağladığı altyapı kullanılarak tekrar ihtiyaç duyulduğunda otomatik olarak yeniden başlatılacaktır. Bu, aşağıdakiler de dahil olmak üzere birkaç farklı stratejiyi içerebilir:
- Bir HAL, birisinin üzerinde yakın veya benzer bir API çağırması durumunda çıkışı kendi başına çağırmayı seçebilir. Bu davranış ilgili HAL arayüzünde belirtilmelidir.
- HAL'ler görevleri tamamlandığında kapanabilirler (HAL dosyasında belgelenmiştir).
Otomatik yaşam döngüleri
Android 10, çekirdeğe ve hwservicemanager
daha fazla destek ekleyerek HAL'lerin istemcileri olmadığında otomatik olarak kapanmasına olanak tanır. Bu özelliği kullanmak için HAL tanımlarındaki değişiklikler bölümündeki tüm adımların yanı sıra şunları da yapın:
- Hizmeti C++'ta üye işlevi yerine
LazyServiceRegistrar
ile kaydedinregisterAsService
, örneğin:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- HAL istemcisinin, yalnızca kullanımdayken üst düzey HAL'e (
hwservicemanager
ile kayıtlı arayüz) referans tuttuğunu doğrulayın. Bu referansın, yürütülmeye devam eden bir hwbinder iş parçacığına bırakılması durumunda gecikmeleri önlemek için, istemci ayrıca, binder sürücüsünün ilgili referans sayısı konusunda bilgilendirildiğinden emin olmak için referansı bıraktıktan sonraIPCThreadState::self()->flushCommands()
çağırmalıdır. değişiklikler.