Sensor Multi-HAL

Sensor Multi-HAL adalah kerangka kerja yang memungkinkan HAL sensor berjalan bersama HAL sensor lainnya. Sensors Multi-HAL secara dinamis memuat sub-HAL sensor yang disimpan sebagai pustaka dinamis di partisi vendor dan memberinya objek panggilan balik yang dapat menangani pengeposan peristiwa serta memperoleh dan melepaskan penguncian layar saat aktif. Sub-HAL sensor adalah HAL sensor yang dibangun ke dalam objek bersama di 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 jenis sensor sudut engsel . Untuk mendukung jenis sensor ini, sub-HAL harus menggunakan API sub-HAL yang ditentukan di header SubHal 2.1 .

Untuk perangkat yang menjalankan Android 13 atau lebih tinggi yang menggunakan Sensor AIDL HAL , Anda dapat menggunakan lapisan shim multi-HAL untuk memungkinkan kemampuan multi-HAL. Untuk detail implementasi, lihat Menggunakan Sensor Multi-HAL dengan Sensor AIDL HAL .

Perbedaan Sensor Multi-HAL 2 dan Sensor HAL 2

Sensor 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. Sensor Multi-HAL 2 memperkenalkan kelas HalProxy untuk menangani penerapan 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 meneruskan kelas IHalProxyCallback alih-alih dua FMQ dan ISensorsCallback .
  • 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 terletak pada fungsi inisialisasi. Daripada menyediakan FMQ, antarmuka IHalProxyCallback menyediakan dua metode, satu metode untuk memposting kejadian sensor ke framework sensor dan satu metode untuk membuat penguncian layar saat aktif. Di balik terpalnya, Sensors Multi-HAL mengelola semua interaksi dengan FMQ untuk memastikan pengiriman peristiwa sensor tepat waktu 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 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 ketika sensor FMQ penuh atau ketika kerangka sensor Android dimulai ulang dan status sensor perlu diatur ulang. Selain itu, ketika peristiwa diposting ke kelas HalProxy tetapi kerangka sensor tidak dapat segera menerima peristiwa tersebut, Sensor Multi-HAL dapat memindahkan peristiwa ke thread 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 ke beberapa sumber.

  • HalProxy.h : Objek HalProxy dibuat oleh Sensor multi-HAL dan menangani penerusan data dari sub-HAL ke kerangka sensor.
  • HalProxy.cpp : Implementasi HalProxy berisi semua logika yang diperlukan untuk komunikasi multipleks antara sub-HAL dan kerangka sensor.
  • SubHal.h : Antarmuka ISensorsSubHal mendefinisikan antarmuka yang harus diikuti oleh sub-HAL agar kompatibel dengan HalProxy . Sub-HAL mengimplementasikan metode inisialisasi sehingga objek HalProxyCallback dapat digunakan untuk postEvents dan createScopedWakelock .

    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 implementasi HalProxy .

  • 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 suatu perangkat.

Penerapan

Bagian ini menjelaskan cara menerapkan Sensor Multi-HAL dalam situasi berikut:

Gunakan Sensor Multi-HAL dengan Sensor AIDL HAL

Untuk memungkinkan kemampuan multi-HAL dengan Sensor AIDL HAL, impor modul lapisan shim AIDL Multi-HAL, yang terdapat di hardware/interfaces/sensors/aidl/default/multihal/ . Modul ini menangani konversi antara tipe definisi HAL sensor AIDL dan HIDL dan mendefinisikan pembungkus di sekitar antarmuka multi-HAL yang dijelaskan dalam Menerapkan Sensor Multi-HAL 2.1 . Lapisan shim multi-HAL AIDL 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 Sensor AIDL HAL. Untuk menggunakan tipe sensor ini yang ditentukan oleh antarmuka AIDL HAL, setel bidang type di struct SensorInfo dalam implementasi getSensorsList_2_1() . Hal ini aman karena bidang tipe sensor yang didukung integer pada sensor AIDL dan HIDL HAL tidak tumpang tindih.

