Sensörler Çoklu HAL

Sensors Multi-HAL, sensör HAL'lerinin diğer sensör HAL'leri ile birlikte çalışmasına izin veren bir çerçevedir. Sensors Multi-HAL, satıcı bölümünde dinamik kitaplıklar olarak depolanan sensör alt HAL'lerini dinamik olarak yükler ve onlara, olayları gönderme ve uyandırma kilidini alıp serbest bırakma işlemlerini gerçekleştirebilen bir geri çağırma nesnesi verir. Algılayıcı alt HAL'ı, satıcı bölümünde paylaşılan bir nesnede yerleşik olarak bulunan ve çoklu HAL çerçevesi tarafından kullanılan bir algılayıcı HAL'dir. Bu alt HAL'ler birbirine veya işlemin ana işlevini içeren çoklu HAL koduna bağlı değildir.

Sensörler Çok HAL 2.1, Android 11 ya da daha yüksek çalışan cihazlarda kullanılabilir, Sensörler Çok HAL 2.0 bir yineleme olduğunu açığa çıkarabilir destekler yükleme alt HAL'lere menteşe dirseği sensör tipi. Bu sensör türünü desteklemek için, alt HAL'lere tanımlanan alt HAL API'leri kullanmalıdır 2.1 Subhal başlığındaki .

Sensörler Multi-HAL 2 ve Sensörler HAL 2 arasındaki fark

Sensörler Çok HAL 2, üst üste Android 10 çalıştıran cihazlara veya daha yüksek tanıtır çeşitli soyutlamalar geçerli Sensörler HAL 2 daha kolay HAL API'leri ile etkileşim yapmak. Sensörler Çok HAL 2 tanıtır HalProxy sınıfı Sensörler HAL 2 arayüzü ve uygulama işlemek için V2_1/SubHal (veya V2_0/SubHal sağlamak için) arabirimini HalProxy alt HAL'lere ile etkileşim.

ISensorsSubHal arayüzü farklıdır 2.1/ISensors.hal (ya da 2.0/ISensors.hal ) aşağıdaki yollarla bir arayüz:

  • İnitialize yöntem geçer IHalProxyCallback sınıf iki yerine FMQs ve ISensorsCallback .
  • Alt HAL'ler, hata raporlarında hata ayıklama bilgisi sağlamak için bir hata ayıklama işlevi uygulamalıdır.
  • Alt HAL'ler, yüklenen alt HAL'in diğer alt HAL'lerden ayırt edilebilmesi için bir ad işlevi uygulamalıdır.

Sensörler Multi-HAL 2 ve Sensörler HAL 2 arasındaki temel fark, başlatma işlevlerindedir. Bunun yerine FMQs sağlama, IHalProxyCallback arayüzü iki yöntem, sensörler çerçeveye sonrası sensör olaylara bir yöntem ve uyandırma kilitleri oluşturmak için bir yöntem sağlar. Başlık altında, Sensörler Çoklu HAL, tüm alt HAL'ler için sensör olaylarının zamanında iletilmesini sağlamak için FMQ'lar ile tüm etkileşimleri yönetir. Kuvvetle alt HAL'lere kullanmanız önerilir createScopedWakelock tüm Sensörler en aza indirir kilitleme Çok HAL ve kilidin açılması için ortak bir uyanıklık kilidine Sensörler Çoklu HAL uyanıklık kilitleri dışarı ve centralize uyandırma kilit kullanımına zamanlama yükünü devretmek yöntemi aramalar.

Sensörler Multi-HAL 2 ayrıca bazı yerleşik güvenlik özelliklerine sahiptir. Sensör FMQ'sunun dolu olduğu veya Android sensör çerçevesinin yeniden başladığı ve sensör durumunun sıfırlanması gerektiği durumları ele alır. Olaylar tayin edildikleri zaman Ayrıca, HalProxy sınıfına ama sensör çerçevesi hemen olayları kabul edemiyor, Sensörler Çok HAL olaylar için beklerken çalışma tüm alt HAL'lere genelinde devam etmesi için bir arka plan iş parçacığı olayları taşıyabilirsiniz gönderilecek.

Kaynak kodu ve referans uygulaması

