Dinamik olarak kullanılabilir HAL'ler

. Android 9, Android donanımının dinamik olarak kapatılmasını destekler. alt sistemler üzerinde çalışmaya devam etmesini sağlar. Örneğin, bir kullanıcı Kablosuz alt sistemlerinin bellek kullanmaması gerekir. güç veya diğer sistem kaynaklarında sorun. Android'in önceki sürümlerinde, HAL'ler/sürücüler Android cihazlarda uygulama süresi boyunca açık tutulmuştur. başlatıldı.

Dinamik kapatma işlemi uygulamak için veri akışlarının kablolanması ve dinamik süreçlere yakından bakın.

HAL tanımlarındaki değişiklikler

Dinamik kapatma, hangi işlemlerin HAL ile hizmet verdiğine dair bilgi gerektirir başka bağlamlarda da faydalı olabilir (bu bilgiler daha sonra başka bağlamlarda da yararlı olabilir) başlatma sırasında işlem başlatılmaması ve yeniden başlatılmaması (tüm tekrar istekte bulunurlar.

# 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 kapanma sırasında hwservicemanager, cihazın bunu bildirmesini de gerektirir. İstenen hizmetleri başlatmak için init. Android 9'da init, üç ek kontrol mesajı içerir (ör. ctl.start): ctl.interface_start, ctl.interface_stop ve ctl.interface_restart. Bu mesajlar, init adlı kullanıcının yukarı ve aşağı getirmesini bildirmek için kullanılabilir özel donanım arayüzleridir. Bir hizmetin istenmesine rağmen istenmediğinde kayıtlı, hwservicemanager hizmetin başladı. Bununla birlikte, dinamik HAL'ler için bunlardan herhangi birinin kullanılması gerekmez.

HAL çıkışını belirleme

Android 9'da HAL çıkışının manuel olarak yapılması gerekir belirler. Android 10 ve sonraki sürümlerde müzakere tekniklerini kullanarak otomatik yaşam döngüleri hakkında daha fazla bilgi edinin.

Dinamik kapatma işlemi, bir cihazın ne zaman başlatılacağına karar vermek için birden fazla HAL ve HAL'nin ne zaman kapatılacağı. Bir HAL herhangi bir nedenle çıkmaya karar verirse gereken durumlarda otomatik olarak yeniden başlatılacak. HAL tanımında ve init ve hwservicemanager. Bu beceri kapsamında iki strateji vardır:

  • Bir HAL, birisi kapanış veya görebilirsiniz. Bu davranış, ilgili HAL'de belirtilmelidir kullanır.
  • HAL'ler, görevleri tamamlandığında kapatılabilir (HAL dosyası) ekleyebilirsiniz.

Otomatik yaşam döngüleri

Android 10, çekirdeğe daha fazla destek sağlıyor ve hwservicemanager, HAL'lerin otomatik olarak kapatılmasına olanak tanır. . Bu özelliği kullanmak için aşağıdaki tüm adımları uygulayın: HAL tanımlarındaki değişiklikler de yön:

  • Hizmeti C++ hizmetine LazyServiceRegistrar ile kaydettirin işlevi (registerAsService) yerine örnek:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • HAL istemcisinin üst düzey HAL ( arayüzü hwservicemanager üzerinde kayıtlıysa) yalnızca kullanım durumu. Bu referans bir hwbinder iş parçacığına bırakılırsa gecikmeleri önlemek için bir istek geliyorsa istemcinin, Bıraktıktan sonra IPCThreadState::self()->flushCommands() bağlayıcı sürücüye, ilgili dosya ile ilgili referans sayısı değişiklikleridir.