Sensor Multi-HAL adalah kerangka kerja yang memungkinkan sensor HAL berjalan bersama HAL sensor lainnya. Sensors Multi-HAL secara dinamis memuat sensor sub-HAL yang disimpan sebagai pustaka dinamis pada partisi vendor dan memberi mereka objek panggilan balik yang dapat menangani peristiwa pengeposan dan memperoleh serta melepaskan kunci bangun. Sub-HAL sensor adalah sensor HAL yang dibangun ke dalam objek bersama pada partisi vendor dan digunakan oleh kerangka kerja multi-HAL. Sub-HAL ini tidak bergantung satu sama lain atau pada kode multi-HAL yang berisi fungsi utama untuk proses tersebut.
Sensors Multi-HAL 2.1, tersedia di perangkat yang menjalankan Android 11 atau lebih tinggi, merupakan iterasi dari Sensors Multi-HAL 2.0 yang mendukung pemuatan sub-HAL yang dapat mengekspos tipe sensor sudut engsel . Untuk mendukung jenis sensor ini, sub-HAL harus menggunakan API sub-HAL yang didefinisikan dalam header 2.1 SubHal .
Perbedaan antara Sensor Multi-HAL 2 dan Sensor HAL 2
Sensors Multi-HAL 2, tersedia di perangkat yang menjalankan Android 10 atau lebih tinggi, memperkenalkan beberapa abstraksi di atas Sensor HAL 2 untuk mempermudah interaksi dengan API HAL. Sensors Multi-HAL 2 memperkenalkan kelas HalProxy untuk menangani implementasi antarmuka Sensor HAL 2 dan antarmuka V2_1/SubHal
(atau V2_0/SubHal
) untuk memungkinkan HalProxy
berinteraksi dengan sub-HAL.
Antarmuka ISensorsSubHal
berbeda dari antarmuka 2.1/ISensors.hal
(atau 2.0/ISensors.hal
) dalam hal berikut:
- Metode inisialisasi melewati kelas
IHalProxyCallback
alih-alih dua FMQ danISensorsCallback
. - Sub-HAL harus mengimplementasikan fungsi debug untuk menyediakan informasi debug dalam laporan bug.
- Sub-HAL harus mengimplementasikan fungsi nama sehingga sub-HAL yang dimuat dapat dibedakan dari sub-HAL lainnya.
Perbedaan utama antara Sensor Multi-HAL 2 dan Sensor HAL 2 adalah pada fungsi inisialisasi. Alih-alih menyediakan FMQ, antarmuka IHalProxyCallback
menyediakan dua metode, satu metode untuk memposting peristiwa sensor ke kerangka kerja sensor dan satu metode untuk membuat kunci bangun. Di bawah tenda, Sensor Multi-HAL mengelola semua interaksi dengan FMQ untuk memastikan pengiriman peristiwa sensor yang tepat waktu untuk semua sub-HAL. Sangat disarankan agar sub-HAL menggunakan metode createScopedWakelock
untuk mendelegasikan beban waktu keluar penguncian bangun ke Sensor Multi-HAL dan untuk memusatkan penggunaan penguncian layar ke satu penguncian layar umum untuk seluruh Sensor Multi-HAL, yang meminimalkan penguncian dan pembukaan kunci panggilan.
Sensor Multi-HAL 2 juga memiliki beberapa fitur keselamatan bawaan. Ini menangani situasi di mana sensor FMQ penuh atau di mana kerangka kerja sensor Android dimulai ulang dan status sensor perlu diatur ulang. Selain itu, ketika peristiwa diposting ke kelas HalProxy
tetapi kerangka kerja sensor tidak dapat menerima peristiwa dengan segera, Sensor Multi-HAL dapat memindahkan peristiwa ke utas latar belakang untuk memungkinkan pekerjaan dilanjutkan di semua sub-HAL sambil menunggu peristiwa untuk diposting.
Kode sumber dan implementasi referensi
Semua kode Sensor Multi-HAL tersedia di hardware/interfaces/sensors/common/default/2.X/multihal/
. Berikut adalah petunjuk untuk beberapa sumber daya.
-
HalProxy.h
: ObjekHalProxy
dipakai oleh Sensor multi-HAL dan menangani pengiriman 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
mendefinisikan antarmuka yang harus diikuti oleh sub-HAL agar kompatibel denganHalProxy
. Sub-HAL mengimplementasikan metode inisialisasi sehingga objekHalProxyCallback
dapat digunakan untukpostEvents
dancreateScopedWakelock
.Untuk implementasi Multi-HAL 2.0, gunakan versi 2.0 dari
SubHal.h
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Tes unit ini memverifikasi implementasiHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: Contoh implementasi sub-HAL ini menggunakan sensor palsu untuk menghasilkan data palsu. Berguna untuk menguji bagaimana beberapa sub-HAL berinteraksi pada perangkat.
Penerapan
Bagian ini menjelaskan cara menerapkan Sensor Multi-HAL dalam situasi berikut:
- Menerapkan Sensor Multi-HAL 2.1
- Porting dari Sensor Multi-HAL 2.0 ke Multi-HAL 2.1
- Porting dari Sensor HAL 2.0
- Porting dari Sensor HAL 1.0
- Porting dari Sensor Multi-HAL 1.0
Menerapkan Sensor Multi-HAL 2.1
Untuk menerapkan Sensor Multi-HAL 2.1 pada perangkat baru, ikuti langkah-langkah berikut:
- Implementasikan 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 diterapkan. Saat menambahkan target:- Pastikan target didorong ke suatu tempat di partisi vendor perangkat.
- Dalam file konfigurasi yang terletak di
/vendor/etc/sensors/hals.conf
, tambahkan path ke perpustakaan pada baris baru. Jika perlu, buat filehals.conf
.
Untuk contoh entri
Android.bp
untuk membangun perpustakaan sub-HAL, lihathardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
.Hapus semua entri
android.hardware.sensors
dari filemanifest.xml
, yang berisi daftar HAL yang didukung pada perangkat.Hapus semua file
android.hardware.sensors
service danservice.rc
dari filedevice.mk
dan tambahkanandroid.hardware.sensors@2.1-service.multihal
danandroid.hardware.sensors@2.1-service.multihal.rc
kePRODUCT_PACKAGES
.
Saat boot, HalProxy
memulai, mencari sub-HAL yang baru diimplementasikan, dan menginisialisasinya dengan memanggil sensorsHalGetSubHal_2_1
.
Porting dari Sensor Multi-HAL 2.0 ke Multi-HAL 2.1
Untuk port dari Multi-HAL 2.0 ke Multi-HAL 2.1, implementasikan antarmuka SubHal
dan kompilasi ulang sub-HAL Anda.
Ini adalah perbedaan antara antarmuka SubHal
2.0 dan 2.1:
-
IHalProxyCallback
menggunakan tipe yang dibuat di versi 2.1 dari spesifikasiISensors.hal
. - Fungsi
initialize()
melewatiIHalProxyCallback
baru alih-alih yang dari antarmuka 2.0SubHal
- Sub-HAL harus mengimplementasikan
getSensorsList_2_1
daninjectSensorData_2_1
sebagai gantigetSensorsList
daninjectSensorData
karena metode ini menggunakan tipe baru yang ditambahkan di versi 2.1 dari spesifikasiISensors.hal
. - Sub-HAL harus mengekspos
sensorsHalGetSubHal_2_1
daripadasensorsHalGetSubHal
agar Multi-HAL memperlakukannya sebagai sub-HAL versi 2.1.
Porting dari Sensor HAL 2.0
Saat meningkatkan ke Sensor Multi-HAL 2.0 dari Sensor HAL 2.0 , pastikan penerapan HAL memenuhi persyaratan berikut.
Inisialisasi HAL
Sensor HAL 2.0 memiliki fungsi inisialisasi yang memungkinkan layanan sensor melewatkan FMQ dan panggilan balik sensor dinamis. Di Sensors Multi-HAL 2.0, fungsi initialize()
melewati satu panggilan balik yang harus digunakan untuk memposting peristiwa sensor, mendapatkan penguncian layar saat aktif, dan memberi tahu koneksi dan pemutusan sensor dinamis.
Memposting peristiwa sensor ke implementasi Multi-HAL
Alih-alih memposting peristiwa sensor melalui FMQ, sub-HAL harus menulis peristiwa sensor ke IHalProxyCallback
saat peristiwa sensor tersedia.
Acara WAKE_UP
Di Sensors HAL 2.0, HAL dapat mengatur wake lock untuk implementasinya. Di Sensors Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL untuk mengelola penguncian layar saat aktif dan dapat meminta penguncian layar saat bangun diperoleh dengan menjalankan createScopedWakelock
. Kunci bangun tercakup yang dikunci harus diperoleh dan diteruskan ke postEvents
saat memposting acara bangun ke implementasi Multi-HAL.
Sensor dinamis
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()
.
Porting dari Sensor HAL 1.0
Saat meningkatkan ke Sensor Multi-HAL 2.0 dari Sensor HAL 1.0 , pastikan penerapan HAL memenuhi persyaratan berikut.
Inisialisasi HAL
Fungsi initialize()
harus didukung untuk membuat callback antara sub-HAL dan implementasi Multi-HAL.
Mengekspos sensor yang tersedia
Di Sensors Multi-HAL 2.0, fungsi getSensorsList()
harus mengembalikan nilai yang sama selama boot perangkat tunggal, bahkan di seluruh sensor HAL restart. Ini memungkinkan kerangka kerja untuk mencoba membangun kembali koneksi sensor jika server sistem dimulai ulang. Nilai yang dikembalikan oleh getSensorsList()
dapat berubah setelah perangkat melakukan reboot.
Memposting peristiwa sensor ke implementasi Multi-HAL
Di Sensors HAL 2.0, alih-alih menunggu poll()
dipanggil, sub-HAL harus secara proaktif menulis peristiwa sensor ke IHalProxyCallback
setiap kali peristiwa sensor tersedia.
Acara WAKE_UP
Pada Sensor HAL 1.0, HAL dapat mengatur wake lock untuk implementasinya. Di Sensors Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL untuk mengelola penguncian layar saat aktif dan dapat meminta penguncian layar saat bangun diperoleh dengan menjalankan createScopedWakelock
. Kunci bangun tercakup yang dikunci harus diperoleh dan diteruskan ke postEvents
saat memposting acara bangun ke implementasi Multi-HAL.
Sensor dinamis
Di Sensors HAL 1.0, sensor dinamis dikembalikan 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()
.
Porting dari Sensor Multi-HAL 1.0
Untuk mem-port implementasi yang ada dari Sensors Multi-HAL 1.0 , ikuti langkah-langkah ini.
- Pastikan bahwa sensor HAL config berada di
/vendor/etc/sensors/hals.conf.
Ini mungkin melibatkan pemindahan file yang terletak di/system/etc/sensors/hals.conf
. - Hapus semua referensi ke
hardware/hardware.h
danhardware/sensors.h
karena ini tidak didukung untuk HAL 2.0. - Sub-HAL port seperti yang dijelaskan dalam Porting dari Sensor Hal 1.0 .
- Tetapkan Sensor Multi-HAL 2.0 sebagai HAL yang ditentukan dengan mengikuti langkah 3 dan 4 di bagian Penerapan Sensor Mutli-HAL 2.0 .
Validasi
Menjalankan VTS
Saat Anda telah mengintegrasikan satu atau beberapa sub-HAL dengan Sensors Multi-Hal 2.1, gunakan Vendor Test Suite (VTS) untuk memastikan implementasi sub-HAL Anda memenuhi semua persyaratan yang ditetapkan oleh antarmuka Sensor HAL.
Untuk menjalankan hanya sensor yang diuji VTS saat VTS diatur pada 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
Menjalankan tes unit
Pengujian unit di HalProxy_test.cpp
menguji HalProxy
menggunakan sub-HAL palsu yang digunakan 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 diterapkan dengan benar.
Untuk menjalankan tes, 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 tiruan dari antarmuka ISensorsSubHal
. Sub-HAL mengekspos daftar sensor yang berbeda. Ketika sensor diaktifkan, mereka secara berkala memposting peristiwa sensor yang dihasilkan secara otomatis ke HalProxy
berdasarkan interval yang ditentukan dalam permintaan sensor yang diberikan.
Sub-HAL palsu dapat digunakan untuk menguji bagaimana kode Multi-HAL lengkap bekerja dengan sub-HAL lain yang dimuat ke dalam sistem dan untuk menekankan 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 mendorong sub-HAL palsu ke perangkat, lakukan langkah-langkah berikut:
Jalankan perintah berikut untuk membuat dan mendorong tiga sub-HAL palsu yang berbeda 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 terdaftar di konfigurasi.adb shell stop
adb shell start
Men-debug
Pengembang dapat men-debug kerangka kerja dengan menggunakan perintah lshal
. Untuk meminta output debug dari 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-HALnya kemudian dikeluarkan ke terminal. Ditampilkan 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 jumlah yang ditentukan untuk # of events on pending write queue
adalah jumlah yang besar (1000 atau lebih), ini menunjukkan bahwa ada banyak peristiwa yang tertunda untuk ditulis ke kerangka kerja sensor. Ini menunjukkan bahwa layanan sensor menemui jalan buntu atau macet dan tidak memproses peristiwa sensor, atau bahwa sejumlah besar peristiwa sensor baru-baru ini diposting dari sub-HAL.
Jika jumlah ref wake lock lebih besar dari 0
, ini berarti HalProxy
telah memperoleh wake lock. Ini hanya boleh lebih besar dari 0
jika ScopedWakelock
sengaja ditahan atau jika peristiwa bangun dikirim ke HalProxy
dan belum diproses oleh kerangka kerja sensor.
Deskriptor file yang diteruskan ke metode debug HalProxy
diteruskan ke setiap sub-HAL sehingga pengembang harus mengimplementasikan metode debug sebagai bagian dari antarmuka ISensorsSubHal
.