Çoklu HAL Sensörleri

Sensör Çoklu HAL'i, sensör HAL'lerinin diğer sensör HAL'leriyle birlikte çalışmasına olanak tanıyan bir çerçevedir. 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.

Android 11 veya sonraki sürümleri çalıştıran cihazlarda kullanılabilen Sensors Multi-HAL 2.1, menteşe açısı sensör türünü gösterebilen alt HAL'lerin yüklenmesini destekleyen Sensors Multi-HAL 2.0'ın bir yinelemesidir. Bu sensör türünü desteklemek için alt HAL'lerin 2.1 SubHal başlığında tanımlanan alt HAL API'lerini kullanması gerekir.

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 Sensors Multi-HAL'i Sensors AIDL HAL ile kullanma başlıklı makaleyi inceleyin.

Sensors Multi-HAL 2 ile Sensors HAL 2 arasındaki fark

Android 10 veya sonraki sürümlerin yüklü olduğu cihazlarda kullanılabilen Sensors Multi-HAL 2, HAL API'leriyle etkileşimi kolaylaştırmak için Sensors HAL 2'nin üzerine çeşitli soyutlamalar ekler. 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:

  • initialize yöntemi, iki FMQ ve ISensorsCallback yerine bir IHalProxyCallback sınıfı iletir.
  • Alt HAL'ler, hata raporlarında hata ayıklama bilgileri sağlamak için bir hata ayıklama işlevi uygulamalıdır.
  • Yüklenen alt HAL'in diğer alt HAL'lerden ayırt edilebilmesi için alt HAL'lerde bir ad işlevi uygulanmalıdı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, uyanma kilitlerinin zaman aşımına uğrama yükünü Sensörler Çoklu HAL'ine devretmek ve uyanma kilidi kullanımını Sensörler Çoklu HAL'inin tamamı için tek bir ortak uyanma kilidinde merkezileştirmek amacıyla createScopedWakelock yöntemini kullanması önemle tavsiye edilir. Bu yöntem, kilitleme ve kilit açma çağrılarını en aza indirir.

Sensors Multi-HAL 2'de bazı 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örler Çoklu HAL kodu hardware/interfaces/sensors/common/default/2.X/multihal/'te kullanılabilir. Bazı kaynaklara ilişkin ipuçları aşağıda verilmiştir.

  • 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 HalProxy ile uyumlu olması için uyması gereken arayüzü tanımlar. 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 örnek alt HAL uygulaması, sahte veriler oluşturmak için sahte sensörler kullanır. Birden fazla alt HAL'ın bir cihazda nasıl etkileşimde bulunduğunu test etmek için kullanışlıdır.

Uygulama

Bu bölümde, Sensors Multi-HAL'in aşağıdaki durumlarda nasıl uygulanacağı açıklanmaktadır:

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ör HAL tanımı türleri arasındaki dönüşümü yönetir ve Sensörler Çoklu HAL 2.1'i Uygulama başlıklı makalede açıklanan çoklu HAL arayüzü etrafında bir sarmalayıcı tanımlar. AIDL çoklu HAL köprü katmanı, Sensörler Çoklu HAL 2.1'i uygulayan cihazlarla uyumludur.

AIDL çoklu HAL shim katmanı, baş takip cihazını ve sınırlı eksenli IMU sensör türlerini Sensors AIDL HAL'de göstermenize olanak tanır. Bu sensörü kullanmak için AIDL HAL arayüzü tarafından tanımlanan türlerde type alanını getSensorsList_2_1() uygulamasında SensorInfo yapı. Bu, AIDL ve HIDL sensör HAL'lerinin tam sayıyla desteklenen sensör türü alanları çakışmadığı için güvenlidir.

Sensörler Çoklu HAL 2.1'i uygulama

Sensörler Çoklu HAL 2.1'i yeni bir cihaza uygulamak için aşağıdaki adımları uygulayın:

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

    1. Hedefin, cihazın tedarikçi bölümüne bir yere gönderildiğinden emin olun.
    2. /vendor/etc/sensors/hals.conf konumundaki yapılandırma dosyasına, kitaplığın yolunu yeni bir satıra ekleyin. Gerekirse hals.conf dosyasını oluşturun.

    Alt HAL kitaplığı oluşturmaya yönelik örnek bir Android.bp girişi için hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp bölümüne bakın.

  4. Cihazda desteklenen HAL'lerin listesini içeren manifest.xml dosyasından tüm android.hardware.sensors girişlerini kaldırın.

  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, önyükleme sırasında başlar, yeni uygulanan alt HAL'i arar ve sensorsHalGetSubHal_2_1 çağrısını yaparak bu HAL'i başlatır.