Implementasi Sensor Multi-HAL 2.1

Untuk menerapkan Sensor Multi-HAL 2.1 pada perangkat baru, ikuti langkah-langkah berikut:

  1. Implementasikan antarmuka ISensorsSubHal seperti yang dijelaskan dalam SubHal.h .
  2. Terapkan metode sensorsHalGetSubHal_2_1 di SubHal.h .
  3. Tambahkan target cc_library_shared untuk membangun sub-HAL yang baru diimplementasikan. Saat menambahkan target:

    1. Pastikan target didorong ke suatu tempat di partisi vendor perangkat.
    2. Di file konfigurasi yang terletak di /vendor/etc/sensors/hals.conf , tambahkan jalur ke perpustakaan di baris baru. Jika perlu, buat file hals.conf .

    Untuk contoh entri Android.bp untuk membuat pustaka sub-HAL, lihat hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp .

  4. Hapus semua entri android.hardware.sensors dari file manifest.xml , yang berisi daftar HAL yang didukung pada perangkat.

  5. Hapus semua file android.hardware.sensors service dan service.rc dari file device.mk dan tambahkan android.hardware.sensors@2.1-service.multihal dan android.hardware.sensors@2.1-service.multihal.rc ke PRODUCT_PACKAGES .

Saat boot, HalProxy memulai, mencari sub-HAL yang baru diimplementasikan, dan menginisialisasinya dengan memanggil sensorsHalGetSubHal_2_1 .

Port dari Sensor Multi-HAL 2.0 ke Multi-HAL 2.1

Untuk melakukan porting dari Multi-HAL 2.0 ke Multi-HAL 2.1, terapkan antarmuka SubHal dan kompilasi ulang sub-HAL Anda.

Berikut perbedaan antara antarmuka SubHal 2.0 dan 2.1:

  • IHalProxyCallback menggunakan tipe yang dibuat dalam spesifikasi ISensors.hal versi 2.1.
  • Fungsi initialize() meneruskan IHalProxyCallback baru dan bukan yang dari antarmuka SubHal 2.0
  • Sub-HAL harus mengimplementasikan getSensorsList_2_1 dan injectSensorData_2_1 alih-alih getSensorsList dan injectSensorData karena metode ini menggunakan tipe baru yang ditambahkan dalam spesifikasi ISensors.hal versi 2.1.
  • Sub-HAL harus mengekspos sensorsHalGetSubHal_2_1 daripada sensorsHalGetSubHal agar Multi-HAL dapat memperlakukannya sebagai sub-HAL versi 2.1.

Port dari Sensor HAL 2.0

Saat meningkatkan ke Sensors Multi-HAL 2.0 dari Sensors HAL 2.0 , pastikan penerapan HAL memenuhi persyaratan berikut.

Inisialisasi HAL

Sensor HAL 2.0 memiliki fungsi inisialisasi yang memungkinkan layanan sensor meneruskan FMQ dan panggilan balik sensor dinamis. Di Sensors Multi-HAL 2.0, fungsi initialize() meneruskan satu callback yang harus digunakan untuk memposting peristiwa sensor, mendapatkan penguncian layar saat aktif, dan memberi tahu koneksi dan pemutusan sensor dinamis.

Posting kejadian sensor ke implementasi Multi-HAL

Daripada memposting kejadian sensor melalui FMQ, sub-HAL harus menulis kejadian sensor ke IHalProxyCallback ketika kejadian sensor tersedia.

acara WAKE_UP

Di Sensor HAL 2.0, HAL dapat mengelola penguncian layar saat aktif untuk penerapannya. Di Sensors Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL mengelola penguncian layar saat aktif dan dapat meminta penguncian layar saat aktif untuk diperoleh dengan memanggil createScopedWakelock . Pengunci layar aktif dengan cakupan yang terkunci harus diperoleh dan diteruskan ke postEvents saat memposting peristiwa bangun ke penerapan 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 penunjuk IHalProxyCallback yang disediakan melalui fungsi initialize() .

