Context Hub Runtime Environment (CHRE)

Smartphone memiliki sejumlah prosesor, masing-masing dioptimalkan untuk tugas yang berbeda. Namun, Android hanya berjalan pada satu prosesor: aplikasi pemroses (AP). AP disesuaikan untuk memberikan performa luar biasa untuk layar lain seperti {i>game<i}, tetapi aplikasi itu terlalu menggunakan daya untuk mendukung fitur yang memerlukan pemrosesan yang sering dan singkat sepanjang waktu, bahkan ketika layar nonaktif. Prosesor yang lebih kecil dapat menangani beban kerja ini dengan lebih efisien, menyelesaikan tugas mereka tanpa mempengaruhi masa pakai baterai. Namun, perangkat lunak di prosesor berdaya rendah ini lebih terbatas dan dapat sangat bervariasi, sehingga sulit untuk melakukan pengembangan lintas platform.

Context Hub Runtime Environment (CHRE) menyediakan platform umum untuk menjalankan aplikasi berdaya rendah, dengan antarmuka yang sederhana, API yang cocok untuk sematan. CHRE memudahkan OEM perangkat dan produk tepercaya mitra untuk mengurangi beban pemrosesan dari AP, untuk menghemat baterai dan meningkatkan area pengalaman pengguna, dan memungkinkan kelas selalu aktif fitur yang kontekstual, terutama yang melibatkan penerapan machine learning ke sensor sekitar.

Konsep utama

CHRE adalah lingkungan software tempat aplikasi native kecil, yang disebut nanoapps, dieksekusi pada prosesor berdaya rendah dan berinteraksi dengan melalui CHRE API umum. Untuk mempercepat penerapan yang tepat CHRE API, implementasi referensi lintas platform dari CHRE disertakan dalam AOSP. Implementasi referensi mencakup kode umum dan abstraksi ke perangkat keras dan perangkat lunak yang mendasarinya melalui serangkaian lapisan abstraksi platform (PAL). Nanoapps hampir selalu terikat dengan satu atau beberapa aplikasi klien yang berjalan di Android, yang berinteraksi dengan CHRE dan nanoapps melalui akses terbatas ContextHubManager API sistem.

Pada dasarnya, paralel dapat digambar antara arsitektur CHRE dan Android secara keseluruhan. Namun, ada beberapa perbedaan penting:

  • CHRE hanya mendukung pengoperasian aplikasi nano yang dikembangkan dalam kode native (C atau C++); Java tidak didukung.
  • Karena keterbatasan resource dan keamanan, CHRE tidak terbuka untuk digunakan oleh aplikasi Android pihak ketiga arbitrer. Hanya aplikasi tepercaya sistem yang dapat mengaksesnya.

Ada juga perbedaan penting yang harus dibuat antara konsep CHRE dan hub sensor. Meskipun umum untuk menggunakan perangkat keras yang sama untuk mengimplementasikan hub sensor dan CHRE, CHRE sendiri tidak memberikan kemampuan sensor yang diperlukan oleh Sensor Android HAL. CHRE terkait dengan Context Hub HAL, dan bertindak sebagai klien dari sensor khusus perangkat untuk menerima data sensor tanpa melibatkan AP.

Arsitektur framework CHRE

Gambar 1. Arsitektur framework CHRE

Hub Konteks HAL

Lapisan abstraksi hardware (HAL) Context Hub adalah antarmuka antara Framework Android dan implementasi CHRE perangkat, yang ditentukan di hardware/interfaces/contexthub Context Hub HAL mendefinisikan API yang digunakan oleh framework Android menemukan hub konteks yang tersedia dan nanoapp-nya, berinteraksi dengan nanoapps melalui penerusan pesan, dan memungkinkan nanoaplikasi dimuat dan dibongkar. Implementasi referensi HAL Hub Konteks yang berfungsi dengan penerapan referensi CHRE tersedia di system/chre/host

Jika terjadi pertentangan antara dokumentasi ini dan definisi HAL, Definisi HAL lebih diutamakan.

