Lingkungan Runtime Hub Konteks (CHRE)

Ponsel cerdas berisi sejumlah prosesor, masing-masing dioptimalkan untuk melakukan tugas berbeda. Namun, Android hanya berjalan pada satu prosesor: prosesor aplikasi (AP). AP dirancang untuk memberikan kinerja luar biasa untuk kasus penggunaan layar aktif seperti bermain game, namun terlalu haus daya untuk mendukung fitur yang memerlukan pemrosesan cepat dan sering sepanjang waktu, bahkan saat layar mati. Prosesor yang lebih kecil mampu menangani beban kerja ini dengan lebih efisien, menyelesaikan tugasnya tanpa berdampak besar pada masa pakai baterai. Namun, lingkungan perangkat lunak pada prosesor berdaya rendah ini lebih terbatas dan dapat sangat bervariasi, sehingga membuat pengembangan lintas platform menjadi sulit.

Context Hub Runtime Environment (CHRE) menyediakan platform umum untuk menjalankan aplikasi pada prosesor berdaya rendah, dengan API yang sederhana, terstandar, dan ramah tertanam. CHRE memudahkan OEM perangkat dan mitra tepercaya mereka untuk memindahkan pemrosesan dari AP, untuk menghemat baterai dan meningkatkan berbagai bidang pengalaman pengguna, dan mengaktifkan serangkaian fitur yang selalu aktif dan sadar konteks, terutama yang melibatkan penerapan mesin belajar penginderaan lingkungan.

Konsep-konsep kunci

CHRE adalah lingkungan perangkat lunak tempat aplikasi asli kecil, yang disebut nanoapps , dijalankan pada prosesor berdaya rendah dan berinteraksi dengan sistem yang mendasarinya melalui API CHRE umum. Untuk mempercepat implementasi CHRE API yang tepat, implementasi referensi lintas platform 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 dikaitkan dengan satu atau lebih aplikasi klien yang berjalan di Android, yang berinteraksi dengan CHRE dan nanoapps melalui API sistem ContextHubManager dengan akses terbatas.

Pada tingkat tinggi, persamaan dapat ditarik antara arsitektur CHRE dan Android secara keseluruhan. Namun, ada beberapa perbedaan penting:

  • CHRE hanya mendukung menjalankan aplikasi nano yang dikembangkan dalam kode asli (C atau C++); Java tidak didukung.
  • Karena keterbatasan sumber daya dan batasan keamanan, CHRE tidak terbuka untuk digunakan oleh aplikasi Android pihak ketiga yang sewenang-wenang. Hanya aplikasi tepercaya sistem yang dapat mengaksesnya.

Ada juga perbedaan penting yang harus dibuat antara konsep CHRE dan hub sensor. Meskipun biasanya menggunakan perangkat keras yang sama untuk mengimplementasikan hub sensor dan CHRE, CHRE sendiri tidak menyediakan fungsionalitas sensor yang dibutuhkan oleh Android Sensors HAL . CHRE terikat dengan Context Hub HAL, dan bertindak sebagai klien kerangka sensor khusus perangkat untuk menerima data sensor tanpa melibatkan AP.

Arsitektur kerangka CHRE

Gambar 1. Arsitektur kerangka CHRE

Pusat Konteks HAL

Lapisan abstraksi perangkat keras Context Hub (HAL) adalah antarmuka antara kerangka kerja Android dan implementasi CHRE perangkat, yang ditentukan di hardware/interfaces/contexthub . Context Hub HAL mendefinisikan API yang digunakan framework Android untuk menemukan hub konteks yang tersedia dan nanoappsnya, berinteraksi dengan nanoapps tersebut melalui penyampaian pesan, dan memungkinkan nanoapps dimuat dan diturunkan. Implementasi referensi dari Context Hub HAL yang bekerja dengan implementasi referensi CHRE tersedia di system/chre/host .

Jika terjadi konflik antara dokumentasi ini dan definisi HAL, maka definisi HAL akan diutamakan.

Inisialisasi

Saat Android melakukan booting, ContextHubService memanggil fungsi getHubs() HAL untuk menentukan apakah ada hub konteks yang tersedia di perangkat. Ini adalah panggilan satu kali pemblokiran, sehingga harus diselesaikan dengan cepat untuk menghindari penundaan boot, dan harus memberikan hasil yang akurat, karena hub konteks baru tidak dapat diperkenalkan setelahnya.

Memuat dan membongkar aplikasi nano

