Çoklu HAL Sensörleri

Sensors Multi-HAL, sensör HAL'lerinin diğer sensör HAL'leriyle birlikte çalışmasına olanak tanıyan bir çerçevedir. Sensörler Multi-HAL, tedarikçi bölümünde dinamik kitaplıklar olarak depolanmış sensör alt HAL'leri dinamik olarak yükler. Ayrıca bunlara, yükleme etkinliklerini işleyebilen ve uyanık kalma kilidini alıp bırakabilen bir geri çağırma nesnesi sağlar. Sensör alt HAL'si, satıcı bölümündeki paylaşılan bir nesneye yerleştirilen ve çoklu HAL çerçevesi tarafından kullanılan bir sensör HAL'sidir. Bu alt HAL'ler birbirine veya işlemin ana işlevini içeren çoklu HAL koduna bağlı değildir.

Android 11 veya sonraki sürümleri çalıştıran cihazlarda kullanılabilen Multi-HAL 2.1 Sensörleri, menteşe açısı sensör türünü açığa çıkarabilecek alt HAL'lerin yüklenmesini destekleyen Multi-HAL 2.0 Sensörlerinin 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örleri kullanan ve Android 13 veya sonraki sürümleri çalıştıran cihazlarda çoklu HAL özelliğine olanak tanımak için çoklu HAL dolgu katmanını kullanabilirsiniz. Uygulama ayrıntıları için ADL HAL Sensörleri ile Multi-HAL Sensörlerini Kullanma bölümüne bakın.

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

Android 10 veya sonraki sürümleri çalıştıran cihazlarda kullanılabilen Multi-HAL 2 Sensörleri, HAL API'leriyle etkileşimde bulunmayı kolaylaştırmak için Sensors HAL 2'ye ek olarak çeşitli soyutlamalar sunar. Multi-HAL 2 Sensörleri, HalProxy alt HAL'lerle etkileşim kurmasına izin vermek için Sensör HAL 2 arayüzünü ve V2_1/SubHal (veya V2_0/SubHal) arayüzünü uygulamak üzere HalProxy sınıfını kullanıma sundu.

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

  • İlk kullanıma hazırlama yöntemi, iki FMQ ve ISensorsCallback yerine bir IHalProxyCallback sınıfı geçer.
  • Sub-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'nin diğer alt HAL'lerden ayırt edilebilmesi için Sub-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şlevleridir. IHalProxyCallback arayüzü, FMQ sağlamak yerine, sensör etkinliklerini sensör çerçevesine göndermek için bir yöntem ve uyanık kalma kilitleri oluşturmak için başka bir yöntem olmak üzere iki yöntem sağlar. Temel olarak Sensörler Multi-HAL, tüm alt HAL'ler için sensör etkinliklerinin zamanında iletilebilmesini sağlamak amacıyla FMQ'larla olan tüm etkileşimleri yönetir. Alt HAL'lerin, uyanık kalma kilitlerini zamanlama yükünü Sensörler Multi-HAL'ye yetkisi vermek ve uyanık kalma kilidi kullanımını Sensör Multi-HAL'in tamamı için tek bir ortak uyanık kalma kilidinde merkezileştirmek üzere createScopedWakelock yöntemini kullanması önemle tavsiye edilir. Böylece kilitlenme ve kilit açma çağrılarını en aza indirir.

Multi-HAL 2 sensöründe yerleşik güvenlik özellikleri de bulunur. Sensör FMQ'nun dolu olduğu veya Android sensör çerçevesinin yeniden başlatıldığı ve sensör durumunun sıfırlanması gereken durumları ele alır. Ayrıca, etkinlikler HalProxy sınıfına yayınlanır ancak sensör çerçevesi etkinlikleri hemen kabul edemezse Sensors Multi-HAL, etkinliklerin yayınlanmasını beklerken tüm alt HAL'lerde çalışmanın devam etmesini sağlamak için etkinlikleri bir arka plan iş parçacığına taşıyabilir.

Kaynak kodu ve referans uygulaması

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

  • HalProxy.h: HalProxy nesnesi, sensörler çoklu HAL tarafından örneklendirilir ve alt HAL'lerden sensör çerçevesine veri iletimini işler.
  • HalProxy.cpp: HalProxy uygulaması, alt HAL'ler ile sensör çerçevesi arasındaki Multiplex iletişim için gereken tüm mantığı içerir.
  • SubHal.h: ISensorsSubHal arayüzü, alt HAL'lerin HalProxy ile uyumlu olmak için izlemesi gereken arayüzü tanımlar. Sub-HAL, HalProxyCallback nesnesinin postEvents ve createScopedWakelock için kullanılabilmesini sağlamak amacıyla ilk kullanıma hazırlama yöntemini uygular.

    Multi-HAL 2.0 uygulamaları için SubHal.h'in 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 veriler oluşturmak için sahte sensörler kullanılmaktadır. 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ğıdaki durumlarda Multi-HAL Sensörlerinin 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 donanım/arayüzler/sensörler/aidl/default/multihal/ konumunda bulunan AIDL Multi-HAL dolgu katmanı modülünü içe aktarın. Modül, AIDL ve HIDL sensörlerinin HAL tanımı türleri arasındaki dönüşümü yönetir ve çoklu HAL 2.1 sensörünü uygulama bölümünde açıklanan çoklu HAL arayüzünün etrafında bir sarmalayıcı tanımlar. AIDL çoklu HAL dolgusu katmanı, Multi-HAL 2.1 Sensörlerinin kullanıldığı cihazlarla uyumludur.