Inisialisasi

Saat Android melakukan booting, ContextHubService memanggil fungsi HAL getHubs() untuk menentukan apakah ada hub konteks yang tersedia di perangkat. Panggilan ini bersifat satu kali pemblokiran, sehingga harus diselesaikan dengan cepat untuk menghindari penundaan {i>booting<i}, dan harus memberikan hasil yang akurat, karena {i>context hub<i} tidak dapat diperkenalkan setelahnya.

Memuat dan menghapus muatan nanoaplikasi

Hub konteks dapat mencakup serangkaian aplikasi nano yang disertakan dalam perangkat dan dimuat saat CHRE dimulai. Ini dikenal sebagai aplikasi nano yang dimuat sebelumnya, dan harus disertakan dalam respons pertama yang memungkinkan untuk queryApps().

Context Hub HAL juga mendukung pemuatan dan pembongkaran nanoaplikasi secara dinamis di runtime, melalui fungsi loadNanoApp() dan unloadNanoApp(). Aplikasi Nano disediakan ke HAL dalam format biner khusus untuk perangkat keras CHRE dan implementasi perangkat lunak dari suatu perangkat.

Jika implementasi untuk memuat nanoapp melibatkan penulisannya ke nonvolatil lain, seperti penyimpanan flash yang dipasang ke prosesor yang menjalankan CHRE, maka Implementasi CHRE harus selalu melakukan booting dengan aplikasi nano dinamis ini di status nonaktif. Artinya, tidak satu pun kode nanoapp yang dieksekusi hingga Permintaan enableNanoapp() diterima melalui HAL. {i>nanoapp<i} yang dipramuat dapat melakukan inisialisasi dalam keadaan aktif.

Hub konteks dimulai ulang

Meskipun CHRE tidak diharapkan untuk dimulai ulang selama operasi normal, namun diperlukan untuk memulihkan data dari kondisi yang tidak terduga seperti upaya untuk mengakses alamat memori yang tidak dipetakan. Dalam situasi ini, CHRE akan dimulai ulang secara independen dari Android. HAL memberi tahu Android tentang hal ini melalui Peristiwa RESTARTED, yang hanya boleh dikirim setelah CHRE diinisialisasi ulang ke titik tersebut dapat menerima permintaan baru, seperti queryApps().

Ringkasan sistem CHRE

CHRE dirancang berdasarkan arsitektur berbasis peristiwa, di mana unit utama komputasi adalah peristiwa yang diteruskan ke titik entri penanganan peristiwa aplikasi nano. Meskipun framework CHRE bisa bersifat multi-thread, nanoapp tertentu tidak pernah dieksekusi dari beberapa thread secara paralel. Framework CHRE berinteraksi dengan aplikasi nano tertentu melalui salah satu dari tiga titik entri nanoapp (nanoappStart(), nanoappHandleEvent(), dan nanoappEnd()) atau melalui callback yang disediakan dalam panggilan CHRE API sebelumnya, dan aplikasi nano berinteraksi dengan framework CHRE dan yang mendasarinya melalui CHRE API. CHRE API menyediakan kumpulan fitur serta fasilitas untuk mengakses sinyal kontekstual, termasuk sensor, GNSS, Wi-Fi, WWAN, dan audio, serta dapat diperluas dengan kemampuan khusus vendor untuk digunakan oleh nanoapps khusus vendor.

Sistem build

Sementara Context Hub HAL dan komponen sisi AP lain yang diperlukan dibangun bersama Android, kode yang berjalan dalam CHRE bisa memiliki persyaratan yang membuatnya tidak kompatibel dengan sistem build Android, misalnya kebutuhan akan Rantai Alat (Toolchain). Oleh karena itu, project CHRE di AOSP menyediakan build yang disederhanakan berbasis GNU Make untuk mengkompilasi nanoapps, dan secara opsional menjadi library yang dapat diintegrasikan dengan sistem. Perangkat produsen yang menambahkan dukungan untuk CHRE harus mengintegrasikan dukungan sistem build untuk perangkat target mereka ke dalam AOSP.