Hub konteks dapat menyertakan sekumpulan aplikasi nano yang disertakan dalam gambar perangkat dan dimuat saat CHRE dimulai. Ini dikenal sebagai nanoapps yang dimuat sebelumnya, dan harus disertakan dalam respons pertama terhadap queryApps() .

Context Hub HAL juga mendukung memuat dan membongkar nanoapps secara dinamis saat runtime, melalui fungsi loadNanoApp() dan unloadNanoApp() . Nanoapps disediakan untuk HAL dalam format biner khusus untuk implementasi perangkat keras dan perangkat lunak CHRE pada perangkat.

Jika implementasi untuk memuat aplikasi nano melibatkan penulisannya ke memori nonvolatile, seperti penyimpanan flash yang terpasang pada prosesor yang menjalankan CHRE, maka implementasi CHRE harus selalu boot dengan aplikasi nano dinamis ini dalam keadaan nonaktif. Artinya, tidak ada kode nanoapp yang dieksekusi hingga permintaan enableNanoapp() diterima melalui HAL. Aplikasi nano yang dimuat sebelumnya dapat diinisialisasi dalam keadaan diaktifkan.

Hub konteks dimulai ulang

Meskipun CHRE tidak diharapkan untuk memulai ulang selama operasi normal, CHRE mungkin perlu pulih dari kondisi yang tidak terduga seperti upaya untuk mengakses alamat memori yang belum dipetakan. Dalam situasi ini, CHRE memulai ulang secara independen dari Android. HAL memberi tahu Android mengenai hal ini melalui peristiwa RESTARTED , yang harus dikirim hanya setelah CHRE diinisialisasi ulang hingga dapat menerima permintaan baru, seperti queryApps() .

Ikhtisar sistem CHRE

CHRE dirancang berdasarkan arsitektur berbasis peristiwa, di mana unit komputasi utama adalah peristiwa yang diteruskan ke titik masuk penanganan peristiwa aplikasi nano. Meskipun kerangka CHRE dapat berupa multithread, aplikasi nano tertentu tidak pernah dijalankan dari beberapa thread secara paralel. Kerangka kerja CHRE berinteraksi dengan nanoapp tertentu melalui salah satu dari tiga titik masuk nanoapp ( nanoappStart() , nanoappHandleEvent() , dan nanoappEnd() ) atau melalui callback yang disediakan dalam panggilan API CHRE sebelumnya, dan nanoapps berinteraksi dengan kerangka CHRE dan sistem yang mendasarinya melalui CHRE API. CHRE API menyediakan serangkaian fungsionalitas dasar serta fasilitas untuk mengakses sinyal kontekstual, termasuk sensor, GNSS, Wi-Fi, WWAN, dan audio, dan dapat diperluas dengan kemampuan tambahan khusus vendor untuk digunakan oleh nanoapps khusus vendor .

Membangun sistem

Meskipun Context Hub HAL dan komponen sisi AP lain yang diperlukan dibuat bersama Android, kode yang dijalankan dalam CHRE dapat memiliki persyaratan yang membuatnya tidak kompatibel dengan sistem build Android, seperti kebutuhan akan toolchain khusus. Oleh karena itu, proyek CHRE di AOSP menyediakan sistem pembangunan yang disederhanakan berdasarkan GNU Make untuk mengkompilasi aplikasi nano, dan, secara opsional, kerangka CHRE ke dalam perpustakaan yang dapat diintegrasikan dengan sistem. Produsen perangkat yang menambahkan dukungan untuk CHRE harus mengintegrasikan dukungan sistem build untuk perangkat target mereka ke dalam AOSP.

CHRE API ditulis dengan standar bahasa C99, dan implementasi referensi menggunakan subset terbatas dari C++11 yang cocok untuk aplikasi dengan sumber daya terbatas.

API CHRE