AIDL çoklu HAL dolgu katmanı, AIDL HAL Sensörleri'ndeki baş 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ıda type alanını ayarlayın. AIDL ve HIDL sensörlerinin HAL tam sayı destekli sensör türü alanları çakışmadığı için bu yöntem güvenlidir.

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ü SubHal.h bölümünde açıklandığı şekilde uygulayın.
  2. SubHal.h ürününde 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, cihazın tedarikçi bölümündeki bir yere aktarıldığından emin olun.
    2. /vendor/etc/sensors/hals.conf konumundaki yapılandırma dosyasında, kitaplığın yolunu yeni bir satıra ekleyin. Gerekirse hals.conf dosyasını oluşturun.

    Alt HAL kitaplığı oluşturmayla ilgili ö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 android.hardware.sensors girişlerin tümünü kaldırın.

  5. Tüm android.hardware.sensors hizmetini ve service.rc dosyalarını device.mk dosyasından kaldırıp android.hardware.sensors@2.1-service.multihal ve android.hardware.sensors@2.1-service.multihal.rc dosyalarını PRODUCT_PACKAGES klasörüne ekleyin.

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

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ğlanmak için SubHal arayüzünü uygulayın ve 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 işlev yerine yeni bir IHalProxyCallback iletir
  • 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 uygulamalıdır.
  • Multi-HAL'nin, bunları sürüm 2.1 alt HAL'ler olarak işlemesi için Sub-HAL'lerin sensorsHalGetSubHal yerine sensorsHalGetSubHal_2_1 öğesini göstermesi gerekir.

Sensörlerden HAL 2.0 bağlantı noktası

Sensors HAL 2.0 Sensörleri Multi-HAL 2.0 sürümüne geçerken HAL uygulamasının aşağıdaki şartları karşıladığından emin olun.

HAL'yi başlatma

HAL 2.0 sensörleri, sensör hizmetinin FMQ'ları göndermesine ve bir dinamik sensör geri çağırmasına olanak tanıyan bir başlatma işlevine sahiptir. Sensörler Multi-HAL 2.0'da initialize() işlevi, sensör etkinliklerini yayınlamak, uyanık kalma kilitlerini elde etmek ve dinamik sensör bağlantısı ile bağlantı kesiklerini bildirmek için kullanılması gereken tek bir geri çağırma iletir.

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

Sub-HAL, sensör etkinliklerini FMQ üzerinden yayınlamak yerine, sensör etkinlikleri mevcut olduğunda sensör etkinliklerini IHalProxyCallback öğesine yazmalıdır.

WAKE_UP etkinlikleri

Sensörler HAL 2.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. Multi-HAL 2.0 Sensörleri'ndeki alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrısı yapılarak bir uyanık kalma kilidi edinilmesini isteyebilir. Uyandırma etkinlikleri Multi-HAL uygulamasına yayınlanırken kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents öğesine geçirilmelidir.

Dinamik sensörler

Multi-HAL 2.0 sensörleri, dinamik sensör bağlantıları her değiştiğinde IHalProxyCallback içindeki onDynamicSensorsConnected ve onDynamicSensorsDisconnected çağrılmasını gerektirir. Bu geri çağırma işlevleri, initialize() işleviyle sağlanan IHalProxyCallback işaretçisinin bir parçası olarak kullanılabilir.

Sensörlerden HAL 1.0 bağlantı noktası

Sensors HAL 1.0 Sensörleri Multi-HAL 2.0 sürümüne geçerken HAL uygulamasının aşağıdaki şartları karşıladığından emin olun.

HAL'yi başlatma

Alt HAL ile Multi-HAL uygulaması arasında geri çağırmanın yapılması için initialize() işlevi desteklenmelidir.

Kullanılabilir sensörleri kullanıma aç

Sensörler Multi-HAL 2.0'da getSensorsList() işlevi, tek bir cihaz önyüklemesi sırasında (HAL yeniden başlatılmış sensörler arasında bile) aynı değeri döndürmelidir. Bu sayede, sistem sunucusu yeniden başlatılırsa çerçevenin sensör bağlantılarını yeniden kurmayı denemesine olanak tanı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

