Çoklu HAL Sensörleri

Multi-HAL adlı Sensörler, HAL'lerin birlikte çalışabilmesini sağlayan bir çerçevedir başka sensör HAL'leri olabilir. Sensörler Multi-HAL, sensör alt HAL'lerini dinamik olarak yükler satıcı bölümünde dinamik kitaplıklar olarak depolanır ve onlara bir geri çağırma sağlar nesnesini ifade eder. Sensör alt HAL'si, web sitenizdeki paylaşılan bir nesnede yerleşik olarak bulunan ve çoklu HAL çerçevesi tarafından kullanılır. Bu alt HAL'ler veya ana işlevi içeren çoklu HAL koduna bağımlıdır. açıklamaya çalışın.

Multi-HAL 2.1 Sensörleri, Android çalıştıran cihazlarda kullanılabilir 11 veya üzeri bir sayı aşağıdakileri yapabilecek alt HAL'lerin yüklenmesini destekleyen Multi-HAL 2.0 Sensörlerinin iterasyonu CANNOT TRANSLATE menteşe açısı sensör türü. Bu sensör türünü desteklemek için alt HAL'lerin, alt HAL API'lerini kullanması gerekir 2.1 SubHal başlığı.

Android 13 veya sonraki sürümleri çalıştıran Sensor AIDL HAL'ı kullanmak için çoklu HAL özelliğine olanak tanıyan çoklu HAL dolgu katmanıdır. Uygulama ayrıntıları için bkz. Multi-HAL Sensörlerinin AIDL HAL Sensörleriyle Kullanılması.

Multi-HAL 2 Sensörleri ile HAL 2 Sensörleri arasındaki fark

Multi-HAL 2 Sensörleri, Android çalıştıran cihazlarda kullanılabilir 10 veya üzeri Sensör HAL'sinin yanı sıra çeşitli soyutlamalar sunuyor. 2 kullanmaları gerekecek. Multi-HAL 2 sensörü HalProxy ve Sensörler HAL 2 arayüzünü ve V2_1/SubHal (veya V2_0/SubHal) arayüzünü kullanarak HalProxy alt HAL'lerle etkileşime girebilir.

ISensorsSubHal arayüzü, 2.1/ISensors.hal (veya 2.0/ISensors.hal) aşağıdaki şekillerde kullanabilirsiniz:

  • İlk kullanıma hazırlama yöntemi, IHalProxyCallback gönderir sınıfını kullanır.ISensorsCallback
  • Sub-HAL'ler, hata ayıklama sağlamak için bir hata ayıklama işlevi uygulamalıdır daha fazla bilgi edineceksiniz.
  • Sub-HAL'lerin, yüklenen alt HAL'nin diğer alt HAL'lerden ayrılır.

Multi-HAL 2 Sensörleri ile HAL 2 Sensörleri arasındaki temel fark ilk kullanıma hazırlama işlevleri FMQ sağlamak yerine IHalProxyCallback Arayüz, sensör etkinliklerini sensörlere göndermek için biri olmak üzere iki yöntem sunar. çerçeve ve uyanık kalma kilitleri oluşturmak için bir yöntem. Gelişmiş Koruma bölümünde Multi-HAL, FMQ'larla olan tüm etkileşimleri yöneterek ürünlerin zamanında teslim edilmesini sağlar. tüm alt HAL'ler için sensör etkinliklerini dikkate alır. Alt HAL'lerin createScopedWakelock uyanık kalma kilitlerini zamanlama yükünü Multi-HAL sensörlerini ve uyanık kalma kilidi kullanımını tek bir ortak uyanık kalma kilidinde merkezileştirmek için Böylece, kilitlenme ve kilit açma çağrılarını en aza indiren Sensors Multi-HAL'nin tamamı kullanılabilir.

Multi-HAL 2 sensöründe yerleşik güvenlik özellikleri de bulunur. Bu sayfa, Sensör FMQ'nun dolu olduğu veya Android sensör çerçevesinin yeniden başlatılır ve sensör durumunun sıfırlanması gerekir. Ayrıca, etkinlikler HalProxy sınıfında yayınlandı, ancak sensör çerçevesi kabul edemedi Sensors Multi-HAL, etkinlikleri bir arka plana taşıyabilir. belirli bir etkinlik olabilir.

Kaynak kodu ve referans uygulaması