CHRE API adalah kumpulan file header C yang menentukan antarmuka perangkat lunak antara nanoapp dan sistem. Ini dirancang untuk membuat kode nanoapps kompatibel di semua perangkat yang mendukung CHRE, yang berarti bahwa kode sumber untuk nanoapp tidak perlu dimodifikasi untuk mendukung jenis perangkat baru, meskipun mungkin perlu dikompilasi ulang secara khusus untuk prosesor perangkat target. set instruksi atau antarmuka biner aplikasi (ABI). Arsitektur CHRE dan desain API juga memastikan bahwa nanoapps kompatibel dengan biner di berbagai versi CHRE API, yang berarti bahwa nanoapp tidak perlu dikompilasi ulang untuk berjalan pada sistem yang mengimplementasikan versi CHRE API yang berbeda dibandingkan dengan API target tempat nanoapp dikompilasi. Dengan kata lain, jika biner nanoapp berjalan pada perangkat yang mendukung CHRE API v1.3, dan perangkat tersebut ditingkatkan untuk mendukung CHRE API v1.4, biner nanoapp yang sama akan terus berfungsi. Demikian pula, nanoapp dapat berjalan di CHRE API v1.2, dan dapat menentukan pada saat runtime apakah aplikasi tersebut memerlukan fungsionalitas dari API v1.3 untuk mencapai fungsionalitasnya, atau apakah aplikasi tersebut dapat beroperasi, yang berpotensi mengalami degradasi fitur yang baik.

Versi baru CHRE API dirilis bersamaan dengan Android, namun karena implementasi CHRE adalah bagian dari implementasi vendor , versi CHRE API yang didukung pada perangkat belum tentu tertaut ke versi Android.

Ringkasan versi

Seperti skema pembuatan versi Android HIDL , CHRE API mengikuti pembuatan versi semantik . Versi mayor menunjukkan kompatibilitas biner, sedangkan versi minor bertambah ketika fitur-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 memaparkan versi patch khusus platform melalui chreGetVersion() , yang menunjukkan kapan perbaikan bug atau pembaruan kecil dilakukan dalam implementasi.

Versi 1.0 (Android 7)

Termasuk dukungan untuk sensor, dan fungsionalitas inti nanoapp, seperti acara dan pengatur waktu.

Versi 1.1 (Android 8)

Memperkenalkan kemampuan lokasi melalui lokasi GNSS dan pengukuran mentah, pemindaian Wi-Fi, dan informasi jaringan seluler, serta penyempurnaan umum untuk memungkinkan komunikasi nanoapp-to-nanoapp, dan peningkatan lainnya.

Versi 1.2 (Android 9)

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

Versi 1.3 (Android 10)

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

Versi 1.4 (Android 11)

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

Fitur sistem wajib

Meskipun sumber sinyal kontekstual, seperti sensor, dikategorikan ke dalam area fitur opsional, beberapa fungsi inti diperlukan di seluruh implementasi CHRE. Ini termasuk API sistem inti, seperti untuk mengatur timer, mengirim dan menerima pesan ke klien pada prosesor aplikasi, logging, dan lain-lain. Untuk detail selengkapnya, lihat header API .

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

Pustaka standar C/C++

Untuk meminimalkan penggunaan memori dan kompleksitas sistem, implementasi CHRE diperlukan untuk mendukung hanya sebagian dari pustaka C dan C++ standar serta fitur bahasa yang memerlukan dukungan runtime. Mengikuti prinsip-prinsip ini, beberapa fitur secara eksplisit dikecualikan karena memorinya dan/atau ketergantungan tingkat OS yang luas, dan fitur lainnya karena digantikan oleh API khusus CHRE yang lebih sesuai. Meskipun tidak dimaksudkan sebagai daftar yang lengkap, kemampuan berikut tidak dimaksudkan untuk tersedia bagi aplikasi nano:

  • Pengecualian C++ dan informasi tipe runtime (RTTI)
  • Dukungan multithreading pustaka standar, termasuk header C++11 <thread> , <mutex> , <atomic> , <future>
  • Pustaka Input/Output Standar C dan C++
  • Perpustakaan Templat Standar C++ (STL)
  • Pustaka Ekspresi Reguler Standar C++
  • Alokasi memori dinamis melalui fungsi standar (misalnya, malloc , calloc , realloc , free , operator new ), dan fungsi perpustakaan standar lainnya yang secara inheren menggunakan alokasi dinamis, seperti std::unique_ptr
  • Dukungan lokalisasi dan karakter Unicode
  • Perpustakaan 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 perpustakaan lain yang tidak termasuk dalam standar bahasa C99 atau C++11

Dalam banyak kasus, fungsionalitas setara tersedia dari fungsi CHRE API dan/atau pustaka utilitas. Misalnya, chreLog dapat digunakan untuk logging debug yang ditargetkan ke sistem logcat Android, dimana program yang lebih tradisional mungkin menggunakan printf atau std::cout .

