Sensörler Çoklu HAL

Sensors Multi-HAL, sensör HAL'lerinin diğer sensör HAL'leriyle birlikte çalışmasına olanak tanıyan 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ın gönderilmesini ve uyanık kalma kilidinin alınıp serbest bırakılmasını yönetebilecek bir geri çağırma nesnesi verir. Sensör alt HAL'si, satıcı bölümündeki paylaşılan bir nesneye yerleşik olan ve çoklu HAL çerçevesi tarafından kullanılan bir sensör HAL'idir. Bu alt HAL'ler birbirlerine veya sürecin ana işlevini içeren çoklu HAL koduna bağlı değildir.

Android 11 veya üstünü çalıştıran cihazlarda bulunan Sensors Multi-HAL 2.1, menteşe açısı sensör tipini ortaya çıkarabilen 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.

AIDL HAL Sensörlerini kullanan Android 13 veya üzerini çalıştıran cihazlarda, çoklu HAL özelliğine izin vermek için çoklu HAL dolgu katmanını kullanabilirsiniz. Uygulama ayrıntıları için bkz. Multi-HAL Sensörlerini AIDL HAL Sensörleriyle Kullanma .

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

Android 10 veya üzerini çalıştıran cihazlarda bulunan Sensors Multi-HAL 2, HAL API'leriyle etkileşimi kolaylaştırmak için Sensors HAL 2'ye ek olarak çeşitli soyutlamalar sunar. Sensors Multi-HAL 2, HalProxy alt HAL'lerle etkileşime girmesine izin vermek için Sensors HAL 2 arayüzünün ve V2_1/SubHal (veya V2_0/SubHal ) arayüzünün uygulanmasını yönetmek için HalProxy sınıfını sunar.

ISensorsSubHal arayüzü, 2.1/ISensors.hal (veya 2.0/ISensors.hal ) arayüzünden aşağıdaki yönlerden farklıdır:

  • Başlatma yöntemi, iki FMQ ve ISensorsCallback yerine bir IHalProxyCallback sınıfını 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'lerin bir ad işlevi uygulaması gerekir.

Multi-HAL 2 Sensörleri ile HAL 2 Sensörleri arasındaki temel fark, başlatma işlevlerindedir. IHalProxyCallback arayüzü, FMQ'lar sağlamak yerine iki yöntem sağlar; sensör olaylarını sensör çerçevesine göndermek için bir yöntem ve uyanık kalma kilitleri oluşturmak için bir yöntem. Temel olarak, Multi-HAL Sensörleri, tüm alt HAL'ler için sensör olaylarının zamanında iletilmesini sağlamak amacıyla FMQ'larla olan tüm etkileşimleri yönetir. Alt HAL'lerin, uyanık kalma kilitlerinin zaman aşımına uğrama yükünü Sensors Multi-HAL'e devretmek ve uyanık kalma kilidi kullanımını tüm Sensors Multi-HAL için tek bir ortak uyanık kalma kilidinde merkezileştirmek için createScopedWakelock yöntemini kullanması önemle tavsiye edilir; bu, kilitleme ve kilit açmayı en aza indirir Aramalar.

Sensors Multi-HAL 2 ayrıca bazı yerleşik güvenlik özelliklerine de sahiptir. Sensör FMQ'sunun dolduğu veya Android sensör çerçevesinin yeniden başlatıldığı ve sensör durumunun sıfırlanması gerektiği durumları yönetir. Ek olarak, olaylar HalProxy sınıfına gönderildiğinde ancak sensör çerçevesi olayları hemen kabul edemediğinde, Sensors Multi-HAL, olayları beklerken tüm alt HAL'lerde işin devam etmesine izin vermek için olayları bir arka plan iş parçacığına taşıyabilir. gönderilecek.

Kaynak kodu ve referans uygulaması

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

  • HalProxy.h : HalProxy nesnesi, Sensors multi-HAL tarafından başlatılır ve alt HAL'lerden sensör çerçevesine veri aktarımını yönetir.
  • HalProxy.cpp : HalProxy uygulanması, alt HAL'ler ve sensör çerçevesi arasındaki iletişimi çoğullamak için gereken tüm mantığı içerir.
  • SubHal.h : ISensorsSubHal arabirimi, alt HAL'lerin HalProxy ile uyumlu olması için izlemesi gereken arabirimi tanımlar. Alt HAL, HalProxyCallback nesnesinin postEvents ve createScopedWakelock için kullanılabilmesi için başlatma yöntemini uygular.

    Multi-HAL 2.0 uygulamaları için SubHal.h 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 örnek alt HAL uygulaması, sahte veriler oluşturmak için sahte sensörler kullanır. Birden fazla alt HAL'nin bir cihazda nasıl etkileşime girdiğini test etmek için kullanışlıdır.

Uygulama

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

Multi-HAL Sensörlerini AIDL HAL Sensörleriyle Kullanın