Sensörler HAL 2.0'da, sub-HAL, poll() çağrılmasını beklemek yerine, sensör etkinlikleri mevcut olduğunda sensör etkinliklerini proaktif olarak IHalProxyCallback adresine yazmalıdır.

WAKE_UP etkinlikleri

Sensör HAL 1.0'da HAL, uygulanması için uyanık kalma kilidini yönetebilir. Multi-HAL 2.0 Sensörleri'ndeki alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock çağrısı yapılarak bir uyanık kalma kilidi edinilmesini isteyebilir. Uyandırma etkinlikleri Multi-HAL uygulamasına yayınlanırken kilitli kapsamlı bir uyanık kalma kilidi edinilmeli ve postEvents öğesine geçirilmelidir.

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örleri, dinamik sensör bağlantıları her değiştiğinde IHalProxyCallback içindeki onDynamicSensorsConnected ve onDynamicSensorsDisconnected çağrılmasını gerektirir. Bu geri çağırma işlevleri, initialize() işleviyle sağlanan IHalProxyCallback işaretçisinin bir parçası olarak kullanılabilir.

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

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

  1. Sensörlerin HAL yapılandırmasının /vendor/etc/sensors/hals.conf konumunda bulunduğundan emin olun. Bu işlem, /system/etc/sensors/hals.conf konumundaki dosyanın taşınmasını içerebilir.
  2. HAL 2.0 için desteklenmediğinden hardware/hardware.h ve hardware/sensors.h referanslarını kaldırın.
  3. Hal Sensörlerinden Taşıma bölümünde açıklandığı şekilde bağlantı noktası alt HAL'leridir.
  4. Mutli-HAL 2.0 Sensörlerini Uygulama bölümündeki 3 ve 4. adımları uygulayarak Sensörler Multi-HAL 2.0'ı atanmış HAL olarak ayarlayın.

Doğrulama

VTS'yi çalıştır

Bir veya daha fazla alt HAL'yi Sensors Multi-Hal 2.1 ile entegre ettiğinizde alt HAL uygulamalarınızın, Sensör HAL arayüzünde belirlenen tüm gereksinimleri karşıladığından emin olmak için Tedarikçi Firma Test Paketi (VTS)'yi kullanın.

Bir ana makinede VTS kurulduğunda yalnızca VTS'nin test ettiği sensörleri çalıştırmak için aşağıdaki komutları çalıştırı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

HalProxy_test.cpp işlevindeki birim testleri, HalProxy için birim testinde örneklenen ve dinamik olarak yüklenmeyen sahte alt HAL'ler kullanır. Yeni bir alt HAL oluştururken bu testler, yeni alt HAL'nin doğru şekilde uygulandığını doğrulayan birim testlerinin nasıl ekleneceği konusunda bir rehber işlevi görür.

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şturulmuş sensör etkinliklerini düzenli aralıklarla HalProxy üzerinde yayınlar.

Sahte alt HAL'ler, Multi-HAL kodunun sisteme yüklenmiş diğer alt HAL'lerle nasıl çalıştığını test etmek ve Multi-HAL Sensörlerinin ç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'ler oluşturup bir cihaza aktarmak için aşağıdaki adımları uygulayın:

  1. Üç farklı sahte alt HAL oluşturup 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ö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 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. Sensör HAL'sinin hata ayıklama çıkışı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

Daha sonra HalProxy öğesinin mevcut durumu ve alt HAL'leriyle ilgili bilgiler terminale gönderilir. Aşağıda, HalProxy nesnesi ve sahte alt HAL'ler için komut çıkışı ö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 (1.000 veya daha fazla) bu, sensör çerçevesine yazılmayı bekleyen çok sayıda etkinlik olduğu anlamına gelir. Bu uyarı, sensör hizmetinin kilitlendiğini veya kilitlendiğini ve sensör etkinliklerini işlemediğini ya da kısa süre önce bir alt HAL'den çok sayıda sensör etkinliğinin yayınlandığını belirtir.

Uyanık kalma kilidi referans sayısının 0 değerinden büyük olması, HalProxy ürününün bir uyanık kalma kilidi edindiği anlamına gelir. Bu değer, yalnızca bir ScopedWakelock kasıtlı olarak tutulduysa veya uyandırma etkinlikleri HalProxy ürününe gönderildiyse ve sensör çerçevesi tarafından işlenmediyse 0 değerinden büyük olmalıdır.

HalProxy hata ayıklama yöntemine iletilen dosya tanımlayıcısı, her bir alt HAL'ye iletilir. Böylece geliştiriciler, hata ayıklama yöntemini ISensorsSubHal arayüzünün bir parçası olarak uygulamalıdır.