Sensor Multi-HAL

Sensor Multi-HAL adalah framework yang memungkinkan sensor HAL berjalan bersama HAL sensor lainnya. Sensor Multi-HAL secara dinamis memuat sub-HAL sensor yang disimpan sebagai library dinamis pada partisi vendor dan memberinya objek callback yang dapat menangani peristiwa postingan serta mendapatkan dan melepaskan penguncian layar saat aktif. Sub-HAL sensor adalah HAL sensor yang dibangun menjadi objek bersama pada 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 tersebut.

Sensor Multi-HAL 2.1, yang tersedia di perangkat yang menjalankan Android 11 atau yang lebih tinggi, merupakan iterasi Sensor Multi-HAL 2.0 yang mendukung pemuatan sub-HAL yang dapat menampilkan jenis sensor sudut engsel. Untuk mendukung jenis sensor ini, sub-HAL harus menggunakan API sub-HAL yang ditentukan dalam header Sub-Hal 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 memungkinkan kemampuan multi-HAL. Untuk detail implementasi, lihat Menggunakan Sensor Multi-HAL dengan Sensor AIDL HAL.

Perbedaan antara Sensor Multi-HAL 2 dan Sensor HAL 2

Sensor Multi-HAL 2, tersedia di perangkat yang menjalankan Android 10 atau yang lebih tinggi, memperkenalkan beberapa abstraksi selain Sensors HAL 2 untuk mempermudah interaksi dengan HAL API. Sensor Multi-HAL 2 memperkenalkan class HalProxy untuk menangani penerapan antarmuka Sensor 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) dalam hal berikut:

  • Metode inisialisasi meneruskan class IHalProxyCallback, bukan dua FMQ dan ISensorsCallback.
  • Sub-HAL harus menerapkan fungsi debug untuk memberikan informasi proses debug dalam laporan bug.
  • Sub-HAL harus mengimplementasikan fungsi nama agar 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. Alih-alih menyediakan FMQ, antarmuka IHalProxyCallback menyediakan dua metode, satu metode untuk memposting peristiwa sensor ke framework sensor dan satu metode untuk membuat penguncian layar saat aktif. Di balik layar, 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 pengaturan waktu 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 Sensor Multi-HAL, yang meminimalkan panggilan penguncian dan pembukaan kunci.

Sensor Multi-HAL 2 juga memiliki beberapa fitur keselamatan bawaan. API 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, Sensors Multi-HAL dapat memindahkan peristiwa ke thread latar belakang agar tugas dapat dilanjutkan 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: Objek HalProxy dibuat instance-nya oleh Sensor multi-HAL dan menangani penerusan data dari sub-HAL ke framework sensor.
  • HalProxy.cpp: Implementasi HalProxy berisi semua logika yang diperlukan untuk komunikasi multipleks antara sub-HAL dan framework sensor.
  • SubHal.h: Antarmuka ISensorsSubHal menentukan antarmuka yang harus diikuti 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 membuat data palsu. Berguna untuk menguji bagaimana beberapa sub-HAL berinteraksi pada perangkat.

Penerapan

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

Menggunakan Sensor Multi-HAL dengan Sensor AIDL HAL

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

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

Implementasi Sensor Multi-HAL 2.1

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

  1. Terapkan antarmuka ISensorsSubHal seperti yang dijelaskan dalam SubHal.h.
  2. Implementasikan 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 pada partisi vendor di perangkat.
    2. Dalam file konfigurasi yang terletak di /vendor/etc/sensors/hals.conf, tambahkan jalur ke library di baris baru. Jika perlu, buat file hals.conf.

    Untuk contoh entri Android.bp dalam mem-build 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 layanan android.hardware.sensors dan file 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, lalu melakukannya 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, implementasikan antarmuka SubHal dan kompilasi ulang sub-HAL Anda.

Berikut adalah 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 mengimplementasikan getSensorsList_2_1 dan injectSensorData_2_1, bukan 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, untuk Multi-HAL agar memperlakukannya sebagai sub-HAL versi 2.1.

Port dari Sensors HAL 2.0

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

Melakukan inisialisasi HAL

Sensor HAL 2.0 memiliki fungsi inisialisasi yang memungkinkan layanan sensor untuk meneruskan FMQ dan callback sensor dinamis. Pada Sensors Multi-HAL 2.0, fungsi initialize() meneruskan callback tunggal yang harus digunakan untuk memposting peristiwa sensor, mendapatkan penguncian layar saat aktif, serta memberi tahu pemutusan dan 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.

Acara WAKE_UP

Di Sensor HAL 2.0, HAL dapat mengelola penguncian layar saat aktif untuk implementasinya. Pada Sensor Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL 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

Sensor Multi-HAL 2.0 mengharuskan onDynamicSensorsConnected dan onDynamicSensorsDisconnected dalam 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 Sensor Multi-HAL 2.0 dari Sensor HAL 1.0, pastikan implementasi HAL memenuhi persyaratan berikut.

Melakukan inisialisasi HAL

Fungsi initialize() harus didukung untuk membuat callback 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 booting satu perangkat, bahkan saat sensor HAL dimulai ulang. Hal ini memungkinkan framework mencoba menghubungkan kembali 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

Pada Sensor 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 implementasinya. Pada Sensor Multi-HAL 2.0, sub-HAL memungkinkan implementasi Multi-HAL 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(). Sensor Multi-HAL 2.0 mengharuskan onDynamicSensorsConnected dan onDynamicSensorsDisconnected dalam 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.

  1. Pastikan konfigurasi HAL sensor terletak di /vendor/etc/sensors/hals.conf. Hal 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 tidak didukung untuk HAL 2.0.
  3. Sub-HAL port seperti yang dijelaskan dalam Porting dari Sensor Hal 1.0.
  4. Tetapkan Sensors Multi-HAL 2.0 sebagai HAL yang ditetapkan dengan mengikuti langkah 3 dan 4 di bagian Mengimplementasikan Sensor Mutli-HAL 2.0.

Validasi

Jalankan VTS

Saat Anda telah mengintegrasikan satu atau beberapa sub-HAL dengan Sensor Multi-Hal 2.1, gunakan Vendor Test Suite (VTS) untuk memastikan implementasi sub-HAL Anda memenuhi semua persyaratan yang ditetapkan oleh antarmuka HAL Sensors.

Untuk menjalankan pengujian VTS sensor saja saat VTS disiapkan 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 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 dalam pengujian HalProxy_test.cpp 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 diterapkan 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 contoh antarmuka ISensorsSubHal. Sub-HAL mengekspos daftar sensor yang berbeda. Saat 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 membangun 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. Update 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 dioutput 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 yang besar (1000 atau lebih), ini menunjukkan bahwa ada banyak peristiwa yang tertunda untuk ditulis ke framework sensor. Hal ini menunjukkan bahwa layanan sensor mengalami deadlock atau error dan tidak memproses peristiwa sensor, atau bahwa sejumlah besar peristiwa sensor baru-baru ini diposting dari sub-HAL.

Jika jumlah referensi penguncian layar saat aktif lebih besar dari 0, ini berarti HalProxy telah mendapatkan penguncian layar saat aktif. Nilai ini hanya boleh lebih besar dari 0 jika ScopedWakelock sengaja ditahan atau jika peristiwa bangun 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 menerapkan metode debug sebagai bagian dari antarmuka ISensorsSubHal.