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 Çoklu HAL, tedarikçi bölümünde dinamik kitaplıklar olarak depolanan sensör alt HAL'lerini dinamik olarak yükler ve bunlara etkinlikleri yayınlama ve uyanma kilidini alma ve bırakma işlemlerini gerçekleştirebilecek bir geri çağırma nesnesi verir. 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.
Android 11 veya sonraki sürümleri çalıştıran cihazlarda kullanılabilen Sensors Multi-HAL 2.1, menteşe açısı sensör türünü gösterebilen 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.
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 ADL HAL Sensörleri ile Multi-HAL Sensörlerini Kullanma bölümüne bakın.
Sensors Multi-HAL 2 ile Sensors HAL 2 arasındaki fark
Android 10 veya sonraki sürümlerin yüklü olduğu cihazlarda kullanılabilen Sensors Multi-HAL 2, HAL API'leriyle etkileşimi kolaylaştırmak için Sensors HAL 2'nin üzerine çeşitli soyutlamalar ekler. 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ü, 2.1/ISensors.hal
(veya 2.0/ISensors.hal
) arayüzünden farklı yönleriyle ayrılı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'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. IHalProxyCallback
arayüzü, FMQ'ler yerine iki yöntem sunar: sensör etkinliklerini sensör çerçevesine yayınlamak için bir yöntem ve uyanma kilitleri oluşturmak için bir yöntem. Sensörler Çoklu HAL, tüm alt HAL'ler için sensör etkinliklerinin zamanında yayınlanmasını sağlamak amacıyla FMQ'lerle yapılan tüm etkileşimleri yönetir. Alt HAL'lerin, uyanık kalma kilitlerini zamanlama yükünü Sensörler Multi-HAL'ye devretmek ve kilitlenme ve kilit açma çağrılarını en aza indiren Sensör Multi-HAL'deki uyanık kalma kilidi kullanımını tek bir ortak uyanık kalma kilidinde merkezi hale getirmek için createScopedWakelock
yöntemini kullanması önemle tavsiye edilir.
Multi-HAL 2 sensöründe yerleşik güvenlik özellikleri de bulunur. Sensör FMQ'sinin dolu olduğu veya Android sensör çerçevesinin yeniden başlatıldığı ve sensör durumunun sıfırlanması gerektiği 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 kod ve referans uygulama
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 örneklendirilir ve alt HAL'lerden sensör çerçevesine veri iletimini işler.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'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.Ç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 veriler oluşturmak için sahte sensörler kullanılmaktadır. 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, Sensors Multi-HAL'in aşağıdaki durumlarda nasıl uygulanacağı açıklanmaktadır:
- Multi-HAL Sensörlerinin AIDL HAL Sensörleriyle Kullanımı
- Sensors Multi-HAL 2.1'i uygulama
- Sensors Multi-HAL 2.0'dan Multi-HAL 2.1'e taşıma
- Sensors HAL 2.0'dan taşıma
- Sensör 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 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 köprü katmanı, Sensörler Çoklu HAL 2.1'i uygulayan cihazlarla uyumludur.
AIDL çoklu HAL shim katmanı, baş takip cihazını ve sınırlı eksenli IMU sensör türlerini Sensors AIDL HAL'de göstermenize 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.
Sensörler Çoklu HAL 2.1'i 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'i oluşturmak için bir
cc_library_shared
hedefi ekleyin. Hedefi 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.android.hardware.sensors
girişlerini tümmanifest.xml
dosyasından kaldırın. Bu dosya, cihazda desteklenen HAL'lerin listesini içerir.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 Çoklu HAL 2.0'dan Çoklu HAL 2.1'e taşıma
Multi-HAL 2.0'dan Multi-HAL 2.1'e bağlantı kurmak 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 yerine yeni birIHalProxyCallback
iletiyor- 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'dan Sensors Multi-HAL 2.0'a yükseltme yaparken HAL uygulamanızın aşağıdaki koşulları karşıladığından emin olun.
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. 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
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. Sensors Multi-HAL 2.0'ta alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock
çağrılmasıyla uyanık kalma kilidinin alınmasını isteyebilir.
Çoklu HAL uygulamasına uyanma etkinlikleri gönderilirken kilitli kapsamlı bir uyanma kilidi edinilmeli ve postEvents
'e iletilmelidir.
Dinamik sensörler
Sensors Multi-HAL 2.0, dinamik sensör bağlantıları değiştiğinde IHalProxyCallback
içindeki onDynamicSensorsConnected
ve onDynamicSensorsDisconnected
işlevlerinin ç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örler HAL 1.0'dan bağlantı noktası
Sensors HAL 1.0'dan Sensors Multi-HAL 2.0'a yükseltme yaparken HAL uygulamanızın aşağıdaki koşulları 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ç
Sensors 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 çoklu HAL uygulamasına gönderme
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. Sensors Multi-HAL 2.0'ta alt HAL'ler, Multi-HAL uygulamasının uyanık kalma kilitlerini yönetmesine olanak tanır ve createScopedWakelock
çağrılmasıyla uyanık kalma kilidinin alınmasını isteyebilir.
Çoklu HAL uygulamasına uyanma etkinlikleri gönderilirken kilitli kapsamlı bir uyanma kilidi edinilmeli ve postEvents
'e iletilmelidir.
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.
Sensors Multi-HAL 1.0'dan taşıma
Mevcut bir uygulamayı Sensors Multi-HAL 1.0'dan taşımak için aşağıdaki adımları uygulayın.
- Sensörler 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
ile ilgili tüm referansları 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.
VTS bir ana makinede ayarlandığında 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 Ç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
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şturulurken 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 örnek 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şturulan sensör etkinliklerini düzenli aralıklarla HalProxy
'e gönderir.
Sahte alt HAL'ler, Multi-HAL kodunun tamamının 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'leri derleyip bir cihaza göndermek için aşağıdaki adımları uygulayın:
Üç farklı sahte alt HAL'i derleyip 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çevede hata 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
Ardından HalProxy
ve alt HAL'lerinin mevcut durumu 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ükse (1.000 veya daha fazla) sensör çerçevesine yazılmayı bekleyen çok sayıda etkinlik olduğunu gösterir. 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.
Uyandırma kilidi referans sayısı 0
'ten büyükse HalProxy
bir uyandırma kilidi edinmiştir. 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 alt HAL'e iletilir. Bu nedenle, geliştiricilerin hata ayıklama yöntemini ISensorsSubHal
arayüzünün bir parçası olarak uygulamaları gerekir.