CHRE API ditulis ke standar bahasa C99, dan referensi menggunakan subset terbatas dari C++11 cocok untuk resource-terbatas aplikasi.

API CHRE

CHRE API adalah kumpulan file header C yang menentukan software antarmuka antara aplikasi nano dan sistem. Alat ini dirancang untuk membuat nanoaplikasi yang kompatibel dengan semua perangkat yang mendukung CHRE, yang berarti bahwa kode sumber untuk nanoapp tidak perlu dimodifikasi untuk mendukung perangkat baru walaupun mungkin perlu dikompilasi ulang secara khusus untuk set petunjuk prosesor atau application binary interface (ABI). CHRE dan desain API juga memastikan bahwa nanoaplikasi kompatibel dengan biner di berbagai versi CHRE API, yang berarti bahwa aplikasi nano tidak perlu dikompilasi ulang untuk berjalan pada sistem yang mengimplementasikan versi yang berbeda dari CHRE API dibandingkan dengan API target yang digunakan dalam kompilasi nanoapp. Dengan kata lain, jika biner nanoapp berjalan di perangkat yang mendukung CHRE API v1.3, dan perangkat tersebut diupgrade untuk mendukung CHRE API v1.4, aplikasi nano yang sama biner tetap berfungsi. Demikian pula, nanoapp dapat berjalan di CHRE API v1.2, dan dapat menentukan pada runtime apakah diperlukan kemampuan dari API v1.3 hingga mencapai penggunaannya, atau apakah dapat beroperasi, mungkin dengan halus degradasi fitur.

Versi baru CHRE API dirilis bersama Android, tetapi saat CHRE implementasi adalah bagian dari implementasi vendor, versi CHRE API yang didukung pada perangkat tidak selalu ditautkan ke Versi Android.

Ringkasan versi

Seperti Skema pembuatan versi HIDL Android, CHRE API mengikuti pembuatan versi semantik. Versi utama menunjukkan kompatibilitas biner, sedangkan versi minor menunjukkan bertambah ketika fitur yang kompatibel dengan versi sebelumnya diperkenalkan. CHRE API menyertakan anotasi kode sumber untuk mengidentifikasi versi mana yang memperkenalkan fungsi atau parameter, misalnya @since v1.1.

Implementasi CHRE juga mengekspos versi patch khusus platform melalui chreGetVersion(), yang menunjukkan saat perbaikan bug atau update minor dilakukan di dalam penerapannya.

Versi 1.0 (Android 7)

Mencakup dukungan untuk sensor, dan kemampuan aplikasi nano inti, seperti peristiwa dan timer.

Versi 1.1 (Android 8)

Memperkenalkan kemampuan lokasi melalui lokasi GNSS dan pengukuran mentah, Pemindaian Wi-Fi, dan informasi jaringan seluler, bersama dengan penajaman umum untuk memungkinkan komunikasi nanoapp-ke-nanoapp, dan peningkatan lainnya.

Versi 1.2 (Android 9)

Menambahkan dukungan untuk data dari mikrofon berdaya rendah, jangkauan Wi-Fi RTT, AP notifikasi bangun dan tidur, serta peningkatan lainnya.

Versi 1.3 (Android 10)

Meningkatkan kemampuan terkait data kalibrasi sensor, menambahkan dukungan untuk memasukkan data sensor batch sesuai permintaan, menentukan jenis sensor deteksi langkah, dan memperluas peristiwa lokasi GNSS dengan kolom akurasi tambahan.

Versi 1.4 (Android 11)

Menambahkan dukungan untuk informasi sel 5G, file dump debug nanoapp, dan peningkatan performa.

Fitur sistem wajib

Meskipun sumber sinyal kontekstual, seperti sensor, dikategorikan ke dalam opsi opsional area fitur, beberapa fungsi inti diperlukan di seluruh CHRE implementasi yang tepat. Ini termasuk API sistem inti, seperti API untuk setelan timer, mengirim dan menerima pesan ke klien pada pemroses aplikasi, {i>logging<i}, dan lain-lain. Untuk detail selengkapnya, lihat Header API.