Tüm Sensörler Çok HAL kodu mevcuttur hardware/interfaces/sensors/common/default/2.X/multihal/ . İşte bazı kaynaklara yönelik işaretçiler.

  • HalProxy.h : HalProxy nesne Sensörler çoklu HAL ve kolları ile sensör çerçeve alt HAL'lere gelen veri alış verişine örneği.
  • HalProxy.cpp : uygulanması HalProxy alt HAL'lere ve sensör çerçevesi arasındaki multiplex iletişim için gerekli tüm mantığı içerir.
  • SubHal.h : ISensorsSubHal arayüzü alt HAL'lere ile uyumlu olması için izlemesi gereken arayüz tanımlar HalProxy . Alt HAL uygular böylece initialize metodu HalProxyCallback nesnesi için kullanılabilecek postEvents ve createScopedWakelock .

    Çok HAL 2.0 uygulamaları, kullanımı sürüm 2.0 için SubHal.h .

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/ : Bu birim testleri doğrulamak HalProxy uygulanmasını.

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ : Bu örnek alt HAL uygulama kullandığı sahte sensörleri sahte verilerini oluşturmak için. Bir aygıtta birden çok alt HAL'nin nasıl etkileşime girdiğini test etmek için kullanışlıdır.

uygulama

Bu bölüm, aşağıdaki durumlarda Sensors Multi-HAL'in nasıl uygulanacağını açıklar:

Sensörleri Uygulamak Çoklu HAL 2.1

Sensors Multi-HAL 2.1'i yeni bir cihaza uygulamak için şu adımları izleyin:

  1. Uygulama ISensorsSubHal de tarif edildiği gibi bir arayüz SubHal.h .
  2. Uygulama sensorsHalGetSubHal_2_1 yöntemi SubHal.h .
  3. Bir ekleme cc_library_shared yeni uygulanan alt HAL inşa etmek hedefi. Hedef eklerken:

    1. Hedefin, cihazın satıcı bölümünde bir yere itildiğinden emin olun.
    2. Bulunan yapılandırma dosyasında /vendor/etc/sensors/hals.conf , yeni bir satıra kütüphaneye yolunu ekleyin. Gerekirse oluşturmak hals.conf dosyasını.

    Bir örnek için Android.bp bir alt HAL kütüphanesini oluşturmak için girişi, bkz hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp .

  4. Tümünü kaldır android.hardware.sensors girişleri manifest.xml cihazlarda desteklenen HAL'lere listesini içeren dosyanın,.

  5. Tümünü kaldır android.hardware.sensors servis ve service.rc dosyaları device.mk dosyası ve eklemek android.hardware.sensors@2.1-service.multihal ve android.hardware.sensors@2.1-service.multihal.rc için PRODUCT_PACKAGES .

Açılışta, HalProxy yeni uygulanan alt HAL, görünüyor başlar ve arayarak başlatır sensorsHalGetSubHal_2_1 .

Sensörler Multi-HAL 2.0'dan Multi-HAL 2.1'e Taşıma

Çok HAL 2.0 Çoklu HAL 2.1 bağlantı noktası için, uygulamaya SubHal arayüzünü ve alt-HAL yeniden derlemek.

Bunlar 2.0 ve 2.1 arasındaki farklar SubHal arayüzler:

  • IHalProxyCallback sürümü 2.1 oluşturulan türleri kullanır ISensors.hal teknik özellikler.
  • initialize() işlev yeni geçer IHalProxyCallback 2.0 birinin yerine SubHal arayüzü
  • Alt HAL'lere uygulamalıdır getSensorsList_2_1 ve injectSensorData_2_1 yerine getSensorsList ve injectSensorData bu yöntemler arasında 2.1 sürümünde eklenen yeni türleri kullanmak olarak ISensors.hal şartname.
  • Alt HAL'lere ortaya koymalıdır sensorsHalGetSubHal_2_1 ziyade sensorsHalGetSubHal sürüm 2.1 alt HAL'lere olarak ele alacak şekilde Çoklu HAL.

Sensörler HAL 2.0'dan taşıma

Ne zaman gelen Sensörler Çok HAL 2.0 yükseltme Sensörler HAL 2.0 , HAL uygulaması aşağıdaki gereksinimleri karşılaması için.

HAL'ı Başlatma

Sensörler HAL 2.0, sensör hizmetinin FMQ'ları ve dinamik bir sensör geri aramasını geçmesine izin veren bir başlatma işlevine sahiptir. Sensörler Çok HAL 2.0, initialize() işlev uyanma kilitleri elde etmek ve dinamik sensör bağlantısı ve kopma haberdar sonrası sensör etkinlikleri için kullanılmalıdır, tek bir geri arama geçer.