Sensörler Çoklu HAL 2.0'dan Çoklu HAL 2.1'e taşıma

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, ISensors.hal spesifikasyonunun 2.1 sürümünde oluşturulan türleri kullanır.
  • initialize() işlevi, 2.0 SubHal arayüzündeki yerine yeni bir IHalProxyCallback iletiyor
  • Bu yöntemler ISensors.hal spesifikasyonunun 2.1 sürümünde eklenen yeni türleri kullandığından alt HAL'ler getSensorsList ve injectSensorData yerine getSensorsList_2_1 ve injectSensorData_2_1 yöntemlerini uygulamalıdır.
  • Çoklu HAL'ın bunları 2.1 sürümü alt HAL'leri olarak ele alması için alt HAL'lerin sensorsHalGetSubHal yerine sensorsHalGetSubHal_2_1 göstermesi gerekir.

Sensors HAL 2.0'dan bağlantı noktası

Sensors HAL 2.0'dan Sensors Multi-HAL 2.0'a yükseltme yaparken HAL uygulamanızın aşağıdaki koşulları karşıladığından emin olun.

HAL'yi başlatma

Sensors HAL 2.0, sensör hizmetinin FMQ'leri ve dinamik sensör geri çağırma işlevini iletmesine olanak tanıyan bir başlatma işlevine sahiptir. Sensors Multi-HAL 2.0'da initialize() işlevi, sensör etkinliklerini yayınlamak, uyanma kilitleri almak ve dinamik sensör bağlantısı ile bağlantı kesme durumlarını bildirmek için kullanılması gereken tek bir geri çağırma işlevi iletir.

Sensör etkinliklerini çoklu HAL uygulamasına gönderme

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ör HAL 2.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. Sensors Multi-HAL 2.0'ta alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrısı yaparak bir uyanık kalma kilidinin alınmasını isteyebilir. Çoklu HAL uygulamasına uyanma etkinlikleri gönderilirken kilitli kapsamlı bir uyanma kilidi edinilmeli ve postEvents'e iletilmelidir.

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ı

Sensors HAL 1.0'dan Sensors Multi-HAL 2.0'a yükseltme yaparken HAL uygulamanızın aşağıdaki koşulları karşıladığından emin olun.

HAL'i başlatma

Alt HAL ile Çoklu HAL uygulaması arasında geri çağırma oluşturmak için initialize() işlevi desteklenmelidir.

Mevcut sensörleri gösterme

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 çoklu HAL uygulamasına gönderme

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

WAKE_UP etkinlikleri

Sensörler HAL 1.0'da HAL, uygulama için uyanma kilidini yönetebilir. Sensors Multi-HAL 2.0'ta alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrılmasıyla uyanık kalma kilidinin alınmasını isteyebilir. Çoklu HAL uygulamasına uyanma etkinlikleri gönderilirken kilitli kapsamlı bir uyanma kilidi edinilmeli ve postEvents'e iletilmelidir.

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, initialize() işlevi aracılığıyla sağlanan IHalProxyCallback işaretçisi kapsamında kullanılabilir.

Sensörler Çoklu HAL 1.0'dan taşıma

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

  1. Sensörler HAL yapılandırmasının /vendor/etc/sensors/hals.conf konumunda bulunduğundan emin olun. Bu işlem, küçük resmin bulunduğu dosyayı Yer: /system/etc/sensors/hals.conf.
  2. HAL 2.0 için desteklenmediğinden hardware/hardware.h ve hardware/sensors.h ile ilgili tüm referansları kaldırın.
  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ırma

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 Çoklu HAL dolgu katmanını çalıştırıyorsanız VtsAidlHalSensorsTargetTest dosyasını ç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

HalProxy_test.cpp içindeki birim testleri, birim testinde örneklendirilen ve dinamik olarak yüklenmeyen sahte alt HAL'leri kullanarak HalProxy'ü test eder. Yeni bir alt HAL oluştururken bu testler, yeni alt HAL'in düzgün şekilde uygulandığını doğrulayan birim testlerinin nasıl ekleneceği konusunda rehber 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 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, belirli bir sensör isteğinde belirtilen aralıklara göre otomatik olarak oluşturulan sensör etkinliklerini düzenli aralıklarla HalProxy'e gönderir.

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örler Çoklu HAL kodunun çeşitli yönlerini zorlamak için kullanılabilir.

hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ adresinde iki sahte alt HAL mevcuttur.

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

  1. Üç farklı sahte alt HAL'i derleyip cihaza aktarmak 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. /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'ü 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çevede hata 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

Ardından HalProxy ve alt HAL'lerinin mevcut durumu terminale gönderilir. 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 durum, sensör hizmetinin kilitlendiğini veya kilitlenip kilitlenmediğini, sensör etkinliklerini işlemediğini ya da yakın zamanda bir alt HAL'den büyük bir sensör etkinliği grubu yayınlandığını gösterir.

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 alt HAL'e iletilir. Bu nedenle, geliştiricilerin hata ayıklama yöntemini ISensorsSubHal arayüzünün bir parçası olarak uygulamaları gerekir.