Selain fitur sistem inti yang terkodifikasi dalam CHRE API, ada juga fitur tingkat sistem CHRE wajib yang ditentukan di level HAL Context Hub. Tujuan paling signifikan di antaranya adalah kemampuan untuk secara dinamis memuat dan membongkar aplikasi nano.

Library standar C/C++

Untuk meminimalkan penggunaan memori dan kompleksitas sistem, implementasi CHRE yang hanya diperlukan untuk mendukung subset dari library C dan C++ standar dan fitur bahasa yang memerlukan dukungan runtime. Dengan mengikuti prinsip-prinsip ini, beberapa secara eksplisit dikecualikan karena memori dan tingkat OS yang luas dependensi, dan lainnya karena digantikan oleh API khusus CHRE. Meskipun tidak dimaksudkan sebagai daftar lengkap, hal-hal berikut kemampuan ini tidak dimaksudkan untuk tersedia bagi nanoapps:

  • Pengecualian C++ dan informasi jenis runtime (RTTI)
  • Dukungan multithreading library standar, termasuk header C++11 <thread>, <mutex>, <atomic>, <future>
  • Library Input/Output Standar C dan C++
  • Library Template Standar (STL) C++
  • Library Regular Expressions C++
  • Alokasi memori dinamis melalui fungsi standar (misalnya, malloc, calloc, realloc, free, operator new), dan standar lainnya fungsi library yang secara inheren menggunakan alokasi dinamis, seperti std::unique_ptr
  • Dukungan karakter Unicode dan pelokalan
  • Library tanggal dan waktu
  • Fungsi yang mengubah alur program normal, termasuk <setjmp.h>, <signal.h>, abort, std::terminate
  • Mengakses lingkungan host, termasuk system, getenv
  • POSIX dan library lainnya yang tidak termasuk dalam bahasa C99 atau C++11 standar

Dalam banyak kasus, kemampuan yang setara tersedia dari fungsi CHRE API dan library utilitas. Misalnya, chreLog dapat digunakan untuk logging debug yang ditargetkan ke sistem Android {i>logcat<i}, di mana program yang lebih tradisional mungkin gunakan printf atau std::cout.

Sebaliknya, beberapa kemampuan library standar diperlukan. Terserah implementasi platform untuk mengeksposnya melalui library statis untuk disertakan dalam biner aplikasi nano, atau dengan penautan dinamis antara aplikasi nano dan sistem. Ini termasuk, tetapi tidak terbatas pada:

  • Utilitas string dan array: memcmp, memcpy, memmove, memset, strlen
  • Library matematika: Fungsi floating point presisi tunggal yang umum digunakan:

    • Operasi dasar: ceilf, fabsf, floorf, fmaxf, fminf, fmodf, roundf, lroundf, remainderf
    • Fungsi eksponensial dan pangkat: expf, log2f, powf, sqrtf
    • Fungsi trigonometri dan hiperbolik: sinf, cosf, tanf, asinf, acosf, atan2f, tanhf

Meskipun beberapa platform dasar mendukung kemampuan tambahan, aplikasi nano tidak dianggap portabel di seluruh implementasi CHRE kecuali membatasi dependensi eksternal ke fungsi CHRE API dan library standar yang disetujui fungsi-fungsi lainnya.

Fitur opsional

Untuk mempromosikan perangkat keras dan perangkat lunak, CHRE API dibagi menjadi beberapa area fitur, yang dianggap opsional dari perspektif API. Meskipun fitur-fitur ini mungkin tidak diperlukan untuk mendukung implementasi CHRE yang kompatibel, yang diperlukan untuk mendukung aplikasi nano tertentu. Bahkan jika platform tidak mendukung satu set API tertentu, aplikasi nano yang mereferensikan fungsi tersebut dan memuat.

Sensor

