Smartphone berisi sejumlah prosesor, yang masing-masing dioptimalkan untuk melakukan tugas yang berbeda. Namun, Android hanya berjalan di satu prosesor: prosesor aplikasi (AP). AP disetel untuk memberikan performa yang sangat baik untuk kasus penggunaan layar aktif seperti bermain game, tetapi terlalu boros daya untuk mendukung fitur yang memerlukan pemrosesan singkat dan sering sepanjang waktu, bahkan saat layar nonaktif. Prosesor yang lebih kecil dapat menangani beban kerja ini secara lebih efisien, menyelesaikan tugasnya tanpa memengaruhi daya tahan baterai secara signifikan. Namun, lingkungan software di prosesor berdaya rendah ini lebih terbatas dan dapat sangat bervariasi, sehingga menyulitkan pengembangan lintas platform.
Context Hub Runtime Environment (CHRE) menyediakan platform umum untuk menjalankan aplikasi di prosesor berdaya rendah, dengan API yang sederhana, standar, dan kompatibel untuk sistem sematan. CHRE memudahkan OEM perangkat dan partner tepercaya mereka untuk memindahkan pemrosesan dari AP, guna menghemat baterai dan meningkatkan berbagai aspek pengalaman pengguna, serta mengaktifkan serangkaian fitur selalu aktif yang sadar konteks, terutama yang melibatkan penerapan machine learning pada penginderaan sekitar.
Konsep utama
CHRE adalah lingkungan software tempat aplikasi native kecil, yang disebut
nanoapps, dieksekusi pada prosesor berdaya rendah dan berinteraksi dengan
sistem yang mendasarinya melalui CHRE API umum. Untuk mempercepat penerapan yang tepat dari
CHRE API, penerapan referensi lintas platform CHRE disertakan dalam
AOSP. Implementasi referensi mencakup kode dan abstraksi umum ke hardware dan software yang mendasarinya melalui serangkaian lapisan abstraksi platform (PAL). Nanoaplikasi hampir selalu terikat ke satu atau beberapa aplikasi klien yang berjalan di
Android, yang berinteraksi dengan CHRE dan nanoaplikasi melalui
ContextHubManager
API sistem dengan akses terbatas.
Secara umum, kesamaan dapat ditarik antara arsitektur CHRE dan Android secara keseluruhan. Namun, ada beberapa perbedaan penting:
- CHRE hanya mendukung menjalankan aplikasi nano yang dikembangkan dalam kode native (C atau C++); Java tidak didukung.
- Karena batasan keamanan dan kendala resource, CHRE tidak dapat digunakan oleh aplikasi Android pihak ketiga yang tidak sah. Hanya aplikasi yang dipercaya sistem yang dapat mengaksesnya.
Ada juga perbedaan penting yang harus dibuat antara konsep CHRE dan hub sensor. Meskipun umum untuk menggunakan hardware yang sama untuk mengimplementasikan hub sensor dan CHRE, 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.
Gambar 1. Arsitektur framework CHRE
HAL Hub Konteks
Hardware abstraction layer (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 nanoaplikasinya, berinteraksi dengan nanoaplikasi tersebut melalui penerusan pesan, serta memungkinkan nanoaplikasi dimuat dan dibongkar. Implementasi referensi HAL Context Hub 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 di-boot, ContextHubService
memanggil fungsi HAL getHubs()
untuk menentukan apakah ada hub konteks yang
tersedia di perangkat. Ini adalah panggilan satu kali yang memblokir, sehingga harus diselesaikan dengan cepat untuk menghindari penundaan booting, dan harus menampilkan hasil yang akurat, karena hub konteks baru tidak dapat diperkenalkan setelahnya.
Memuat dan menurunkan muatan aplikasi nano
Hub konteks dapat mencakup serangkaian aplikasi nano yang disertakan dalam image
perangkat dan dimuat saat CHRE dimulai. Nanoaplikasi ini dikenal sebagai nanoaplikasi yang sudah dimuat sebelumnya,
dan harus disertakan dalam respons pertama yang mungkin untuk queryApps()
.
HAL Context Hub juga mendukung pemuatan dan pembongkaran nanoaplikasi secara dinamis saat
runtime, melalui fungsi loadNanoApp()
dan unloadNanoApp()
. Aplikasi nano
disediakan untuk HAL dalam format biner khusus untuk hardware CHRE dan
implementasi software perangkat.
Jika penerapan untuk memuat nanoaplikasi melibatkan penulisan ke memori
non-volatile, seperti penyimpanan flash yang terpasang ke prosesor yang menjalankan CHRE, maka penerapan CHRE harus selalu di-boot dengan nanoaplikasi dinamis ini dalam keadaan dinonaktifkan. Artinya, tidak ada kode nanoapp yang dieksekusi hingga permintaan
enableNanoapp()
diterima melalui HAL. Nanoaplikasi yang sudah dimuat sebelumnya dapat diinisialisasi dalam status aktif.
Hub konteks dimulai ulang
Meskipun CHRE tidak diharapkan untuk 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 harus dikirim hanya setelah CHRE diinisialisasi ulang hingga dapat menerima permintaan baru, seperti queryApps()
.
Ringkasan sistem CHRE
CHRE didesain berdasarkan arsitektur berbasis peristiwa, dengan unit komputasi utama adalah peristiwa yang diteruskan ke titik entri penanganan peristiwa nanoaplikasi. Meskipun framework CHRE dapat berupa multithread, nanoapp tertentu tidak pernah dieksekusi dari beberapa thread secara paralel. Framework CHRE berinteraksi dengan nanoapp tertentu melalui salah satu dari tiga titik entri nanoapp (nanoappStart()
, nanoappHandleEvent()
, dan nanoappEnd()
) atau melalui callback yang disediakan dalam panggilan CHRE API sebelumnya, dan nanoapp 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, dan dapat diperluas dengan kemampuan tambahan khusus vendor untuk digunakan oleh nanoaplikasi khusus vendor.
Sistem build
Meskipun Context Hub HAL dan komponen sisi AP lainnya yang diperlukan dibangun 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 ke dalam 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 sesuai standar bahasa C99, dan implementasi referensi menggunakan subset C++11 terbatas yang cocok untuk aplikasi dengan sumber daya terbatas.
CHRE API
CHRE API adalah kumpulan file header C yang menentukan antarmuka software antara nanoaplikasi dan sistem. Dirancang agar kode nanoaplikasi kompatibel di semua perangkat yang mendukung CHRE, yang berarti kode sumber untuk nanoaplikasi tidak perlu diubah untuk mendukung jenis perangkat baru, meskipun mungkin perlu dikompilasi ulang secara khusus untuk set instruksi prosesor atau antarmuka biner aplikasi (ABI) perangkat target. Arsitektur dan desain API CHRE juga memastikan bahwa nanoaplikasi kompatibel secara biner di berbagai versi CHRE API, yang berarti bahwa nanoaplikasi tidak perlu dikompilasi ulang untuk berjalan di sistem yang menerapkan versi CHRE API yang berbeda dibandingkan dengan API target yang digunakan untuk mengompilasi nanoaplikasi. 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 terus berfungsi. Demikian pula, aplikasi kecil dapat berjalan di CHRE API v1.2, dan dapat menentukan saat runtime apakah memerlukan kemampuan dari API v1.3 untuk mencapai penggunaannya, atau apakah dapat beroperasi, yang berpotensi mengalami penurunan kualitas fitur.
Versi baru CHRE API dirilis bersama Android, tetapi karena penerapan CHRE adalah bagian dari penerapan vendor, versi CHRE API yang didukung di perangkat tidak selalu terkait dengan versi Android.
Ringkasan versi
Seperti
skema penetapan versi HIDL Android,
CHRE API mengikuti penetapan versi semantik.
Versi utama menunjukkan kompatibilitas biner, sedangkan versi minor
ditambah saat fitur yang kompatibel mundur diperkenalkan. CHRE API mencakup 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 kecil 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 penyempurnaan umum untuk mengaktifkan komunikasi nanoapp-ke-nanoapp, dan peningkatan lainnya.
Versi 1.2 (Android 9)
Menambahkan dukungan untuk data dari mikrofon berdaya rendah, pengukuran jarak Wi-Fi RTT, notifikasi bangun dan tidur AP, serta peningkatan lainnya.
Versi 1.3 (Android 10)
Meningkatkan kemampuan terkait data kalibrasi sensor, menambahkan dukungan untuk menghapus data sensor yang di-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, 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 menyetel timer, mengirim dan menerima pesan ke klien di prosesor aplikasi, mencatat aktivitas, dan lainnya. Untuk mengetahui 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 di antaranya adalah kemampuan untuk memuat dan membatalkan pemuatan nanoaplikasi secara dinamis.
Library standar C/C++
Untuk meminimalkan penggunaan memori dan kompleksitas sistem, implementasi CHRE diwajibkan untuk mendukung hanya subset library C dan C++ standar serta fitur bahasa yang memerlukan dukungan runtime. Dengan mengikuti prinsip-prinsip ini, beberapa fitur secara eksplisit dikecualikan karena dependensi memori dan tingkat OS yang ekstensif, dan fitur lainnya karena digantikan oleh API khusus CHRE yang lebih sesuai. Meskipun bukan daftar lengkap, kemampuan berikut tidak dimaksudkan untuk tersedia di aplikasi nano:
- 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, sepertistd::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 lain 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 ditujukan ke sistem logcat Android, tempat program yang lebih tradisional dapat menggunakan printf
atau std::cout
.
Sebaliknya, beberapa kemampuan library standar diperlukan. Implementasi platform yang akan mengeksposnya melalui library statis untuk disertakan dalam biner nanoaplikasi, atau dengan penautan dinamis antara nanoaplikasi 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
- Operasi dasar:
Meskipun beberapa platform yang mendasarinya mendukung kemampuan tambahan, nanoapp tidak dianggap portabel di seluruh penerapan 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 penerapan CHRE yang kompatibel, fitur ini mungkin diperlukan untuk mendukung nanoapp tertentu. Meskipun platform tidak mendukung serangkaian API tertentu, nanoaplikasi yang mereferensikan fungsi tersebut harus dapat dibuat dan dimuat.
Sensor
CHRE API memberikan kemampuan untuk meminta data dari sensor, termasuk akselerometer, giroskop, magnetometer, sensor cahaya sekitar, dan kedekatan. 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 gerakan dengan daya yang jauh lebih rendah dan latensi yang lebih rendah dibandingkan dengan menjalankan di AP.
GNSS
CHRE menyediakan API untuk meminta data lokasi dari sistem navigasi satelit global (GNSS), termasuk GPS dan konstelasi satelit lainnya. Hal ini mencakup permintaan untuk perbaikan posisi berkala, serta data pengukuran mentah, meskipun keduanya adalah kemampuan independen. Karena CHRE memiliki link langsung ke subsistem GNSS, daya berkurang dibandingkan dengan permintaan GNSS berbasis AP, karena AP dapat tetap dalam mode tidur selama seluruh siklus proses sesi lokasi.
Wi-Fi
CHRE memberikan 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 yang sudah dibangun. Selain menghindari biaya membangunkan AP untuk pemindaian, CHRE dapat memantau 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 untuk melakukan pengukuran Round-Trip Time (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 penayangan dan tetangganya, yang biasanya digunakan untuk tujuan lokasi dengan perincian kasar.
Audio
CHRE dapat memproses batch data audio dari mikrofon berdaya rendah, yang biasanya memanfaatkan hardware yang digunakan untuk menerapkan SoundTrigger HAL. Memproses data audio di CHRE dapat memungkinkan data tersebut digabungkan dengan data lain, seperti sensor gerak.
Implementasi referensi
Kode referensi untuk framework CHRE disertakan dalam AOSP di project system/chre
, yang diimplementasikan di C++11. Meskipun tidak wajib, semua implementasi CHRE sebaiknya didasarkan pada codebase ini untuk membantu memastikan konsistensi dan mempercepat adopsi kemampuan baru. Kode ini dapat dilihat
sebagai analogi dengan framework Android inti karena merupakan implementasi
API open source yang digunakan aplikasi, yang berfungsi sebagai dasar dan standar
untuk kompatibilitas. Meskipun dapat disesuaikan dan diperluas dengan kemampuan khusus vendor, sebaiknya pertahankan kode umum sedekat mungkin dengan referensi. Mirip dengan HAL Android, implementasi referensi CHRE menggunakan berbagai abstraksi platform agar dapat diadaptasi ke perangkat apa pun yang memenuhi persyaratan minimum.
Untuk mengetahui detail teknis dan panduan porting, lihat
README
yang disertakan dalam project system/chre
.