Tüm Sensörlerin Multi-HAL kodunu şurada bulabilirsiniz: hardware/interfaces/sensors/common/default/2.X/multihal/. Bazı kaynaklar için ipuçlarını aşağıda bulabilirsiniz.

  • HalProxy.h: HalProxy nesnesi, Sensör çoklu HAL tarafından örneklendirilir ve verilerin alt HAL'lerden sensör çerçevesine aktarılması.
  • HalProxy.cpp: HalProxy uygulaması, aşağıdakileri gerçekleştirmek için gereken tüm mantığı içerir: alt HAL'ler ile sensör çerçevesi arasında Multiplex iletişimi.
  • SubHal.h: ISensorsSubHal arayüzü, alt HAL'lerin kullanması gereken arayüzü tanımlar HalProxy ile uyumlu olmak için aşağıdaki adımları uygulayın. Sub-HAL, HalProxyCallback nesnesinin kullanılabilmesi için ilk kullanıma hazırlama yöntemi postEvents ve createScopedWakelock.

    Multi-HAL 2.0 uygulamaları için sürüm 2.0'ı kullanın: SubHal.h.

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

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/: Bu örneğin alt HAL uygulamasında, sahte sensörler oluşturmak için sahte sensörler dışı verilerdir. Birden fazla alt HAL'nin bir cihazda nasıl etkileşimde bulunduğunu test etmek için kullanışlıdır.

Uygulama

Bu bölümde, aşağıda belirtilen durumlarda Multi-HAL Sensörlerinin nasıl uygulanacağı açıklanmaktadır durumlar:

AIDL HAL Sensörleri ile Multi-HAL Sensörlerini Kullanma

AIDL HAL Sensörleri ile çoklu HAL özelliğine izin vermek için AIDL'yi içe aktarın Şurada bulunan Multi-HAL dolgu katmanı modülü: donanım/arayüzler/sensörler/aidl/default/multihal/. Modül, AIDL ve HIDL sensörlerinin HAL tanımı arasındaki dönüşümü işler bir sarmalayıcı tanımlar ve aşağıda açıklandığı üzere çoklu HAL arayüzünün etrafında bir sarmalayıcı tanımlar Multi-HAL 2.1 Sensörlerini Uygulama. AIDL çoklu HAL dolgu katmanı, Multi-HAL 2.1 Sensörlerini kullanan cihazlarla uyumludur.

AIDL çoklu HAL dolgu katmanı, baş izleyiciyi ve baş izleyiciyi açığa çıkarmanıza olanak tanır. AIDL HAL Sensörleri'ndeki sınırlı eksenli IMU sensör türleri Bu sensörü kullanmak için AIDL HAL arayüzünün tanımladığı türlerde, type alanını getSensorsList_2_1() uygulamasında SensorInfo yapı. Bu güvenli AIDL ve HIDL sensörlerinin HAL tam sayı destekli sensör türü alanları üstlenmez.

Multi-HAL 2.1 Sensörlerini Uygulama

Sensörler Multi-HAL 2.1'i yeni bir cihaza uygulamak için aşağıdaki adımları izleyin:

  1. ISensorsSubHal arayüzünü aşağıda açıklandığı şekilde uygulayın SubHal.h
  2. Şunu uygulayın: sensorsHalGetSubHal_2_1 yöntemini SubHal.h içinde değiştirebilirsiniz.
  3. Yeni uygulanan alt HAL'yi oluşturmak için bir cc_library_shared hedefi ekleyin. Hedef eklerken:

    1. Hedefin tedarikçi firmada bir yere aktarıldığından emin olma bölümü.
    2. /vendor/etc/sensors/hals.conf adresindeki yapılandırma dosyasında, yolu yeni bir satırda kitaplığa ekleyin. Gerekirse, hals.conf dosyası yükleyin.

    Alt HAL kitaplığı oluşturmakla ilgili örnek bir Android.bp girişi için bkz. hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp

  4. android.hardware.sensors girişin tümünü manifest.xml dosyasını yükleyin. Bu dosya, cihazda desteklenen HAL'lerin listesini içerir.

  5. Tüm android.hardware.sensors hizmetini ve service.rc dosyayı şuradan kaldır: device.mk dosyasını yükleyin ve android.hardware.sensors@2.1-service.multihal ekleyin ve android.hardware.sensors@2.1-service.multihal.rc ile PRODUCT_PACKAGES.

HalProxy başlatma sırasında başlatılır, yeni uygulanan alt HAL'yi arar ve çağırarak başlatır sensorsHalGetSubHal_2_1

Sensörler Multi-HAL 2.0'dan Multi-HAL 2.1'e Bağlantı Noktası

Multi-HAL 2.0'dan Multi-HAL 2.1'e bağlamak için SubHal arayüzünü kullanıp alt HAL'nizi yeniden derleyin.