Sensör olaylarını Çoklu HAL uygulamasına gönderme

Bunun yerine FMQ aracılığıyla sensör olayları gönderme, alt HAL için sensör olayları yazmalıdır IHalProxyCallback sensör olayları kullanılabilir olduğunda.

WAKE_UP etkinlikleri

Sensörler HAL 2.0'da HAL, uygulanması için uyandırma kilidini yönetebilir. Sensörler Çok HAL 2.0'da, alt HAL'lere Çok HAL uygulama uyanıklık kilitleri yönetmesine izin ve çağırarak elde edilecek bir uyandırma kilit isteyebilir createScopedWakelock . Bir kapsamı uyandırma kilidi edinilmiş ve aktarılması gerekir kilitli postEvents Çoklu HAL uygulanmasına olaylar kadar uyandırma yayınlarken.

Dinamik sensörler

Sensörler Çok HAL 2.0 gerektirir onDynamicSensorsConnected ve onDynamicSensorsDisconnected içinde IHalProxyCallback zaman dinamik sensör bağlantıları değişim denir. Bu geri çağırma bir parçası olarak mevcuttur IHalProxyCallback aracılığıyla sağlanır işaretçi initialize() işlev.

Sensörler HAL 1.0'dan taşıma

Ne zaman gelen Sensörler Çok HAL 2.0 yükseltme Sensörler HAL 1.0 , HAL uygulaması aşağıdaki gereksinimleri karşılaması için.

HAL'ı Başlatma

initialize() fonksiyonu alt HAL ve Multi-HAL uygulanması arasındaki geri arama kurmak için desteklenmelidir.

Mevcut sensörleri açığa çıkarma

Sensörler Çok HAL 2.0, getSensorsList() işlev sensörleri yeniden başlatılır Hal, daha karşısında, tek bir cihaz açılışı sırasında aynı değeri gerekir. Bu, sistem sunucusu yeniden başlatılırsa çerçevenin sensör bağlantılarını yeniden kurmaya çalışmasına izin verir. Tarafından döndürülen değeri getSensorsList() cihaz gerçekleştirir bir yeniden başlatma sonra değişebilir.

Sensör olaylarını Çoklu HAL uygulamasına gönderme

Sensörler HAL 2.0'da yerine beklemekten poll() alt HAL için, proaktif yazma sensör olayları gerekir çağrılacak IHalProxyCallback sensör olayları mevcut olduğunda.

WAKE_UP etkinlikleri

Sensörler HAL 1.0'da HAL, uygulanması için uyandırma kilidini yönetebilir. Sensörler Çok HAL 2.0'da, alt HAL'lere Çok HAL uygulama uyanıklık kilitleri yönetmek ve çağırarak elde edilecek bir uyandırma kilit talep edebilirsiniz verir createScopedWakelock . Bir kapsamı uyandırma kilidi edinilmiş ve aktarılması gerekir kilitli postEvents Çoklu HAL uygulanmasına olaylar kadar uyandırma yayınlarken.

Dinamik sensörler

Sensörler HAL 1.0'da, dinamik sensör vasıtasıyla döndürülür poll() işlev. Sensörler Çok HAL 2.0 gerektirir onDynamicSensorsConnected ve onDynamicSensorsDisconnected içinde IHalProxyCallback zaman dinamik sensör bağlantıları değişim denir. Bu geri çağırma bir parçası olarak mevcuttur IHalProxyCallback aracılığıyla sağlanır işaretçi initialize() işlev.

Sensörler Multi-HAL 1.0'dan taşıma

Noktasına varolan uygulama Sensörler Çok HAL 1.0 , aşağıdaki adımları izleyin.

  1. Sensörler HAL yapılandırma bulunmaktadır emin olun /vendor/etc/sensors/hals.conf. Bu yer Dosya taşınırken içerebilir /system/etc/sensors/hals.conf .
  2. İlişkin referansları kaldırın hardware/hardware.h ve hardware/sensors.h bunlar HAL 2.0 için desteklenmez.
  3. Liman alt HAL'lere tarif edildiği gibi sensörler Hal 1.0 Porting .
  4. , Aşama 3 ve 4 izleyerek Seti Sensörler Çok HAL belirlenmiş HAL olarak 2.0 Uygulama Sensörler Mutli-HAL 2.0 bölüm.

