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, tedarikçi bölümünde dinamik kitaplıklar olarak depolanan sensör alt HAL'lerini dinamik olarak yükler ve bunlara, etkinlik yayınlamayı, uyandırma kilidini edinmeyi ve serbest bırakmayı işleyebilen bir geri çağırma nesnesi verir. Sensörler alt HAL'si, satıcı bölümündeki paylaşılan bir nesneye yerleştirilmiş ve çoklu HAL çerçevesi tarafından kullanılan bir sensörler HAL'sidir. 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ü ortaya çıkarabilen alt HAL'lerin yüklenmesini destekleyen Sensors Multi-HAL 2.0'ın bir sürümüdür. Bu sensör türünü desteklemek için alt HAL'ler, 2.1 SubHal başlığında tanımlanan alt HAL API'lerini kullanmalıdır.
Sensors AIDL HAL'ı kullanan Android 13 veya sonraki sürümlerin yüklü olduğu cihazlarda, çoklu HAL özelliğine izin vermek için çoklu HAL ara katmanını kullanabilirsiniz. Uygulama ayrıntıları için Sensors AIDL HAL ile Sensors Multi-HAL'ı kullanma başlıklı makaleye bakın.
Sensors Multi-HAL 2 ile Sensors HAL 2 arasındaki fark
Android 10 veya sonraki sürümleri çalıştıran cihazlarda kullanılabilen Sensors Multi-HAL 2, HAL API'leriyle etkileşimi kolaylaştırmak için Sensors HAL 2'nin üzerinde çeşitli soyutlamalar sunar. Sensors Multi-HAL 2, Sensors HAL 2 arayüzünün uygulanmasını işlemek için HalProxy sınıfını ve HalProxy
'ın alt HAL'lerle etkileşim kurmasına izin vermek için V2_1/SubHal
(veya V2_0/SubHal
) arayüzünü sunar.
ISensorsSubHal
arayüzü, 2.1/ISensors.hal
(veya 2.0/ISensors.hal
) arayüzünden şu yönleriyle farklıdır:
- Başlatma yöntemi, iki FMQ ve
ISensorsCallback
yerineIHalProxyCallback
sınıfını geçirir. - Alt HAL'ler, hata raporlarında hata ayıklama bilgileri sağlamak için bir hata ayıklama işlevi uygulamalıdır.
- Alt HAL'ler, yüklenen alt HAL'in diğer alt HAL'lerden ayırt edilebilmesi için bir ad işlevi uygulamalıdır.
Sensors Multi-HAL 2 ile Sensors HAL 2 arasındaki temel fark, başlatma işlevlerindedir. IHalProxyCallback
Arayüz, FMQ'lar sağlamak yerine iki yöntem sunar: biri sensör etkinliklerini sensörler çerçevesine göndermek, diğeri ise uyandırma kilitleri oluşturmak için. Arka planda, Sensors Multi-HAL, tüm alt HAL'ler için sensör etkinliklerinin zamanında teslim edilmesini sağlamak amacıyla FMQ'larla olan tüm etkileşimleri yönetir. Alt HAL'lerin, uyandırma kilitlerinin zaman aşımı yükünü Sensors Multi-HAL'e devretmek ve uyandırma kilidi kullanımını tüm Sensors Multi-HAL için tek bir ortak uyandırma kilidinde merkezileştirmek üzere createScopedWakelock
yöntemini kullanması önemle tavsiye edilir. Bu şekilde, kilitleme ve kilit açma çağrıları en aza indirilir.
Sensors Multi-HAL 2'de 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ı gerektiği durumları ele alır. Ayrıca, etkinlikler HalProxy
sınıfına gönderildiğinde ancak sensör çerçevesi etkinlikleri hemen kabul edemediğinde, etkinliklerin yayınlanması beklenirken tüm alt HAL'lerde çalışmaya devam edilebilmesi için Sensors Multi-HAL, etkinlikleri arka plan iş parçacığına taşıyabilir.
Kaynak kodu ve referans uygulama
Tüm Sensors Multi-HAL kodu, hardware/interfaces/sensors/common/default/2.X/multihal/
adresinde mevcuttur.
Bazı kaynaklara ilişkin ipuçlarını aşağıda bulabilirsiniz.
HalProxy.h
:HalProxy
nesnesi, Sensors multi-HAL tarafından oluşturulur ve verilerin alt HAL'lerden sensör çerçevesine aktarılmasını sağlar.HalProxy.cpp
:HalProxy
uygulaması, alt HAL'ler ve sensör çerçevesi arasındaki iletişimi çoklamaya yönelik tüm mantığı içerir.SubHal.h
:ISensorsSubHal
arayüzü, alt HAL'lerinHalProxy
ile uyumlu olması için uyması gereken arayüzü tanımlar. Alt HAL,HalProxyCallback
nesnesininpostEvents
vecreateScopedWakelock
için kullanılabilmesi amacıyla initialize yöntemini uygular.Multi-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 ö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, aşağıdaki durumlarda Sensörler Multi-HAL'nin nasıl uygulanacağı açıklanmaktadır:
- Sensörler AIDL HAL ile Sensörler Multi-HAL'i kullanma
- 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
- Sensors HAL 1.0'dan taşıma
- Sensors Multi-HAL 1.0'dan taşıma
Sensörler AIDL HAL ile Sensörler Multi-HAL'ı kullanma
Sensörler AIDL HAL ile çoklu HAL özelliğine izin vermek için hardware/interfaces/sensors/aidl/default/multihal/ konumunda bulunan AIDL Multi-HAL ara 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ü işler ve Implementing Sensors Multi-HAL 2.1'de açıklanan çoklu HAL arayüzü etrafında bir sarmalayıcı tanımlar. AIDL multi-HAL shim katmanı, Sensors Multi-HAL 2.1'i uygulayan cihazlarla uyumludur.
AIDL çoklu HAL ara katmanı, baş takip cihazını ve sınırlı eksenli IMU sensör türlerini Sensors AIDL HAL'de kullanıma sunmanı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. AIDL ve HIDL sensörleri HAL'sinin tam sayı destekli sensör türü alanları çakışmadığı için bu işlem güvenlidir.
Sensörler Multi-HAL 2.1'i uygulama
Yeni bir cihazda Sensors Multi-HAL 2.1'i uygulamak için aşağıdaki adımları uygulayın:
ISensorsSubHal
arayüzünüSubHal.h
'de açıklandığı şekilde uygulayın.SubHal.h
içindesensorsHalGetSubHal_2_1
yöntemini uygulayın.Yeni uygulanan alt HAL'yi oluşturmak için
cc_library_shared
hedefi ekleyin. Hedefi eklerken:- Hedefin, cihazın satıcı bölümünde bir yere gönderildiğinden 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 bir örnek
Android.bp
girişi içinhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
konusuna bakın.Cihazda desteklenen HAL'lerin listesini içeren
manifest.xml
dosyasından tümandroid.hardware.sensors
girişlerini kaldırın.android.hardware.sensors
hizmeti veservice.rc
dosyalarının tümü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
dosyasına ekleyin.
Başlatma sırasında HalProxy
başlar, yeni uygulanan alt HAL'yi arar ve sensorsHalGetSubHal_2_1
'yi çağırarak başlatır.
Sensors Multi-HAL 2.0'dan Multi-HAL 2.1'e taşıma
Multi-HAL 2.0'dan Multi-HAL 2.1'e geçmek 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
iletir.- Alt HAL'ler,
getSensorsList
veinjectSensorData
yerinegetSensorsList_2_1
veinjectSensorData_2_1
yöntemlerini uygulamalıdır. Çünkü bu yöntemler,ISensors.hal
spesifikasyonunun 2.1 sürümünde eklenen yeni türleri kullanır. - Multi-HAL'in bunları 2.1 sürümü alt HAL'leri olarak değerlendirmesi için alt HAL'ler
sensorsHalGetSubHal
yerinesensorsHalGetSubHal_2_1
değerini göstermelidir.
Sensörler HAL 2.0'dan bağlantı noktası
Sensors HAL 2.0'dan Sensors Multi-HAL 2.0'a yükseltirken HAL uygulamasının aşağıdaki koşulları karşıladığından emin olun.
HAL'yi başlatma
Sensors HAL 2.0, sensör hizmetinin FMQ'ları ve dinamik sensör geri çağırmasını iletmesine olanak tanıyan bir başlatma işlevine sahiptir. Sensors Multi-HAL 2.0'da initialize()
işlevi, sensör etkinliklerini yayınlamak, uyandırma kilitleri almak ve dinamik sensör bağlantısı ile bağlantı kesilmeleri hakkında bildirimde bulunmak için kullanılması gereken tek bir geri çağırma iletir.
Sensör etkinliklerini Multi-HAL uygulamasına gönderme
Alt HAL, sensör etkinliklerini FMQ üzerinden yayınlamak yerine, sensör etkinlikleri kullanılabilir olduğunda IHalProxyCallback
konumuna yazmalıdır.
WAKE_UP etkinlikleri
Sensors HAL 2.0'da HAL, uygulaması için uyandırma 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 uyanık kalma kilidi alınmasını isteyebilir.
Çoklu HAL uygulamasına uyandırma etkinlikleri gönderilirken kilitli kapsamlı uyandırma kilidi alınmalı ve postEvents
'ya 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
öğelerinin çağrılmasını gerektirir. Bu geri çağırmalar, initialize()
işlevi aracılığıyla sağlanan IHalProxyCallback
işaretçisinin bir parçası olarak kullanılabilir.
Sensors HAL 1.0'dan taşıma
Sensors HAL 1.0'dan Sensors Multi-HAL 2.0'a yükseltirken HAL uygulamasının aşağıdaki koşulları karşıladığından emin olun.
HAL'yi başlatma
Alt HAL ile Çoklu HAL uygulaması arasında geri çağırma oluşturmak için initialize()
işlevi desteklenmelidir.
Kullanılabilir sensörleri kullanıma sunma
Sensors Multi-HAL 2.0'da getSensorsList()
işlevi, tek bir cihaz başlatma işlemi sırasında, sensörler HAL yeniden başlatılsa bile aynı değeri döndürmelidir. Bu, 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ına gönderme
Sensors HAL 2.0'da, poll()
çağrılmasını beklemek yerine, alt HAL, sensör etkinlikleri kullanılabilir olduğunda sensör etkinliklerini proaktif olarak IHalProxyCallback
'ye yazmalıdır.
WAKE_UP etkinlikleri
Sensörler HAL 1.0'da HAL, kendi uygulaması için uyandırma 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 uyanık kalma kilidi alınmasını isteyebilir.
Çoklu HAL uygulamasına uyandırma etkinlikleri gönderilirken kilitli kapsamlı uyandırma kilidi alınmalı ve postEvents
'ya iletilmelidir.
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
içindeki onDynamicSensorsConnected
ve onDynamicSensorsDisconnected
öğelerinin çağrılmasını gerektirir. Bu geri çağırmalar, initialize()
işlevi aracılığıyla 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ı gerektirebilir. - HAL 2.0'da desteklenmediğinden
hardware/hardware.h
vehardware/sensors.h
ile ilgili tüm referansları kaldırın. - Porting from Sensors Hal 1.0 bölümünde açıklandığı şekilde alt HAL'leri taşıyın.
- Sensors Multi-HAL 2.0'ı uygulama bölümündeki 3. ve 4. adımları uygulayarak Sensors Multi-HAL 2.0'ı belirlenmiş HAL olarak ayarlayın.
Doğrulama
VTS'yi çalıştırma
Bir veya daha fazla alt HAL'yi Sensors Multi-Hal 2.1 ile entegre ettiğinizde, alt HAL uygulamalarınızın Sensors HAL arayüzü tarafından belirlenen tüm koşulları karşıladığından emin olmak için Vendor Test Suite (VTS)'i kullanın.
VTS bir ana makineye kurulduğunda yalnızca sensörler 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 ara 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 testlerini çalıştırma
HalProxy_test.cpp
testindeki birim testleri, birim testinde oluşturulan ve dinamik olarak yüklenmeyen sahte alt HAL'ler kullanılarak HalProxy
test edilir. 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 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 etme
Sahte alt HAL'ler, ISensorsSubHal
arayüzünün sahte uygulamalarıdır.
Alt HAL'ler, farklı sensör listeleri sunar. Sensörler etkinleştirildiğinde, belirli bir sensör isteğinde belirtilen aralıklara göre HalProxy
'ya otomatik olarak oluşturulmuş sensör etkinlikleri düzenli aralıklarla gönderilir.
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örler Multi-HAL kodunun çeşitli yönlerini zorlamak için kullanılabilir.
İki sahte alt HAL, hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
adresinde kullanılabilir.
Sahte alt HAL'leri oluşturup bir cihaza göndermek için aşağıdaki adımları uygulayın:
Üç farklı sahte alt HAL'yi 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
konumundaki sensörler 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ıklayabilir. Sensors HAL'ın 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'leri hakkında mevcut durum bilgileri terminale gönderilir. Aşağıda, HalProxy
nesnesi ve sahte alt HAL'ler için komut çıkışı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ükse (1.000 veya daha fazla) bu, sensörler çerçevesine yazılmayı bekleyen birçok etkinlik olduğunu gösterir. Bu, sensör hizmetinin kilitlendiğini veya çöktüğünü ve sensör etkinliklerini işlemediğini ya da yakın zamanda bir alt HAL'den büyük bir sensör etkinliği grubunun gönderildiğini gösterir.
Uyanık kalma kilidi referans sayısı 0
değerinden büyükse bu, HalProxy
öğesinin uyanık kalma kilidi aldığı anlamına gelir. Bu değer yalnızca ScopedWakelock
kasıtlı olarak tutuluyorsa veya HalProxy
'ye uyandırma etkinlikleri gönderildiyse ve bunlar 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'ye iletilir. Bu nedenle geliştiriciler, hata ayıklama yöntemini ISensorsSubHal
arayüzünün bir parçası olarak uygulamalıdır.