Context Hub Runtime Environment (CHRE)

Smartphone berisi sejumlah prosesor, yang masing-masing dioptimalkan untuk melakukan tugas yang berbeda. Namun, Android hanya berjalan di satu prosesor: prosesor aplikasi (AP). AP dioptimalkan untuk memberikan performa yang luar biasa untuk kasus penggunaan layar aktif seperti game, tetapi terlalu boros daya untuk mendukung fitur yang memerlukan burst pemrosesan singkat yang sering, bahkan saat layar nonaktif. Prosesor yang lebih kecil dapat menangani beban kerja ini secara lebih efisien, menyelesaikan tugasnya tanpa memengaruhi masa pakai baterai secara signifikan. Namun, lingkungan software dalam prosesor berdaya rendah ini lebih terbatas dan bisa sangat bervariasi, sehingga sulit untuk melakukan pengembangan lintas platform.

Context Hub Runtime Environment (CHRE) menyediakan platform umum untuk menjalankan aplikasi di prosesor berdaya rendah, dengan API sederhana, terstandardisasi, dan ramah sematan. CHRE memudahkan OEM perangkat dan partner tepercaya mereka untuk memindahkan pemrosesan dari AP, menghemat baterai dan meningkatkan berbagai area pengalaman pengguna, serta memungkinkan class fitur yang selalu aktif dan kontekstual, terutama yang melibatkan penerapan machine learning ke deteksi standby.

Konsep utama

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

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

  • CHRE hanya mendukung pengoperasian nanoaplikasi yang dikembangkan dalam kode native (C atau C++); Java tidak didukung.
  • Karena keterbatasan resource dan batasan 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 penggunaan hardware yang sama untuk mengimplementasikan hub sensor dan CHRE sudah umum, CHRE itu sendiri tidak menyediakan kemampuan sensor yang diperlukan oleh HAL Sensor Android. CHRE terikat dengan HAL Context Hub, dan berfungsi sebagai klien framework sensor khusus perangkat untuk menerima data sensor tanpa melibatkan AP.

Arsitektur framework CHRE

Gambar 1. Arsitektur framework CHRE

HAL Context Hub

Lapisan abstraksi hardware (HAL) Context Hub adalah antarmuka antara framework Android dan implementasi CHRE perangkat, yang ditentukan di hardware/interfaces/contexthub. HAL Context Hub menentukan API yang digunakan framework Android untuk menemukan hub konteks yang tersedia dan nanoapp-nya, berinteraksi dengan nanoapp tersebut melalui penerusan pesan, dan memungkinkan nanoapp dimuat dan dimuat ulang. Implementasi referensi Context Hub HAL yang berfungsi dengan implementasi referensi CHRE tersedia di system/chre/host.

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

Inisialisasi

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

Memuat dan memuat ulang nanoapp

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

HAL Context Hub juga mendukung pemuatan dan penghapusan nanoapp secara dinamis saat runtime, melalui fungsi loadNanoApp() dan unloadNanoApp(). Nanoaplikasi disediakan ke HAL dalam format biner khusus untuk implementasi hardware dan software CHRE perangkat.

Jika implementasi untuk memuat nanoaplikasi melibatkan penulisan ke memori non-volatil, seperti penyimpanan flash yang terpasang ke prosesor yang menjalankan CHRE, maka implementasi CHRE harus selalu melakukan booting dengan nanoaplikasi dinamis ini dalam status dinonaktifkan. Artinya, tidak ada kode nanoapp yang dieksekusi hingga permintaan enableNanoapp() diterima melalui HAL. Nanoaplikasi yang telah dimuat sebelumnya dapat diinisialisasi dalam status aktif.

Mulai ulang hub konteks

Meskipun CHRE tidak diperkirakan akan dimulai ulang selama operasi normal, CHRE mungkin perlu dipulihkan dari kondisi yang tidak terduga seperti upaya untuk mengakses alamat memori yang tidak dipetakan. Dalam situasi ini, CHRE dimulai ulang secara independen dari Android. HAL memberi tahu Android tentang hal ini melalui peristiwa RESTARTED, yang hanya boleh dikirim setelah CHRE diinisialisasi ulang hingga dapat menerima permintaan baru, seperti queryApps().

