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.
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, 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 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
- Operasi dasar:
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
.