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 birIHalProxyCallback
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ımlarHalProxy
ile uyumlu olmak için aşağıdaki adımları uygulayın. Alt HAL,HalProxyCallback
nesnesininpostEvents
vecreateScopedWakelock
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:
- Sensörler Çoklu HAL'ini Sensörler AIDL HAL ile kullanma
- Multi-HAL 2.1 Sensörlerini Uygulama
- Sensors Multi-HAL 2.0'dan Multi-HAL 2.1'e taşıma
- Sensors HAL 2.0'dan taşıma
- Sensors HAL 1.0'dan taşıma
- Sensörler Çoklu HAL 1.0'dan taşıma
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:
ISensorsSubHal
arayüzünüSubHal.h
bölümünde açıklandığı şekilde uygulayın.SubHal.h
içindesensorsHalGetSubHal_2_1
yöntemini uygulayın.Yeni uygulanan alt HAL'yi oluşturmak için bir
cc_library_shared
hedefi ekleyin. Hedef eklerken:- Hedefin tedarikçi firmada bir yere aktarıldığından emin olma bölümü.
/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çinhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
bölümüne bakın.Cihazda desteklenen HAL'lerin listesini içeren
manifest.xml
dosyasından tümandroid.hardware.sensors
girişlerini kaldırın.device.mk
dosyasından tümandroid.hardware.sensors
hizmeti veservice.rc
dosyalarını kaldırın veandroid.hardware.sensors@2.1-service.multihal
ileandroid.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.0SubHal
arayüzündeki yerine yeni birIHalProxyCallback
iletiyor- Sub-HAL'ler
getSensorsList_2_1
veinjectSensorData_2_1
uygulamalıdır yerinegetSensorsList
veinjectSensorData
yerineISensors.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çinsensorsHalGetSubHal
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.
- 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. - Şu sayfaya yapılan tüm referansları kaldırın:
hardware/hardware.h
vehardware/sensors.h
HAL 2.0 için desteklenmez. - 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.
- 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:
Üç 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
/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
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.