AIDL HAL Sensörleri ile çoklu HAL özelliğine izin vermek için hardware/interfaces/sensors/aidl/default/multihal/ konumunda bulunan AIDL Multi-HAL dolgu katmanı modülünü içe aktarın. Modül, AIDL ve HIDL sensörleri HAL tanım türleri arasındaki dönüşümü yönetir ve Multi-HAL Sensörlerinin Uygulanması 2.1'de açıklanan çoklu HAL arayüzü etrafındaki bir sarmalayıcıyı tanımlar. AIDL multi-HAL dolgu katmanı, Sensors Multi-HAL 2.1'i uygulayan cihazlarla uyumludur.

AIDL çoklu HAL dolgu katmanı, AIDL HAL Sensörlerinde kafa izleyiciyi ve sınırlı eksenli IMU sensör türlerini ortaya çıkarmanıza olanak tanır. AIDL HAL arayüzü tarafından tanımlanan bu sensör türlerini kullanmak için getSensorsList_2_1() uygulamasındaki SensorInfo yapısında type alanını ayarlayın. Bu güvenlidir çünkü AIDL ve HIDL sensörleri HAL'nin tamsayı destekli sensör tipi alanları çakışmaz.

Uygulama Sensörleri Multi-HAL 2.1

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

  1. ISensorsSubHal arayüzünü SubHal.h açıklandığı şekilde uygulayın.
  2. SubHal.h 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 satıcı bölümünde bir yere itildiğinden emin olun.
    2. /vendor/etc/sensors/hals.conf konumunda bulunan yapılandırma dosyasına kitaplığın yolunu yeni bir satıra ekleyin. Gerekirse hals.conf dosyasını oluşturun.

    HAL alt kitaplığı oluşturmaya yönelik örnek bir Android.bp girişi için bkz. hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp .

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

  5. device.mk dosyasından tüm android.hardware.sensors service ve service.rc dosyalarını kaldırın ve android.hardware.sensors@2.1-service.multihal ve android.hardware.sensors@2.1-service.multihal.rc PRODUCT_PACKAGES ekleyin.

Önyükleme sırasında HalProxy başlar, yeni uygulanan alt HAL'yi arar ve sensorsHalGetSubHal_2_1 çağırarak onu başlatır.

Sensors Multi-HAL 2.0'dan Multi-HAL 2.1'e Bağlantı Noktası

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 ISensors.hal belirtiminin 2.1 sürümünde oluşturulan türleri kullanır.
  • initialize() işlevi, 2.0 SubHal arayüzündekinin yerine yeni bir IHalProxyCallback iletir
  • Bu yöntemler ISensors.hal belirtiminin 2.1 sürümünde eklenen yeni türleri kullandığından, alt HAL'lerin getSensorsList ve injectSensorData yerine getSensorsList_2_1 ve injectSensorData_2_1 uygulamaları gerekir.
  • Alt HAL'lerin, Multi-HAL'in onları sürüm 2.1 alt HAL'leri olarak ele alması için, sensorsHalGetSubHal yerine sensorsHalGetSubHal_2_1 göstermesi gerekir.

HAL 2.0 Sensörlerinden Bağlantı Noktası

Sensors HAL 2.0'dan Sensors Multi-HAL 2.0'a yükseltme yaparken, HAL uygulamasının aşağıdaki gereksinimleri karşıladığından emin olun.

HAL'yi başlat

Sensörler HAL 2.0, sensör hizmetinin FMQ'ları ve dinamik sensör geri aramasını geçmesine olanak tanıyan bir başlatma işlevine sahiptir. Sensors Multi-HAL 2.0'da, initialize() işlevi, sensör olaylarını yayınlamak, uyanık kalma kilitleri elde etmek ve dinamik sensör bağlantısı ve bağlantı kesintilerini bildirmek için kullanılması gereken tek bir geri çağırmayı iletir.

Sensör olaylarını Multi-HAL uygulamasına gönderin

Sensör olaylarını FMQ aracılığıyla göndermek yerine, sensör olayları mevcut olduğunda alt HAL'nin sensör olaylarını IHalProxyCallback yazması gerekir.

WAKE_UP etkinlikleri

Sensors HAL 2.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. Sensors Multi-HAL 2.0'da alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrılarak bir uyanık kalma kilidinin alınmasını talep edebilir. Uyandırma olaylarını Multi-HAL uygulamasına gönderirken, kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents aktarılmalıdır.

Dinamik sensörler

Sensors Multi-HAL 2.0, dinamik sensör bağlantıları değiştiğinde IHalProxyCallback onDynamicSensorsConnected ve onDynamicSensorsDisconnected öğelerinin çağrılmasını gerektirir. Bu geri aramalar, initialize() işlevi aracılığıyla sağlanan IHalProxyCallback işaretçisinin bir parçası olarak kullanılabilir.

HAL 1.0 Sensörlerden Bağlantı Noktası