Ringkasan sistem CHRE

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

Sistem build

Meskipun Context Hub HAL dan komponen sisi AP lainnya yang diperlukan di-build bersama Android, kode yang berjalan dalam CHRE dapat memiliki persyaratan yang membuatnya tidak kompatibel dengan sistem build Android, seperti kebutuhan akan toolchain khusus. Oleh karena itu, project CHRE di AOSP menyediakan sistem build yang disederhanakan berdasarkan GNU Make untuk mengompilasi nanoapp, dan, secara opsional, framework CHRE menjadi library 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 ke standar bahasa C99, dan implementasi referensinya menggunakan subset C++11 terbatas, yang cocok untuk aplikasi dengan resource terbatas.

API CHRE

CHRE API adalah kumpulan file header C yang menentukan antarmuka software antara nanoapp dan sistem. API ini dirancang untuk membuat kode nanoapp kompatibel di semua perangkat yang mendukung CHRE, yang berarti bahwa kode sumber untuk nanoapp tidak perlu diubah untuk mendukung jenis perangkat baru, meskipun mungkin perlu dikompilasi ulang secara khusus untuk set instruksi prosesor perangkat target atau antarmuka biner aplikasi (ABI). Arsitektur dan desain API CHRE juga memastikan bahwa nanoapp kompatibel dengan biner di berbagai versi CHRE API, yang berarti bahwa nanoapp tidak perlu dikompilasi ulang untuk berjalan di sistem yang mengimplementasikan versi CHRE API yang berbeda dibandingkan dengan API target yang digunakan untuk mengompilasi 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, biner nanoapp yang sama akan tetap berfungsi. Demikian pula, nanoapp dapat berjalan di CHRE API v1.2, dan dapat menentukan pada runtime apakah nanoapp memerlukan kemampuan dari API v1.3 untuk mencapai penggunaannya, atau apakah nanoapp dapat beroperasi, yang berpotensi dengan penurunan fitur halus.

Versi baru CHRE API dirilis bersama Android, tetapi karena implementasi CHRE adalah bagian dari implementasi vendor, versi CHRE API yang didukung di perangkat tidak harus ditautkan ke versi Android.

Ringkasan versi

Seperti skema pembuatan versi Android HIDL, CHRE API mengikuti pembuatan versi semantik. Versi utama menunjukkan kompatibilitas biner, sedangkan versi minor ditingkatkan saat 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 kapan perbaikan bug atau update minor dilakukan dalam implementasi.

Versi 1.0 (Android 7)

Mencakup dukungan untuk sensor, dan kemampuan nanoaplikasi 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, beserta peningkatan umum untuk memungkinkan komunikasi nanoaplikasi ke nanoaplikasi, dan peningkatan lainnya.

Versi 1.2 (Android 9)

Menambahkan dukungan untuk data dari mikrofon daya rendah, rentang RTT Wi-Fi, notifikasi aktif dan nonaktif AP, serta peningkatan lainnya.

Versi 1.3 (Android 10)

Meningkatkan kemampuan yang terkait dengan data kalibrasi sensor, menambahkan dukungan untuk menghapus data sensor secara massal sesuai permintaan, menentukan jenis sensor pendeteksi langkah, dan memperluas peristiwa lokasi GNSS dengan kolom 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 semua penerapan CHRE. Hal ini mencakup API sistem inti, seperti API untuk menetapkan timer, mengirim dan menerima pesan ke klien di prosesor aplikasi, logging, dan lainnya. Untuk mengetahui detail selengkapnya, lihat header API.

Selain fitur sistem inti yang terkodifikasi dalam CHRE API, ada juga fitur tingkat sistem CHRE wajib yang ditetapkan pada level HAL Context Hub. Yang paling signifikan adalah kemampuan untuk memuat dan memuat ulang nanoapp secara dinamis.

Library standar C/C++

