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 birIHalProxyCallback
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'lerinHalProxy
ile uyumlu olmak için izlemesi gereken arayüzü tanımlar. Sub-HAL,HalProxyCallback
nesnesininpostEvents
vecreateScopedWakelock
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:
- Multi-HAL Sensörlerinin AIDL HAL Sensörleriyle Kullanımı
- Multi-HAL 2.1 Sensörlerini Uygulama
- Sensörler Multi-HAL 2.0'dan Multi-HAL 2.1'e Bağlantı Kurma
- Sensör HAL 2.0'dan Taşıma
- Sensör HAL 1.0'dan Taşıma
- Sensörlerden Multi-HAL 1.0'dan Bağlantı Oluşturma
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:
ISensorsSubHal
arayüzünüSubHal.h
bölümünde açıklandığı şekilde uygulayın.SubHal.h
ürünündesensorsHalGetSubHal_2_1
yöntemini uygulayın.Yeni uygulanan alt HAL'yi oluşturmak için bir
cc_library_shared
hedefi ekleyin. Hedef eklerken:- Hedefin, cihazın tedarikçi bölümündeki bir yere aktarıldığından emin olun.
/vendor/etc/sensors/hals.conf
konumundaki yapılandırma dosyasında, kitaplığın yolunu yeni bir satıra ekleyin. Gerekirsehals.conf
dosyasını oluşturun.
Alt HAL kitaplığı oluşturmayla ilgili ö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ındanandroid.hardware.sensors
girişlerin tümünü kaldırın.Tüm
android.hardware.sensors
hizmetini veservice.rc
dosyalarınıdevice.mk
dosyasından kaldırıpandroid.hardware.sensors@2.1-service.multihal
veandroid.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.0SubHal
arayüzündeki işlev yerine yeni birIHalProxyCallback
iletir- Bu yöntemler
ISensors.hal
spesifikasyonunun 2.1 sürümünde eklenen yeni türleri kullandığından, alt HAL'lergetSensorsList
veinjectSensorData
yerinegetSensorsList_2_1
veinjectSensorData_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
yerinesensorsHalGetSubHal_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.
- 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. - HAL 2.0 için desteklenmediğinden
hardware/hardware.h
vehardware/sensors.h
referanslarını kaldırın. - Hal Sensörlerinden Taşıma bölümünde açıklandığı şekilde bağlantı noktası alt HAL'leridir.
- 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:
Üç 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
/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
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.