CHRE API memberikan kemampuan untuk meminta data dari sensor termasuk akselerometer, giroskop, magnetometer, sensor cahaya sekitar, dan kedekatan. API ini dimaksudkan untuk menyediakan set fitur yang mirip dengan Sensor Android API, termasuk dukungan untuk mengelompokkan contoh sensor guna mengurangi konsumsi daya. Pemrosesan data sensor dalam CHRE memungkinkan daya yang jauh lebih rendah dan latensi yang lebih rendah pemrosesan sinyal gerakan bila dibandingkan dengan berjalan di AP.

GNSS

CHRE menyediakan API untuk meminta data lokasi dari navigasi global sistem satelit (GNSS), termasuk GPS dan rasi bintang lainnya. Ini termasuk permintaan perbaikan posisi berkala, serta data pengukuran mentah, meskipun keduanya adalah kemampuan independen. Karena CHRE memiliki link langsung ke GNSS subsistem, daya akan berkurang dibandingkan dengan permintaan GNSS berbasis AP, karena AP bisa tetap tertidur selama seluruh siklus proses sesi lokasi.

Wi-Fi

CHRE memberikan kemampuan untuk berinteraksi dengan {i>chip<i} Wi-Fi, terutama untuk lokasi untuk keperluan lokasi. Meskipun GNSS berfungsi dengan baik untuk lokasi luar ruangan, hasil dari Pemindaian Wi-Fi dapat memberikan informasi lokasi yang akurat di dalam dan di luar ruangan area tersebut. Selain menghindari biaya pengaktifan AP untuk pemindaian, CHRE dapat dengarkan hasil pemindaian Wi-Fi yang dilakukan oleh Wi-Fi {i>firmware<i} untuk keperluan konektivitas, yang biasanya tidak dikirimkan ke AP karena alasan listrik. Memanfaatkan pemindaian konektivitas untuk tujuan kontekstual membantu mengurangi jumlah total pemindaian Wi-Fi yang dilakukan, sehingga menghemat daya.

Dukungan untuk Wi-Fi ditambahkan di CHRE API v1.1, termasuk kemampuan untuk memantau memindai hasil dan memicu pemindaian sesuai permintaan. Kemampuan ini diperluas dalam v1.2 dengan kemampuan untuk melakukan Waktu Round-Trip (RTT) terhadap titik akses yang mendukung fitur tersebut, yang memungkinkan penentuan posisi relatif yang akurat.

WWAN

CHRE API memberikan kemampuan untuk mengambil informasi identifikasi sel untuk sel penyaluran dan tetangganya, yang biasanya digunakan untuk tujuan lokasi yang terperinci.

Audio

CHRE dapat memproses batch data audio dari mikrofon berdaya rendah, yang biasanya memanfaatkan perangkat keras yang digunakan untuk menerapkan HAL SoundTrigger. Memproses data audio dalam CHRE dapat memungkinkannya untuk digabungkan dengan data lain, seperti gerakan sensor.

Penerapan referensi

Kode referensi untuk framework CHRE disertakan dalam AOSP di system/chre , diimplementasikan dalam C++11. Meskipun tidak sepenuhnya diwajibkan, disarankan untuk semua implementasi CHRE didasarkan pada codebase ini, untuk membantu memastikan konsistensi dan mempercepat penerapan kemampuan baru. Kode ini dapat dilihat sebagai analog terhadap framework Android inti karena merupakan implementasi API yang digunakan aplikasi, yang berfungsi sebagai dasar pengukuran dan standar untuk kompatibilitas. Meskipun dapat disesuaikan dan diperluas dengan spesifik per vendor kemampuannya, rekomendasinya adalah untuk menjaga kode umum sedekat mungkin dengan referensi terbaik. Mirip dengan HAL Android, referensi CHRE menggunakan berbagai abstraksi platform agar dapat diadaptasikan dengan perangkat apa pun yang memenuhi persyaratan minimum.

Untuk detail teknis dan panduan transfer, lihat README disertakan dalam project system/chre.