Multi-HAL Sensor

Multi-HAL Sensor adalah framework yang memungkinkan HAL sensor berjalan bersama HAL sensor lainnya. Multi-HAL Sensor memuat sub-HAL sensor secara dinamis yang disimpan sebagai library dinamis di partisi vendor dan memberikan objek callback yang dapat menangani posting peristiwa serta mendapatkan dan melepaskan kunci wake. Sub-HAL sensor adalah HAL sensor yang dibangun 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.

Sensors Multi-HAL 2.1, yang tersedia di perangkat yang menjalankan Android 11 atau yang lebih tinggi, adalah iterasi 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 yang lebih tinggi yang menggunakan Sensors AIDL HAL, Anda dapat menggunakan lapisan shim multi-HAL untuk mengizinkan kemampuan multi-HAL. Untuk mengetahui detail implementasi, lihat Menggunakan Multi-HAL Sensor dengan HAL AIDL Sensor.

Perbedaan antara Sensors Multi-HAL 2 dan Sensors HAL 2

Multi-HAL Sensor 2, yang tersedia di perangkat yang menjalankan Android 10 atau yang lebih tinggi, memperkenalkan beberapa abstraksi di atas Sensor HAL 2 untuk mempermudah interaksi dengan API HAL. Multi-HAL Sensor 2 memperkenalkan class 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 dengan antarmuka 2.1/ISensors.hal (atau 2.0/ISensors.hal) dalam hal berikut:

  • Metode initialize meneruskan class IHalProxyCallback, bukan dua FMQ dan ISensorsCallback.
  • Sub-HAL harus menerapkan fungsi debug untuk memberikan informasi debug dalam laporan bug.
  • Sub-HAL harus menerapkan 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. Daripada menyediakan FMQ, antarmuka IHalProxyCallback menyediakan dua metode, satu metode untuk memposting peristiwa sensor ke framework sensor dan satu metode untuk membuat kunci aktivasi. Di balik layar, Sensors Multi-HAL mengelola semua interaksi dengan FMQ untuk memastikan pengiriman tepat waktu peristiwa sensor untuk semua sub-HAL. Sangat disarankan agar sub-HAL menggunakan metode createScopedWakelock untuk mendelegasikan beban waktu tunggu kunci tetap aktif ke Multi-HAL Sensor dan memusatkan penggunaan kunci tetap aktif ke satu kunci tetap aktif umum untuk seluruh Multi-HAL Sensor, yang meminimalkan panggilan penguncian dan pembukaan kunci.

Sensor Multi-HAL 2 juga memiliki beberapa fitur keamanan bawaan. Class ini 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 segera menerima peristiwa, Multi-HAL Sensor dapat memindahkan peristiwa ke thread latar belakang untuk memungkinkan pekerjaan berlanjut di semua sub-HAL sambil menunggu peristiwa diposting.

Kode sumber dan penerapan referensi

Semua kode Multi-HAL Sensor tersedia di hardware/interfaces/sensors/common/default/2.X/multihal/. Berikut petunjuk ke beberapa referensi.

  • HalProxy.h: Objek HalProxy di-instance oleh multi-HAL Sensor dan menangani penerusan data dari sub-HAL ke framework sensor.
  • HalProxy.cpp: Penerapan HalProxy berisi semua logika yang diperlukan untuk memultipleks komunikasi antara sub-HAL dan framework sensor.
  • SubHal.h: Antarmuka ISensorsSubHal menentukan antarmuka yang harus diikuti sub-HAL agar kompatibel dengan HalProxy. Sub-HAL menerapkan metode inisialisasi sehingga objek HalProxyCallback dapat digunakan untuk postEvents dan createScopedWakelock.

    Untuk penerapan Multi-HAL 2.0, gunakan SubHal.h versi 2.0.

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/: Pengujian unit ini memverifikasi penerapan HalProxy.

  • 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 cara beberapa sub-HAL berinteraksi di perangkat.

Implementasi

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

Menggunakan Multi-HAL Sensor dengan HAL AIDL Sensor

Untuk mengizinkan kemampuan multi-HAL dengan HAL AIDL Sensor, impor modul lapisan shim Multi-HAL AIDL, yang ada 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. Lapisan shim multi-HAL AIDL kompatibel dengan perangkat yang menerapkan Multi-HAL Sensor 2.1.

Lapisan shim multi-HAL AIDL memungkinkan Anda mengekspos jenis sensor IMU sumbu terbatas dan pelacak kepala di HAL AIDL Sensor. Untuk menggunakan jenis sensor ini yang ditentukan oleh antarmuka HAL AIDL, tetapkan kolom type dalam struct SensorInfo di implementasi getSensorsList_2_1(). Hal ini aman karena kolom jenis sensor yang didukung bilangan bulat dari HAL sensor AIDL dan HIDL tidak tumpang-tindih.

Menerapkan Multi-HAL Sensor 2.1