Sensors HAL 1.0'dan Sensors Multi-HAL 2.0'a yükseltme yaparken, HAL uygulamasının aşağıdaki gereksinimleri karşıladığından emin olun.

HAL'yi başlat

Alt HAL ile Multi-HAL uygulaması arasında geri aramayı kurmak için initialize() işlevinin desteklenmesi gerekir.

Mevcut sensörleri açığa çıkarın

Sensors Multi-HAL 2.0'da getSensorsList() işlevi, HAL sensörleri yeniden başlatılsa bile tek bir aygıt önyüklemesi sırasında aynı değeri döndürmelidir. Bu, sistem sunucusu yeniden başlatıldığında çerçevenin sensör bağlantılarını yeniden kurmaya çalışmasına olanak tanır. getSensorsList() tarafından döndürülen değer, aygıt yeniden başlatma gerçekleştirdikten sonra değişebilir.

Sensör olaylarını Multi-HAL uygulamasına gönderin

Sensors HAL 2.0'da, poll() öğesinin çağrılmasını beklemek yerine, alt HAL'in, sensör olayları mevcut olduğunda proaktif olarak sensör olaylarını IHalProxyCallback yazması gerekir.

WAKE_UP etkinlikleri

Sensors HAL 1.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. Sensors Multi-HAL 2.0'da alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrılarak bir uyanık kalma kilidinin alınmasını talep edebilir. Uyandırma olaylarını Multi-HAL uygulamasına gönderirken, kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents aktarılmalıdır.

Dinamik sensörler

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

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

Mevcut bir uygulamayı Sensors Multi-HAL 1.0'dan taşımak için aşağıdaki adımları izleyin.

  1. Sensörlerin HAL yapılandırmasının /vendor/etc/sensors/hals.conf. Bu, /system/etc/sensors/hals.conf konumunda bulunan dosyanın taşınmasını içerebilir.
  2. HAL 2.0 için desteklenmediklerinden hardware/hardware.h ve hardware/sensors.h yapılan tüm referansları kaldırın.
  3. Bağlantı noktası alt HAL'leri Sensörlerden Taşıma Hal 1.0'da açıklandığı gibidir.
  4. Sensors Multi-HAL 2.0'ı, Sensors Mutli-HAL 2.0'ın Uygulanması bölümündeki 3. ve 4. adımları izleyerek belirlenen HAL olarak ayarlayın.

Doğrulama

VTS'yi çalıştırın

Bir veya daha fazla alt HAL'i Sensors Multi-Hal 2.1 ile entegre ettiğinizde, alt HAL uygulamalarınızın Sensors HAL arayüzü tarafından belirlenen tüm gereksinimleri karşıladığından emin olmak için Satıcı Test Paketini (VTS) kullanın.

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

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

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

Birim testlerini çalıştır

HalProxy_test.cpp birim testleri, HalProxy birim testinde başlatılan ve dinamik olarak yüklenmeyen sahte alt HAL'leri kullanarak 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 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 edin

Sahte alt HAL'ler, ISensorsSubHal arayüzünün sahte uygulamalarıdır. Alt HAL'ler farklı sensör listelerini ortaya çıkarır. Sensörler etkinleştirildiğinde, belirli bir sensör isteğinde belirtilen aralıklara göre otomatik olarak oluşturulan sensör olaylarını periyodik olarak HalProxy gönderirler.

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

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

Sahte alt HAL'leri oluşturup bir cihaza göndermek için aşağıdaki adımları izleyin:

  1. Üç farklı sahte alt HAL oluşturmak ve cihaza 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. /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çevedeki hataları ayıklayabilir. Sensör HAL'sinin 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

HalProxy ve alt HAL'lerinin mevcut durumu hakkındaki bilgiler daha sonra terminale gönderilir. Aşağıda HalProxy nesnesi ve sahte alt HAL'ler için komut çıktısının bir örneği gösterilmektedir.

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ük bir sayıysa (1000 veya daha fazla), bu, sensör çerçevesine yazılmayı bekleyen birçok olay olduğunu gösterir. Bu, sensör hizmetinin kilitlendiğini veya kilitlendiğini ve sensör olaylarını işlemediğini ya da yakın zamanda bir alt HAL'den büyük miktarda sensör olayı gönderildiğini gösterir.

Uyandırma kilidi ref sayısı 0 büyükse bu, HalProxy bir uyanık kalma kilidi edindiği anlamına gelir. Bu yalnızca ScopedWakelock kasıtlı olarak tutuluyorsa veya uyandırma olayları HalProxy gönderilmişse ve sensör çerçevesi tarafından işlenmemişse 0 büyük olmalıdır.

HalProxy hata ayıklama yöntemine iletilen dosya tanımlayıcısı her bir alt HAL'ye aktarılır; böylece geliştiricilerin hata ayıklama yöntemini ISensorsSubHal arabiriminin bir parçası olarak uygulaması gerekir.