doğrulama

Çalışan VTS

Eğer Sensörler Çok Hal 2.1 ile bir veya daha fazla alt HAL'lerin entegre ettik zaman kullanmak Satıcı Testi Suite (VTS) sizin alt HAL uygulamaları Sensörler HAL arayüzü tarafından belirlenen bütün şartları karşıladığından emin olmak için.

Bir ana makinede VTS kurulduğunda yalnızca sensör VTS testlerini çalıştırmak için aşağıdaki komutları yürütün:

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_0Target && \
  vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_1Target

Çalışan birim testleri

Birim testleri HalProxy_test.cpp testi HalProxy birim testinde örneklenen ve dinamik yüklenmez sahte alt HAL'lerin kullanarak. Yeni bir alt HAL oluştururken, bu testler, yeni alt HAL'in düzgün bir şekilde uygulandığını doğrulayan birim testlerinin nasıl ekleneceği konusunda bir kılavuz görevi görmelidir.

Testleri çalıştırmak için aşağıdaki komutları yürütün:

cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest

Sahte alt HAL'lerle test etme

Sahte alt HAL'lere ait kukla uygulamaları vardır ISensorsSubHal arayüzüne. Alt HAL'ler, farklı sensör listelerini ortaya çıkarır. Sensörler devreye edildiklerinde, periyodik için otomatik olarak oluşturulan sensör olayları sonrası HalProxy verilen bir sensör talebinde belirtilen aralıklarla dayalı.

Sahte alt HAL'ler, tam Çoklu HAL kodunun sisteme yüklenen diğer alt HAL'lerle nasıl çalıştığını test etmek ve Sensörlerin Çoklu HAL kodunun çeşitli yönlerini vurgulamak için kullanılabilir.

İki sahte alt HAL'lere mevcuttur hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ .

Sahte alt HAL'leri oluşturmak ve bir aygıta göndermek için aşağıdaki adımları gerçekleştirin:

  1. Üç farklı sahte alt HAL'ı oluşturmak ve aygıta göndermek için aşağıdaki komutları çalıştırın:

    $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
    mma
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  2. En sensörler HAL yapılandırma güncelleyin /vendor/etc/sensors/hals.conf sahte alt HAL'lere için yolları ile.

    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  3. Yeniden HalProxy ve yük config sıralanan yeni alt HAL'lere.

    adb shell stop
    adb shell start
    

hata ayıklama

Geliştiriciler kullanarak çerçeveyi debug lshal komutu. Sensors HAL'nin hata ayıklama çıktısını istemek için aşağıdaki komutu çalıştırın:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

Mevcut durumu hakkında bilgi HalProxy ve alt HAL'lere sonra terminale çıkıştır. Komut çıkış örneği aşağıda gösterilmektedir HalProxy nesne ve sahte alt HAL'lere.

Internal values:
  Threads are running: true
  Wakelock timeout start time: 200 ms ago
  Wakelock timeout reset time: 73208 ms ago
  Wakelock ref count: 0
  # of events on pending write queue: 0
  # of non-dynamic sensors across all subhals: 8
  # of dynamic sensors across all subhals: 0
SubHals (2):
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2

İçin belirtilen sayı ise # of events on pending write queue çok sayıda (1000 veya daha fazla) olduğu, bu sensörler çerçeveye yazılacak bekleyen çok olay olduğunu gösterir. Bu, sensör hizmetinin kilitlendiğini veya kilitlendiğini ve sensör olaylarını işlemediğini veya yakın zamanda bir alt HAL'den çok sayıda sensör olayının gönderildiğini gösterir.

Uyanıklık kilit ref sayısı fazlaysa 0 , bunun anlamı HalProxy bir uyandırma kilidi satın aldı. Bu, sadece daha büyük olmalıdır 0 a eğer ScopedWakelock kasıtlı tutuluyor veya uyandırma olayları gönderilmesinin HalProxy ve sensör çerçevesi tarafından işlenen edilmemiştir.

Debug yönteme geçirilen dosya tanıtıcı HalProxy geliştiricileri bir parçası olarak ayıklama yöntemi uygulamalıdır böylece her bir alt HAL geçirilir ISensorsSubHal arayüzüne.