Untuk menerapkan Sensors Multi-HAL 2.1 di perangkat baru, ikuti langkah-langkah berikut:

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

    1. Pastikan target didorong ke suatu tempat di partisi vendor perangkat.
    2. Dalam file config yang berada di /vendor/etc/sensors/hals.conf, tambahkan jalur ke library di baris baru. Jika perlu, buat file hals.conf.

    Untuk contoh entri Android.bp untuk membangun library 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 di perangkat.

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

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

Melakukan porting dari Sensors 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 jenis yang dibuat di spesifikasi ISensors.hal versi 2.1.
  • Fungsi initialize() meneruskan IHalProxyCallback baru, bukan yang dari antarmuka SubHal 2.0
  • Sub-HAL harus menerapkan getSensorsList_2_1 dan injectSensorData_2_1 alih-alih getSensorsList dan injectSensorData karena metode ini menggunakan jenis baru yang ditambahkan dalam spesifikasi ISensors.hal versi 2.1.
  • Sub-HAL harus mengekspos sensorsHalGetSubHal_2_1, bukan sensorsHalGetSubHal 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, pastikan implementasi HAL memenuhi persyaratan berikut.

Menginisialisasi HAL

HAL Sensor 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 kunci wake, 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 Sensors HAL 2.0, HAL dapat mengelola kunci tetap aktif 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 aktif diperoleh dengan memanggil createScopedWakelock. Wake lock cakupan terkunci harus diperoleh dan diteruskan ke postEvents saat memposting peristiwa aktif ke implementasi Multi-HAL.

Sensor dinamis

Multi-HAL Sensor 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 HAL 1.0

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

Menginisialisasi 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 menampilkan nilai yang sama selama satu kali booting perangkat, bahkan di seluruh mulai ulang HAL sensor. Hal ini memungkinkan framework mencoba memulihkan koneksi sensor jika server sistem dimulai ulang. Nilai yang ditampilkan oleh getSensorsList() dapat berubah setelah perangkat melakukan mulai ulang.

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.

Peristiwa WAKE_UP

Di Sensors HAL 1.0, HAL dapat mengelola kunci tetap aktif 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 aktif diperoleh dengan memanggil createScopedWakelock. Wake lock cakupan terkunci harus diperoleh dan diteruskan ke postEvents saat memposting peristiwa aktif ke implementasi Multi-HAL.

Sensor dinamis

Di Sensors HAL 1.0, sensor dinamis ditampilkan melalui fungsi poll(). Multi-HAL Sensor 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 memindahkan implementasi yang ada dari Sensors Multi-HAL 1.0, ikuti langkah-langkah berikut.

  1. Pastikan konfigurasi HAL sensor berada di /vendor/etc/sensors/hals.conf. Tindakan ini mungkin melibatkan pemindahan file yang berada di /system/etc/sensors/hals.conf.
  2. Hapus semua referensi ke hardware/hardware.h dan hardware/sensors.h karena tidak didukung untuk HAL 2.0.
  3. Port sub-HAL seperti yang dijelaskan dalam Melakukan porting dari Sensors HAL 1.0.
  4. Tetapkan Sensors Multi-HAL 2.0 sebagai HAL yang ditetapkan dengan mengikuti langkah 3 dan 4 di bagian Menerapkan Sensors Multi-HAL 2.0.

Validasi

Menjalankan VTS

Setelah 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 Sensors HAL.

Untuk menjalankan hanya 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 di-instance 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 dari antarmuka ISensorsSubHal. Sub-HAL mengekspos daftar sensor yang berbeda. Saat diaktifkan, sensor akan memposting peristiwa sensor yang dibuat secara otomatis ke HalProxy secara berkala 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 membuat dan mengirim sub-HAL palsu ke perangkat, lakukan langkah-langkah berikut:

  1. Jalankan perintah berikut untuk mem-build dan mengirim 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 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 ditampilkan 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 jumlah yang ditentukan untuk # of events on pending write queue adalah angka besar (1000 atau lebih), hal ini menunjukkan bahwa ada banyak peristiwa yang menunggu untuk ditulis ke framework sensor. Hal ini menunjukkan bahwa layanan sensor mengalami kebuntuan atau error dan tidak memproses peristiwa sensor, atau sejumlah besar peristiwa sensor baru-baru ini diposting dari sub-HAL.

Jika jumlah referensi penguncian layar saat aktif lebih besar dari 0, berarti HalProxy telah mendapatkan penguncian layar saat aktif. Nilai ini hanya boleh lebih besar dari 0 jika ScopedWakelock ditahan secara sengaja atau jika peristiwa aktif dikirim ke HalProxy dan belum diproses oleh framework sensor.

Deskriptor file yang diteruskan ke metode debug HalProxy diteruskan ke setiap sub-HAL sehingga developer harus mengimplementasikan metode debug sebagai bagian dari antarmuka ISensorsSubHal.