Port dari Sensor HAL 1.0

Saat melakukan upgrade ke Sensors Multi-HAL 2.0 dari Sensors HAL 1.0 , pastikan implementasi HAL memenuhi persyaratan berikut.

Inisialisasi HAL

Fungsi initialize() harus didukung untuk membuat panggilan balik antara implementasi sub-HAL dan Multi-HAL.

Paparkan sensor yang tersedia

Di Sensors Multi-HAL 2.0, fungsi getSensorsList() harus mengembalikan nilai yang sama selama booting satu perangkat, bahkan saat sensor HAL dimulai ulang. Hal 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.

Posting kejadian 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

Di Sensor HAL 1.0, HAL dapat mengelola penguncian layar saat aktif untuk penerapannya. Di Sensors Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL mengelola penguncian layar saat aktif dan dapat meminta penguncian layar saat aktif untuk diperoleh dengan memanggil createScopedWakelock . Pengunci layar aktif dengan cakupan yang terkunci harus diperoleh dan diteruskan ke postEvents saat memposting peristiwa 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 penunjuk IHalProxyCallback yang disediakan melalui fungsi initialize() .

Port dari Sensor Multi-HAL 1.0

Untuk mem-porting implementasi yang ada dari Sensors Multi-HAL 1.0 , ikuti langkah-langkah berikut.

  1. Pastikan konfigurasi HAL sensor terletak di /vendor/etc/sensors/hals.conf. Ini mungkin melibatkan pemindahan file yang terletak di /system/etc/sensors/hals.conf .
  2. Hapus semua referensi ke hardware/hardware.h dan hardware/sensors.h karena ini tidak didukung untuk HAL 2.0.
  3. Port sub-HAL seperti yang dijelaskan dalam Porting dari Sensor Hal 1.0 .
  4. 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

Jalankan VTS

Saat Anda telah mengintegrasikan satu atau lebih 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 Sensors HAL.

Untuk menjalankan tes sensor VTS saja 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

Jika Anda menjalankan lapisan shim AIDL Multi-HAL, jalankan VtsAidlHalSensorsTargetTest .

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsAidlHalSensorsTargetTest

Jalankan pengujian unit

Pengujian unit di HalProxy_test.cpp menguji HalProxy menggunakan sub-HAL palsu yang dipakai 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

Uji dengan sub-HAL palsu

Sub-HAL palsu adalah implementasi tiruan dari antarmuka ISensorsSubHal . Sub-HAL memaparkan daftar sensor yang berbeda. Saat sensor diaktifkan, sensor secara berkala memposting peristiwa sensor yang dihasilkan secara otomatis 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 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 membuat dan mengirim sub-HAL palsu ke perangkat, lakukan langkah-langkah berikut:

  1. Jalankan perintah berikut untuk membuat dan memasukkan 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
    
  2. 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
    
  3. 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 Sensor HAL, jalankan perintah berikut:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

Informasi tentang keadaan HalProxy saat ini dan sub-HALnya kemudian dikeluarkan ke terminal. Di bawah ini adalah contoh keluaran 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 angka yang besar (1000 atau lebih), hal ini menunjukkan bahwa ada banyak kejadian yang menunggu untuk ditulis ke kerangka sensor. Hal ini menunjukkan layanan sensor menemui jalan buntu atau mengalami crash dan tidak memproses peristiwa sensor, atau sejumlah besar peristiwa sensor baru-baru ini diposting dari sub-HAL.

Jika jumlah ref penguncian layar saat aktif lebih besar dari 0 , ini berarti HalProxy telah memperoleh penguncian layar saat aktif. Nilai ini hanya boleh lebih besar dari 0 jika ScopedWakelock sengaja diadakan atau jika peristiwa bangun dikirim ke HalProxy dan belum diproses oleh kerangka 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 .