Sebaliknya, beberapa fungsi perpustakaan standar diperlukan. Terserah pada implementasi platform untuk mengekspos hal ini melalui perpustakaan statis untuk dimasukkan dalam biner nanoapp, atau dengan menghubungkan dinamis antara nanoapp dan sistem. Ini termasuk, namun tidak terbatas pada:

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

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

Meskipun beberapa platform yang mendasarinya mendukung fungsionalitas tambahan, aplikasi nano tidak dianggap portabel di seluruh implementasi CHRE kecuali jika ia membatasi ketergantungan eksternalnya pada fungsi CHRE API dan fungsi perpustakaan standar yang disetujui.

Fitur pilihan

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, fitur-fitur ini mungkin diperlukan untuk mendukung aplikasi nano tertentu. Meskipun platform tidak mendukung serangkaian API tertentu, aplikasi nano yang mereferensikan fungsi tersebut harus dapat dibuat dan dimuat.

Sensor

CHRE API menyediakan kemampuan untuk meminta data dari sensor termasuk akselerometer, giroskop, magnetometer, sensor cahaya sekitar, dan jarak. API ini dimaksudkan untuk menyediakan serangkaian fitur yang mirip dengan Android Sensors API, termasuk dukungan untuk pengelompokan sampel sensor guna mengurangi konsumsi daya. Memproses data sensor dalam CHRE memungkinkan pemrosesan sinyal gerak dengan daya dan latensi yang jauh lebih rendah dibandingkan dengan berjalan di AP.

GNSS

CHRE menyediakan API untuk meminta data lokasi dari sistem satelit navigasi global (GNSS), termasuk GPS dan konstelasi satelit lainnya. Hal ini mencakup permintaan untuk perbaikan posisi berkala, serta data pengukuran mentah, meskipun keduanya merupakan kemampuan independen. Karena CHRE memiliki tautan langsung ke subsistem GNSS, daya berkurang dibandingkan permintaan GNSS berbasis AP, karena AP dapat tetap tertidur selama seluruh siklus hidup sesi lokasi.

Wifi

CHRE menyediakan kemampuan untuk berinteraksi dengan chip Wi-Fi, terutama untuk tujuan lokasi. Meskipun GNSS berfungsi dengan baik untuk lokasi luar ruangan, hasil pemindaian Wi-Fi dapat memberikan informasi lokasi yang akurat di dalam ruangan dan di area maju. Selain menghindari biaya membangunkan AP untuk pemindaian, CHRE dapat mendengarkan hasil pemindaian Wi-Fi yang dilakukan oleh firmware Wi-Fi untuk tujuan konektivitas, yang biasanya tidak dikirimkan ke AP karena alasan daya. 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 hasil pemindaian dan memicu pemindaian sesuai permintaan. Kemampuan ini diperluas di v1.2 dengan kemampuan melakukan pengukuran Round-Trip Time (RTT) terhadap titik akses yang mendukung fitur tersebut, sehingga memungkinkan penentuan posisi relatif akurat.

WWAN

CHRE API menyediakan kemampuan untuk mengambil informasi identifikasi sel untuk sel yang melayani dan tetangganya, yang biasanya digunakan untuk tujuan lokasi kasar.

Audio

CHRE dapat memproses kumpulan data audio dari mikrofon berdaya rendah, yang biasanya memanfaatkan perangkat keras yang digunakan untuk mengimplementasikan SoundTrigger HAL. Pemrosesan data audio di CHRE memungkinkannya digabungkan dengan data lain, seperti sensor gerak.

Implementasi referensi

Kode referensi untuk kerangka CHRE disertakan dalam AOSP dalam proyek system/chre , diimplementasikan dalam C++11. Meskipun tidak sepenuhnya diwajibkan, disarankan agar semua implementasi CHRE didasarkan pada basis kode ini, untuk membantu memastikan konsistensi dan mempercepat penerapan kemampuan baru. Kode ini dapat dilihat sebagai analogi kerangka kerja inti Android yang merupakan implementasi API sumber terbuka yang digunakan aplikasi, yang berfungsi sebagai dasar dan standar kompatibilitas. Meskipun dapat disesuaikan dan diperluas dengan kemampuan spesifik vendor, rekomendasinya adalah menjaga kode umum sedekat mungkin dengan referensi. Mirip dengan HAL Android, implementasi referensi CHRE menggunakan berbagai abstraksi platform untuk memungkinkannya diadaptasi ke perangkat apa pun yang memenuhi persyaratan minimum.

Untuk detail teknis dan panduan porting, lihat README yang disertakan dalam proyek system/chre .