Sensörler Çoklu HAL

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'i, tedarikçi bölümündeki paylaşılan bir nesneye yerleştirilmiş ve çoklu HAL çerçevesi tarafından kullanılan bir sensör HAL'idir. Bu alt HAL'ler birbirine veya işlem için ana işlevi içeren çoklu HAL koduna bağlı değildir.

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 ve Sensors AIDL HAL kullanan cihazlarda, çoklu HAL özelliğine izin vermek için çoklu HAL shim katmanını kullanabilirsiniz. Uygulama ayrıntıları için Sensors Multi-HAL'i Sensors AIDL HAL ile kullanma başlıklı makaleyi inceleyin.

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:

  • 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.

Sensors Multi-HAL 2 ile Sensors HAL 2 arasındaki temel fark, başlatma işlevlerindedir. 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ı kaynaklar için ipuçlarını aşağıda bulabilirsiniz.

  • HalProxy.h: HalProxy nesnesi, Sensörler çoklu HAL tarafından oluşturulur ve alt HAL'lerden sensör çerçevesine veri aktarımını yönetir.
  • HalProxy.cpp: HalProxy'ın uygulanması, alt HAL'ler ile sensör çerçevesi arasındaki iletişimi çoklu hale getirmek için gereken tüm mantığı içerir.
  • 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. Alt HAL, HalProxyCallback nesnesinin postEvents ve createScopedWakelock için kullanılabilmesi amacıyla initialize yöntemini uygular.

    Çoklu HAL 2.0 uygulamaları için SubHal.h'ın 2.0 sürümünü kullanın.

  • 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'ın 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 köprü katmanı, Sensörler Çoklu HAL 2.1'i uygulayan 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 AIDL HAL arayüzü tarafından tanımlanan bu sensör türlerini kullanmak için getSensorsList_2_1() uygulamasında SensorInfo yapısındaki type alanını ayarlayın. 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 Çoklu HAL 2.1'i yeni bir cihaza uygulamak için aşağıdaki adımları uygulayın:

  1. ISensorsSubHal arayüzünü SubHal.h bölümünde açıklandığı şekilde uygulayın.
  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. 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ı 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. device.mk dosyasından tüm android.hardware.sensors hizmeti ve service.rc dosyalarını kaldırın ve android.hardware.sensors@2.1-service.multihal ile android.hardware.sensors@2.1-service.multihal.rc dosyalarını PRODUCT_PACKAGES dosyasına ekleyin.

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 geçiş yapmak için SubHal arayüzünü uygulayın ve alt HAL'inizi 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, 2.0 SubHal arayüzündeki yerine yeni bir IHalProxyCallback iletiyor
  • 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'i 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

Alt HAL, sensör etkinlikleri mevcut olduğunda sensör etkinliklerini FMQ üzerinden yayınlamak yerine IHalProxyCallback alanına yazmalıdır.

WAKE_UP etkinlikleri

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

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'i başlatma

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

Mevcut sensörleri gösterme

Sensors Multi-HAL 2.0'da getSensorsList() işlevi, tek bir cihazın başlatılması sırasında, sensör HAL'lerinin yeniden başlatılması sırasında bile aynı değeri döndürmelidir. 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 yeniden başlatıldıktan sonra değişebilir.

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

Sensors HAL 2.0'da alt HAL, poll() çağrılmasını beklemek yerine, sensör etkinlikleri mevcut olduğunda proaktif olarak IHalProxyCallback alanına sensör etkinlikleri yazmalıdır.

WAKE_UP etkinlikleri

Sensörler HAL 1.0'da HAL, uygulama için uyanma kilidini yönetebilir. İçinde Multi-HAL 2.0 sensörü olan sub-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, /system/etc/sensors/hals.conf konumundaki dosyanın taşınmasını içerebilir.
  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. Sensors Multi-HAL 2.0'ı uygulama bölümündeki 3. ve 4. adımları uygulayarak Sensors Multi-HAL 2.0'ı belirlenen HAL olarak ayarlayın.

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 Ç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

Birim, HalProxy_test.cpp testinde HalProxy testinde kullanılan doğru olmayan alt HAL'ler ve dinamik olarak yüklenmeyen veriler, birim testinde örneklenir. 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 örnek uygulamalarıdır. Alt HAL'ler farklı sensör listeleri 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.

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

Sahte alt HAL'leri derleyip bir cihaza göndermek 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ör HAL yapılandırmasını, sahte alt HAL'lerin yollarıyla güncelleyin.

    /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ıklama yapabilir. 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ı büyükse (1.000 veya daha fazla) sensör çerçevesine yazılmayı bekleyen çok sayıda etkinlik olduğunu gösterir. 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 yalnızca ScopedWakelock kasıtlı olarak tutuluyorsa veya HalProxy'ye uyanma etkinlikleri gönderildiyse ve sensör çerçevesi tarafından işlenmediyse 0'ten büyük olmalıdır.

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.