2.0 ve 2.1 SubHal arayüzleri arasındaki farklar şunlardır:

  • IHalProxyCallback, şurada oluşturulan türleri kullanır: ISensors.hal spesifikasyonunun 2.1 sürümü
  • initialize() işlevi, yeni bir IHalProxyCallback 2.0 SubHal arayüzü yerine
  • Sub-HAL'ler getSensorsList_2_1 ve injectSensorData_2_1 uygulamalıdır yerine getSensorsList ve injectSensorData yerine ISensors.hal spesifikasyonunun 2.1 sürümünde eklenen yeni türler.
  • Sub-HAL'ler,sensorsHalGetSubHal_2_1 Multi-HAL'nin bunları sürüm 2.1 olarak değerlendirmesi için sensorsHalGetSubHal alt HAL'ler içerir.

Sensörlerden HAL 2.0 bağlantı noktası

Sensör HAL'si özelliğinden Sensör Multi-HAL 2.0 sürümüne geçerken 2.0, HAL aşağıdaki şartları karşıladığını gösterir.

HAL'yi başlatma

HAL 2.0 sensörleri, sensör hizmetinin aşağıdaki işlemleri gerçekleştirmesini sağlayan bir başlatma işlevine sahiptir: FMQ'ları iletme ve dinamik sensör geri çağırması. Multi-HAL 2.0 Sensörleri'nde, initialize() işlevi, aşağıdakileri yayınlamak için kullanılması gereken tek bir geri çağırma iletir oluşturabilir, uyanık kalma kilitlerini alabilir ve dinamik sensör bağlantısı ve olabilir.

Sensör etkinliklerini Multi-HAL uygulamasında yayınlama

Sub-HAL, sensör etkinliklerini FMQ üzerinden yayınlamak yerine sensörü yazmalıdır şu tarihe kadar: IHalProxyCallback olup olmadığını kontrol edin.

WAKE_UP etkinlikleri

Sensörler HAL 2.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. İçinde Multi-HAL 2.0 sensörü olan alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetebilir ve createScopedWakelock. Şu durumlarda, kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents öğesine geçirilmelidir Uyandırma etkinliklerini Multi-HAL uygulamasına gönderebilirsiniz.

Dinamik sensörler

Multi-HAL 2.0 sensörü için onDynamicSensorsConnected ve onDynamicSensorsDisconnected inç IHalProxyCallback dinamik sensör bağlantıları her değiştiğinde çağrılır. Bu geri çağırma işlevleri sağlanan IHalProxyCallback işaretçisinin bir parçası olarak kullanılabilir initialize() işlevi.

Sensörlerden HAL 1.0 bağlantı noktası

Sensör HAL'si özelliğinden Sensör Multi-HAL 2.0 sürümüne geçerken 1.0, HAL aşağıdaki şartları karşıladığını gösterir.

HAL'yi başlatma

Geri çağırmanın yapılması için initialize() işlevi desteklenmelidir. alt HAL ve Multi-HAL uygulaması.

Kullanılabilir sensörleri kullanıma aç

Sensörler Multi-HAL 2.0'da getSensorsList() işlevi aynı değeri döndürmelidir değeri (HAL yeniden başlatılsa bile) Bu da sistem sunucusu devre dışıysa sensör bağlantılarını yeniden yeniden başlatılır. getSensorsList() tarafından döndürülen değer cihaz sonrasında değişebilir yeniden başlatma işlemi gerçekleştirir.

Sensör etkinliklerini Multi-HAL uygulamasında yayınlama

Sensörler HAL 2.0'daki alt HAL, poll() çağrılmasını beklemek yerine sensör etkinliklerini proaktif olarak IHalProxyCallback .

WAKE_UP etkinlikleri

Sensör HAL 1.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. İçinde Multi-HAL 2.0 sensörü olan alt HAL'ler, Multi-HAL uygulamasının şunları yapmasını sağlar: uyanık kalma kilitlerini yönetebilir ve createScopedWakelock. Şu durumlarda, kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents öğesine geçirilmelidir Uyandırma etkinliklerini Multi-HAL uygulamasına gönderebilirsiniz.

Dinamik sensörler

Sensörler HAL 1.0'da, dinamik sensörler poll() işlevi aracılığıyla döndürülür. Multi-HAL 2.0 sensörü için onDynamicSensorsConnected ve onDynamicSensorsDisconnected inç IHalProxyCallback dinamik sensör bağlantıları her değiştiğinde çağrılır. Bu geri çağırma işlevleri sağlanan IHalProxyCallback işaretçisinin bir parçası olarak kullanılabilir initialize() işlevi.

Sensörlerden Multi-HAL 1.0 Bağlantı Noktası

