Multi-HAL Sensor adalah framework yang memungkinkan HAL sensor berjalan bersama HAL sensor lainnya. Multi-HAL Sensor secara dinamis memuat sub-HAL sensor yang disimpan sebagai library dinamis di partisi vendor dan memberinya objek callback yang dapat menangani peristiwa postingan serta memperoleh dan melepaskan kunci layar aktif. Sub-HAL sensor adalah HAL sensor yang di-build ke dalam objek bersama di partisi vendor dan digunakan oleh framework multi-HAL. Sub-HAL ini tidak bergantung satu sama lain atau pada kode multi-HAL yang berisi fungsi utama untuk proses.
Sensor Multi-HAL 2.1, tersedia di perangkat yang menjalankan Android 11 atau lebih tinggi, adalah iterasi Sensor Multi-HAL 2.0 yang mendukung pemuatan sub-HAL yang dapat mengekspos sudut engsel jenis sensor. Untuk mendukung jenis sensor ini, sub-HAL harus menggunakan sub-HAL API yang ditentukan dalam header SubHal 2.1.
Untuk perangkat yang menjalankan Android 13 atau yang lebih tinggi yang menggunakan Sensors AIDL HAL, Anda dapat menggunakan lapisan shim multi-HAL untuk mengizinkan kemampuan multi-HAL. Untuk mengetahui detail implementasinya, lihat Menggunakan Sensor Multi-HAL dengan Sensor AIDL HAL.
Perbedaan antara Sensors Multi-HAL 2 dan Sensors HAL 2
Sensors Multi-HAL 2, yang tersedia di perangkat yang menjalankan Android
10 atau yang lebih tinggi,
memperkenalkan beberapa abstraksi di atas Sensors HAL
2 untuk mempermudah
interaksi dengan HAL API. Multi-HAL 2 Sensor memperkenalkan class
HalProxy
untuk menangani penerapan antarmuka Sensors HAL 2 dan
antarmuka
V2_1/SubHal
(atau
V2_0/SubHal
)
agar HalProxy
dapat berinteraksi dengan sub-HAL.
Antarmuka ISensorsSubHal
berbeda dengan antarmuka
2.1/ISensors.hal
(atau
2.0/ISensors.hal
)
dengan cara berikut:
- Metode inisialisasi meneruskan
IHalProxyCallback
bukan dua FMQ danISensorsCallback
. - Sub-HAL harus menerapkan fungsi debug untuk menyediakan proses debug tambahan dalam laporan bug.
- Sub-HAL harus mengimplementasikan fungsi nama sehingga sub-HAL yang dimuat dapat dibedakan dari sub-HAL lainnya.
Perbedaan utama antara Sensors Multi-HAL 2 dan Sensors HAL 2 terletak pada
fungsi inisialisasi. Sebagai ganti menyediakan FMQ, antarmuka
IHalProxyCallback
menyediakan dua metode, satu metode untuk memposting peristiwa sensor ke framework
sensor dan satu metode untuk membuat wake lock. Di balik layar, Sensor
Multi-HAL mengelola semua interaksi dengan FMQ untuk memastikan pengiriman
kejadian sensor untuk semua sub-HAL. Sangat disarankan agar sub-HAL menggunakan
Metode createScopedWakelock
untuk mendelegasikan beban waktu habis penguncian layar saat aktif ke
Sensor Multi-HAL dan untuk memusatkan penggunaan penguncian layar saat aktif ke satu penguncian layar saat aktif yang umum
untuk seluruh Sensors Multi-HAL, yang meminimalkan panggilan penguncian dan pembukaan kunci.
Sensor Multi-HAL 2 juga memiliki beberapa fitur keselamatan bawaan. Ia menangani
situasi saat FMQ sensor penuh atau saat framework sensor Android
dimulai ulang dan status sensor perlu direset. Selain itu, saat peristiwa
diposting ke class HalProxy
, tetapi framework sensor tidak dapat langsung menerima
peristiwa, Multi-HAL Sensor dapat memindahkan peristiwa ke thread
latar belakang untuk memungkinkan pekerjaan berlanjut di semua sub-HAL sambil menunggu
peristiwa diposting.
Penerapan kode sumber dan referensi
Semua kode Multi-HAL Sensor tersedia di
hardware/interfaces/sensors/common/default/2.X/multihal/
.
Berikut adalah petunjuk untuk beberapa resource.
HalProxy.h
: ObjekHalProxy
dibuat instance-nya oleh Sensor multi-HAL dan menangani meneruskan data dari sub-HAL ke kerangka kerja sensor.HalProxy.cpp
: ImplementasiHalProxy
berisi semua logika yang diperlukan untuk komunikasi multipleks antara sub-HAL dan kerangka kerja sensor.SubHal.h
: AntarmukaISensorsSubHal
menentukan antarmuka yang harus sub-HAL ikuti agar kompatibel denganHalProxy
. Sub-HAL menerapkan inisialisasi metode agar objekHalProxyCallback
dapat digunakan untukpostEvents
dancreateScopedWakelock
.Untuk implementasi Multi-HAL 2.0, gunakan
SubHal.h
versi 2.0.hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Pengujian unit ini memverifikasi implementasiHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: Contoh penerapan sub-HAL ini menggunakan sensor palsu untuk menghasilkan data palsu. Berguna untuk menguji bagaimana beberapa sub-HAL berinteraksi pada perangkat.
Implementasi
Bagian ini menjelaskan cara menerapkan Multi-HAL Sensor dalam situasi berikut:
- Menggunakan Sensor Multi-HAL dengan Sensor AIDL HAL
- Mengimplementasikan Sensor Multi-HAL 2.1
- Mentransfer dari Multi-HAL 2.0 Sensor ke Multi-HAL 2.1
- Porting dari Sensors HAL 2.0
- Porting dari Sensors HAL 1.0
- Penautan dari Multi-HAL Sensor 1.0
Menggunakan Multi-HAL Sensor dengan HAL AIDL Sensor
Untuk memungkinkan kemampuan multi-HAL dengan Sensors AIDL HAL, impor AIDL Modul lapisan shim multi-HAL, yang ditemukan di hardware/interfaces/sensors/aidl/default/multihal/. Modul ini menangani konversi antara jenis definisi HAL sensor AIDL dan HIDL serta menentukan wrapper di sekitar antarmuka multi-HAL yang dijelaskan dalam Mengimplementasikan Multi-HAL Sensor 2.1. Multi-HAL AIDL lapisan shim kompatibel dengan perangkat yang menerapkan Sensor Multi-HAL 2.1.
Lapisan shim multi-HAL AIDL memungkinkan Anda mengekspos pelacak kepala dan
jenis sensor IMU sumbu terbatas di Sensors AIDL HAL. Untuk menggunakan sensor ini
yang ditentukan oleh antarmuka AIDL HAL, tetapkan kolom type
di
Struktur SensorInfo
dalam implementasi getSensorsList_2_1()
. Hal ini aman
karena kolom jenis sensor yang didukung bilangan bulat dari HAL sensor AIDL dan HIDL
tidak tumpang-tindih.
Mengimplementasikan Multi-HAL Sensor 2.1
Untuk menerapkan Sensor Multi-HAL 2.1 pada perangkat baru, ikuti langkah-langkah berikut:
- Terapkan antarmuka
ISensorsSubHal
seperti yang dijelaskan dalamSubHal.h
. - Terapkan metode
sensorsHalGetSubHal_2_1
diSubHal.h
. Tambahkan target
cc_library_shared
untuk membangun sub-HAL yang baru diimplementasikan. Saat menambahkan target:- Pastikan target didorong ke suatu tempat di partisi vendor perangkat.
- Dalam file konfigurasi yang terletak di
/vendor/etc/sensors/hals.conf
, menambahkan jalur ke library pada baris baru. Jika perlu, buat filehals.conf
.
Untuk contoh entri
Android.bp
untuk mem-build library sub-HAL, lihathardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
.Hapus semua
android.hardware.sensors
entri darimanifest.xml
, yang berisi daftar HAL yang didukung pada perangkat.Hapus semua layanan
android.hardware.sensors
dan fileservice.rc
dari filedevice.mk
dan tambahkanandroid.hardware.sensors@2.1-service.multihal
danandroid.hardware.sensors@2.1-service.multihal.rc
kePRODUCT_PACKAGES
.
Saat booting, HalProxy
dimulai, mencari sub-HAL yang baru diimplementasikan, dan
menginisialisasinya dengan memanggil
sensorsHalGetSubHal_2_1
.
Port dari Sensors Multi-HAL 2.0 ke Multi-HAL 2.1
Untuk melakukan port dari Multi-HAL 2.0 ke Multi-HAL 2.1, terapkan
antarmuka
SubHal
dan kompilasi ulang sub-HAL Anda.
Berikut adalah perbedaan antara antarmuka SubHal
2.0 dan 2.1:
IHalProxyCallback
menggunakan jenis yang dibuat dalam spesifikasiISensors.hal
versi 2.1.- Fungsi
initialize()
meneruskanIHalProxyCallback
bukan yang berasal dari antarmukaSubHal
2.0 - Sub-HAL harus mengimplementasikan
getSensorsList_2_1
daninjectSensorData_2_1
bukangetSensorsList
daninjectSensorData
karena metode ini menggunakan jenis baru yang ditambahkan dalam spesifikasiISensors.hal
versi 2.1. - Sub-HAL harus mengekspos
sensorsHalGetSubHal_2_1
, bukansensorsHalGetSubHal
agar Multi-HAL memperlakukannya sebagai sub-HAL versi 2.1.
Port dari Sensors HAL 2.0
Saat mengupgrade ke Sensors Multi-HAL 2.0 dari Sensors HAL 2.0, memastikan HAL penerapan memenuhi persyaratan berikut.
Melakukan inisialisasi HAL
Sensors HAL 2.0 memiliki fungsi inisialisasi yang memungkinkan layanan sensor
meneruskan FMQ dan callback sensor dinamis. Di Sensors Multi-HAL 2.0, fungsi
initialize()
meneruskan satu callback yang harus digunakan untuk memposting
peristiwa sensor, mendapatkan wake lock, dan memberi tahu koneksi dan
pemutusan koneksi sensor dinamis.
Memposting peristiwa sensor ke implementasi Multi-HAL
Daripada memposting peristiwa sensor melalui FMQ, sub-HAL harus menulis peristiwa
sensor ke
IHalProxyCallback
saat peristiwa sensor tersedia.
Peristiwa WAKE_UP
Di Sensor HAL 2.0, HAL dapat mengelola penguncian layar saat aktif untuk implementasinya. Di
Sensors Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL untuk
mengelola kunci layar aktif dan dapat meminta kunci layar aktif untuk diperoleh dengan memanggil
createScopedWakelock
.
Penguncian layar saat aktif cakupan yang dikunci harus diperoleh dan diteruskan ke postEvents
saat
memposting peristiwa bangun ke implementasi Multi-HAL.
Sensor dinamis
Sensor Multi-HAL 2.0 memerlukan onDynamicSensorsConnected
dan
onDynamicSensorsDisconnected
inci
IHalProxyCallback
akan dipanggil setiap kali koneksi sensor dinamis berubah. Callback ini
tersedia sebagai bagian dari pointer IHalProxyCallback
yang disediakan melalui
fungsi initialize()
.
Port dari Sensors HAL 1.0
Saat mengupgrade ke Sensors Multi-HAL 2.0 dari Sensors HAL 1.0, memastikan HAL penerapan memenuhi persyaratan berikut.
Melakukan inisialisasi HAL
Fungsi initialize()
harus didukung untuk membuat callback di antara
sub-HAL dan implementasi
Multi-HAL.
Ekspos sensor yang tersedia
Dalam Sensor Multi-HAL 2.0, fungsi getSensorsList()
harus menampilkan nilai yang sama
selama {i>booting<i} perangkat tunggal, bahkan
di seluruh sensor HAL dimulai ulang. Hal ini memungkinkan
framework mencoba membangun kembali koneksi sensor jika server sistem
dimulai ulang. Nilai yang ditampilkan oleh getSensorsList()
dapat berubah setelah perangkat
akan melakukan {i>reboot<i}.
Memposting peristiwa sensor ke implementasi Multi-HAL
Di Sensors HAL 2.0, sub-HAL
harus secara proaktif menulis peristiwa sensor ke
IHalProxyCallback
setiap kali peristiwa sensor tersedia, bukan menunggu poll()
dipanggil.
Peristiwa WAKE_UP
Di Sensor HAL 1.0, HAL dapat mengelola penguncian layar saat aktif untuk implementasinya. Di beberapa
Sensor Multi-HAL 2.0, sub-HAL
memungkinkan implementasi Multi-HAL untuk
mengelola penguncian layar saat aktif dan dapat meminta penguncian layar saat aktif agar diperoleh dengan memanggil
createScopedWakelock
Penguncian layar saat aktif cakupan yang dikunci harus diperoleh dan diteruskan ke postEvents
saat
memposting peristiwa bangun ke implementasi Multi-HAL.
Sensor dinamis
Pada Sensor HAL 1.0, sensor dinamis ditampilkan melalui fungsi poll()
.
Sensors Multi-HAL 2.0 mengharuskan onDynamicSensorsConnected
dan
onDynamicSensorsDisconnected
di
IHalProxyCallback
dipanggil setiap kali koneksi sensor dinamis berubah. Callback ini
tersedia sebagai bagian dari pointer IHalProxyCallback
yang disediakan melalui
fungsi initialize()
.
Port dari Sensors Multi-HAL 1.0
Untuk mem-port implementasi yang ada dari Sensors Multi-HAL 1.0, ikuti langkah-langkah berikut.
- Pastikan konfigurasi HAL sensor terletak di
/vendor/etc/sensors/hals.conf
. Proses ini mungkin melibatkan pemindahan file yang terletak pukul/system/etc/sensors/hals.conf
. - Hapus semua referensi ke
hardware/hardware.h
danhardware/sensors.h
karena tidak didukung untuk HAL 2.0. - Sub-HAL port seperti yang dijelaskan dalam Transfer dari Hal Sensor 1,0.
- Atur Sensor Multi-HAL 2.0 sebagai HAL yang ditunjuk dengan mengikuti langkah 3 dan 4 di bagian Implement Sensors Mutli-HAL 2.0.
Validasi
Jalankan VTS
Saat Anda telah mengintegrasikan satu atau beberapa sub-HAL dengan Sensor Multi-Hal 2.1, menggunakan Vendor Test Suite (VTS) untuk memastikan sub-HAL Anda memenuhi semua persyaratan yang ditetapkan oleh antarmuka HAL Sensor.
Untuk hanya menjalankan pengujian VTS sensor saat VTS disiapkan di mesin host, jalankan perintah berikut:
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
Jika Anda menjalankan lapisan shim Multi-HAL AIDL, jalankan VtsAidlHalSensorsTargetTest
.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
Menjalankan pengujian unit
Pengujian unit di HalProxy_test.cpp
menguji HalProxy
menggunakan sub-HAL palsu yang
dibuat instance-nya dalam pengujian unit dan tidak dimuat secara dinamis. Saat membuat
sub-HAL baru, pengujian ini harus berfungsi sebagai panduan tentang cara menambahkan pengujian unit yang
memverifikasi bahwa sub-HAL baru diimplementasikan dengan benar.
Untuk menjalankan pengujian, jalankan perintah berikut:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
Menguji dengan sub-HAL palsu
Sub-HAL palsu adalah implementasi dummy antarmuka ISensorsSubHal
.
Sub-HAL mengekspos daftar sensor yang berbeda. Saat diaktifkan,
sensor akan memposting peristiwa sensor yang dibuat secara otomatis secara berkala ke HalProxy
berdasarkan interval yang ditentukan dalam permintaan sensor tertentu.
Sub-HAL palsu dapat digunakan untuk menguji cara kerja kode Multi-HAL lengkap dengan sub-HAL lain yang dimuat ke dalam sistem dan untuk menguji berbagai aspek kode Multi-HAL Sensor.
Dua sub-HAL palsu tersedia di
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
Untuk membangun dan mengirim sub-HAL palsu ke perangkat, lakukan langkah-langkah berikut:
Jalankan perintah berikut untuk membangun dan mengirim tiga perintah palsu sub-HAL ke perangkat:
$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
Perbarui konfigurasi HAL sensor di
/vendor/etc/sensors/hals.conf
dengan jalur untuk sub-HAL palsu./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
Mulai ulang
HalProxy
dan muat sub-HAL baru yang tercantum dalam konfigurasi.adb shell stop
adb shell start
Proses Debug
Developer dapat men-debug framework menggunakan perintah lshal
. Untuk meminta
output debug Sensors HAL, jalankan perintah berikut:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
Informasi tentang status HalProxy
saat ini dan sub-HAL-nya kemudian
di-output ke terminal. Di bawah ini adalah contoh output perintah untuk
objek HalProxy
dan sub-HAL palsu.
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
Jika angka yang ditentukan untuk # of events on pending write queue
adalah
angka besar (1.000 atau lebih),
ini menunjukkan bahwa ada banyak peristiwa yang menunggu untuk ditulis ke framework
sensor. Hal ini menunjukkan bahwa layanan sensor
mengalami {i>deadlock<i} atau telah {i>crash<i} dan
tidak memproses kejadian sensor, atau ada banyak kejadian sensor
yang baru-baru ini diposting dari sub-HAL.
Jika jumlah referensi penguncian layar saat aktif lebih besar dari 0
, artinya HalProxy
telah
mendapatkan penguncian layar saat aktif. Nilai ini hanya boleh lebih besar dari 0
jika ScopedWakelock
sengaja ditahan atau jika peristiwa pengaktifan dikirim ke HalProxy
dan
belum diproses oleh framework sensor.
Deskripsi file yang diteruskan ke metode debug HalProxy
diteruskan ke setiap
sub-HAL sehingga developer harus mengimplementasikan metode debug sebagai bagian dari
antarmuka ISensorsSubHal
.