Untuk meminimalkan penggunaan memori dan kompleksitas sistem, implementasi CHRE harus hanya mendukung subset library C dan C++ standar serta fitur bahasa yang memerlukan dukungan runtime. Dengan mengikuti prinsip-prinsip ini, beberapa fitur dikecualikan secara eksplisit karena memori dan dependensi tingkat OS yang luas, dan fitur lainnya karena diganti oleh API khusus CHRE yang lebih sesuai. Meskipun bukan daftar lengkap, kemampuan berikut tidak dimaksudkan untuk disediakan bagi nanoaplikasi:

  • 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 Ekspresi Reguler Standar C++
  • Alokasi memori dinamis melalui fungsi standar (misalnya, malloc, calloc, realloc, free, operator new), dan fungsi library standar lainnya 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 disertakan dalam standar bahasa C99 atau C++11

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 logcat Android, tempat program yang lebih tradisional mungkin menggunakan printf atau std::cout.

Sebaliknya, beberapa kemampuan library standar diperlukan. Implementasi platform merupakan penentu untuk mengeksposnya melalui library statis untuk disertakan dalam biner nanoapp, atau dengan penautan dinamis antara nanoapp dan sistem. Hal ini mencakup, 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, nanoapp tidak dianggap portabel di seluruh implementasi CHRE kecuali jika membatasi dependensi eksternalnya ke fungsi CHRE API dan fungsi library standar yang disetujui.

Fitur opsional

Untuk mempromosikan hardware dan software, CHRE API dibagi menjadi area fitur, yang dianggap opsional dari perspektif API. Meskipun fitur ini mungkin tidak diperlukan untuk mendukung implementasi CHRE yang kompatibel, fitur ini mungkin diperlukan untuk mendukung nanoapp tertentu. Meskipun platform tidak mendukung kumpulan API tertentu, nanoapp yang mereferensikan fungsi tersebut harus dapat mem-build dan memuat.

Sensor

CHRE API menyediakan kemampuan untuk meminta data dari sensor, termasuk akselerometer, giroskop, magnetometer, sensor cahaya sekitar, dan kedekatan. API ini dimaksudkan untuk menyediakan kumpulan fitur yang mirip dengan API Sensor Android, termasuk dukungan untuk menggabungkan sampel sensor guna mengurangi konsumsi daya. Pemrosesan data sensor dalam CHRE memungkinkan daya yang jauh lebih rendah dan pemrosesan latensi sinyal gerakan yang 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 link langsung ke subsistem GNSS, daya akan berkurang dibandingkan dengan permintaan GNSS berbasis AP, karena AP dapat tetap tidur selama seluruh siklus proses sesi lokasi.

Wi-Fi

CHRE menyediakan kemampuan untuk berinteraksi dengan chip Wi-Fi, terutama untuk tujuan lokasi. Meskipun GNSS berfungsi dengan baik untuk lokasi di luar ruangan, hasil pemindaian Wi-Fi dapat memberikan informasi lokasi yang akurat di dalam ruangan dan di area yang berkembang. Selain menghindari biaya untuk mengaktifkan AP guna melakukan pemindaian, CHRE dapat mendengarkan hasil pemindaian Wi-Fi yang dilakukan oleh firmware Wi-Fi untuk tujuan konektivitas, yang biasanya tidak dikirim 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 untuk melakukan pengukuran Round-Trip Time (RTT) terhadap titik akses yang mendukung fitur ini, yang memungkinkan penentuan posisi relatif yang akurat.

WWAN

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

Audio

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

Penerapan referensi

Kode referensi untuk framework CHRE disertakan dalam AOSP dalam project system/chre, yang diimplementasikan dalam C++11. Meskipun tidak wajib, sebaiknya semua implementasi CHRE didasarkan pada codebase ini, untuk membantu memastikan konsistensi dan mempercepat adopsi kemampuan baru. Kode ini dapat dilihat sebagai analog dengan framework Android inti karena merupakan implementasi open source dari API yang digunakan aplikasi, yang berfungsi sebagai dasar pengukuran dan standar untuk kompatibilitas. Meskipun dapat disesuaikan dan diperluas dengan kemampuan khusus vendor, rekomendasinya adalah mempertahankan kode umum sedekat mungkin dengan referensi. Serupa dengan HAL Android, implementasi referensi CHRE menggunakan berbagai abstraksi platform agar dapat diadaptasi dengan perangkat apa pun yang memenuhi persyaratan minimum.

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