Mevcut bir uygulamayı Sensörler Multi-HAL 1.0, bu adımları uygulayın.

  1. Sensörlerin HAL yapılandırmasının şu konumda olduğundan emin olun: /vendor/etc/sensors/hals.conf Bu işlem, küçük resmin bulunduğu dosyayı Yer: /system/etc/sensors/hals.conf.
  2. Şu sayfaya yapılan tüm referansları kaldırın: hardware/hardware.h ve hardware/sensors.h HAL 2.0 için desteklenmez.
  3. HAL Sensörlerinden Taşıma bölümünde açıklandığı üzere bağlantı noktası alt HAL'leri 1.0'da indirilebileceğini lütfen unutmayın.
  4. 3. ve 3. adımları uygulayarak Sensörler Multi-HAL 2.0'ı atanmış HAL olarak ayarlayın 4, Mutli-HAL 2.0 Sensörlerini Uygulama bölümünde görebilirsiniz.

Doğrulama

VTS'yi çalıştır

Bir veya daha fazla alt HAL'yi Multi-Hal 2.1 Sensörleriyle entegre ettiğinizde alt HAL'nizin belirtildiğinden emin olmak için Tedarikçi Test Paketi (VTS)'yi kullanın. uygulamalar, Sensör HAL arayüzü tarafından belirlenen tüm gereksinimleri karşılamalıdır.

VTS, bir ana makinede kurulu olduğunda yalnızca VTS sensörlerini çalıştırmak için şu 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

AIDL Multi-HAL dolgu katmanını çalıştırıyorsanız VtsAidlHalSensorsTargetTest komutunu çalıştırın.

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

Birim testleri çalıştırma

Birim, HalProxy_test.cpp testinde HalProxy testinde kullanılan doğru olmayan alt HAL'ler ve dinamik olarak yüklenmeyen veriler, birim testinde örneklenir. Bir bu testler, dönüşüm kabiliyetini artıran birim testlerinin yeni alt HAL'nin doğru şekilde uygulandığını doğrulayın.

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 yapma

Sahte alt HAL'ler, ISensorsSubHal arayüzünün model uygulamalarıdır. Sub-HAL'ler farklı sensör listelerini gösterir. Sensörler etkinleştirildiğinde Düzenli aralıklarla otomatik olarak oluşturulan sensör etkinliklerini HalProxy ürününe yayınlarlar belirli bir sensör isteğinde belirtilen aralıklara göre değişir.

Sahte alt HAL'ler, tam Multi-HAL kodunun alt HAL'lerin kullanıldığı durumlara örnek olarak, sisteme yüklenen Sensörlerin Multi-HAL kodu.

Şu konumda iki sahte alt HAL var: hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/.

Sahte alt HAL'ler oluşturup bir cihaza aktarmak için aşağıdaki adımları uygulayın:

  1. Üç farklı sahte dosyayı oluşturup aktarmak için aşağıdaki komutları çalıştırın: cihazın alt HAL'leri:

    $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. /vendor/etc/sensors/hals.conf adresindeki sensörlerin HAL yapılandırmasını şununla güncelle: yollarını keşfedeceğiz.

    /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. HalProxy uygulamasını yeniden başlatın ve yapılandırmada listelenen yeni alt HAL'leri yükleyin.

    adb shell stop
    adb shell start
    

Hata ayıklama

Geliştiriciler, lshal komutunu kullanarak çerçevedeki hataları ayıklayabilir. hata ayıklama çıkışını görüntülemek için aşağıdaki komutu çalıştırın:

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

Böylece, HalProxy adlı işletmenin mevcut durumu ve alt HAL'leri hakkında bilgi edinebilirsiniz: çıkışını terminale yükleyin. Aşağıda, HalProxy nesne ve sahte alt HAL'ler.

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

# of events on pending write queue için belirtilen sayı bir büyük sayı (1000 veya üzeri), bu, sensörlere yazılmayı bekleyen pek çok etkinlik olduğunu gösterir bahsedeceğim. Bu mesaj, sensör hizmetinin kilitlendiğini veya kilitlendiğini gösterir ve sensör etkinliklerini işlemediğini veya büyük miktarda sensör etkinliğinin kısa süre önce bir alt HAL'den gönderildi.

Uyanık kalma kilidi referans sayısı 0 değerinden büyükse bu, HalProxy için geçerli olduğu anlamına gelir. elde etti. Bu değer, ScopedWakelock ise 0 değerinden büyük olmalıdır. kasıtlı olarak gerçekleştiriliyorsa veya uyandırma etkinlikleri HalProxy adresine gönderilmişse veya sensör çerçevesi tarafından işlenmez.

HalProxy hata ayıklama yöntemine iletilen dosya tanımlayıcısı, her bir Böylece geliştiricilerin, ISensorsSubHal arayüzü.