Dinamik olarak kullanılabilir HAL'ler

Android 9, kullanılmadığında veya ihtiyaç duyulmadığında Android donanım alt sistemlerinin dinamik olarak kapatılmasını destekler. Örneğin, bir kullanıcı Wi-Fi kullanmadığında Wi-Fi alt sistemleri belleği, gücü veya diğer sistem kaynaklarını kullanmamalıdır. Android'in önceki sürümlerinde, Android telefonun başlatıldığı süre boyunca HAL'ler/sürücüler Android cihazlarda açık tutuluyordu.

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 kaydedin registerAsService , ö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 sonra IPCThreadState::self()->flushCommands() çağırmalıdır. değişiklikler.