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 game, tetapi terlalu boros daya untuk mendukung fitur yang memerlukan pemrosesan yang sering dan singkat sepanjang waktu, bahkan saat layar mati. Prosesor yang lebih kecil dapat menangani beban kerja ini dengan lebih efisien, menyelesaikan tugasnya tanpa memengaruhi masa pakai 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 ramah untuk perangkat sematan. CHRE memudahkan OEM perangkat dan partner tepercaya mereka untuk mengalihkan pemrosesan dari AP, menghemat baterai, dan meningkatkan berbagai aspek pengalaman pengguna, serta mengaktifkan class fitur yang selalu aktif dan kontekstual, terutama yang melibatkan penerapan machine learning ke penginderaan lingkungan.
Konsep utama
CHRE adalah lingkungan software tempat aplikasi native kecil, yang disebut
nanoapp, dieksekusi pada 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 ke hardware dan software yang mendasarinya melalui serangkaian lapisan abstraksi platform (PAL). Nanoapp hampir selalu terikat ke satu atau beberapa aplikasi klien yang berjalan di
Android, yang berinteraksi dengan CHRE dan nanoapp melalui akses terbatas
ContextHubManager
API sistem.
Pada tingkat tinggi, kesamaan dapat ditarik antara arsitektur CHRE dan Android secara keseluruhan. Namun, ada beberapa perbedaan penting:
- CHRE hanya mendukung menjalankan nanoapp yang dikembangkan dalam kode native (C atau C++); Java tidak didukung.
- Karena batasan resource dan batasan keamanan, CHRE tidak terbuka untuk digunakan oleh aplikasi Android pihak ketiga arbitrer. Hanya aplikasi yang dipercaya sistem yang dapat mengaksesnya.
Ada juga perbedaan penting yang harus dibuat antara konsep CHRE dan hub sensor. Meskipun umum menggunakan hardware yang sama untuk mengimplementasikan hub sensor dan CHRE, CHRE itu sendiri tidak menyediakan kemampuan sensor yang diperlukan oleh Android Sensors HAL. CHRE terikat ke Context Hub HAL, dan bertindak sebagai klien framework sensor khusus perangkat untuk menerima data sensor tanpa melibatkan AP.
Gambar 1. Arsitektur framework CHRE
Context Hub 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 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 diturunkan muatannya. 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
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 nanoapp
Hub konteks dapat menyertakan sekumpulan nanoapp yang disertakan dalam image perangkat dan dimuat saat CHRE dimulai. Nanoapp ini dikenal sebagai nanoapp yang telah dimuat sebelumnya, dan harus disertakan dalam respons pertama yang mungkin untuk queryApps().
Context Hub HAL juga mendukung pemuatan dan penurunan muatan nanoapp secara dinamis saat
runtime, melalui fungsi loadNanoApp() dan unloadNanoApp(). Nanoapp disediakan ke HAL dalam format biner khusus untuk implementasi hardware dan software CHRE perangkat.
Jika implementasi untuk memuat nanoapp melibatkan penulisan ke memori non-volatil, seperti penyimpanan flash yang terpasang ke prosesor yang menjalankan CHRE, implementasi CHRE harus selalu melakukan booting dengan nanoapp dinamis ini dalam status dinonaktifkan. Artinya, tidak ada kode nanoapp yang dieksekusi hingga permintaan enableNanoapp() diterima melalui HAL. Nanoapp yang telah dimuat sebelumnya dapat diinisialisasi dalam status diaktifkan.
Mulai ulang hub konteks
Meskipun CHRE tidak diharapkan untuk memulai 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 dirancang berdasarkan arsitektur berbasis peristiwa, dengan unit komputasi utama adalah peristiwa yang diteruskan ke titik entri penanganan peristiwa nanoapp. Meskipun framework CHRE dapat 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 API CHRE 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, serta dapat diperluas dengan kemampuan khusus vendor tambahan untuk digunakan oleh nanoapp khusus vendor.
Sistem build
Meskipun Context Hub HAL dan komponen sisi AP lain yang diperlukan dibuat 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 AOSP.
CHRE API ditulis ke standar bahasa C99, dan implementasi referensi menggunakan subkumpulan C++11 terbatas yang sesuai untuk aplikasi dengan resource terbatas.
CHRE API
CHRE API adalah kumpulan file header C yang menentukan antarmuka software antara nanoapp dan sistem. CHRE API dirancang untuk membuat kode nanoapp kompatibel di semua perangkat yang mendukung CHRE, yang berarti kode sumber untuk nanoapp tidak perlu diubah untuk mendukung jenis perangkat baru, meskipun mungkin perlu dikompilasi ulang secara khusus untuk kumpulan petunjuk prosesor perangkat target atau antarmuka biner aplikasi (ABI). Arsitektur CHRE dan desain API juga memastikan bahwa nanoapp kompatibel secara biner di berbagai versi CHRE API, yang berarti 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 terus berfungsi. Demikian pula, nanoapp 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 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 HIDL Android,
CHRE API mengikuti pembuatan versi semantik.
Versi utama menunjukkan kompatibilitas biner, sedangkan versi minor bertambah saat fitur yang kompatibel dengan versi sebelumnya diperkenalkan. CHRE API menyertakan anotasi kode sumber untuk mengidentifikasi versi 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.
Untuk ringkasan setiap versi, lihat version.h.
Fitur sistem wajib
Meskipun sumber sinyal kontekstual, seperti sensor, dikategorikan ke dalam area fitur opsional, beberapa fungsi inti diperlukan di semua implementasi 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 dikodifikasi dalam CHRE API, ada juga fitur tingkat sistem CHRE wajib yang ditentukan di tingkat Context Hub HAL. Yang paling signifikan di antaranya adalah kemampuan untuk memuat dan menurunkan muatan nanoapp secara dinamis.
Library standar C/C++
Untuk meminimalkan penggunaan memori dan kompleksitas sistem, implementasi CHRE harus mendukung hanya subkumpulan library C dan C++ standar serta fitur bahasa yang memerlukan dukungan runtime. Dengan mengikuti prinsip ini, beberapa fitur secara eksplisit dikecualikan karena memori dan dependensi tingkat OS yang luas, dan yang lainnya karena digantikan oleh CHRE API khusus yang lebih sesuai. Meskipun bukan daftar lengkap, kemampuan berikut tidak dimaksudkan untuk disediakan bagi nanoapp:
- Pengecualian C++ dan informasi jenis runtime (RTTI)
- Dukungan multithread 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 dapat menggunakan printf atau std::cout.
Sebaliknya, beberapa kemampuan library standar diperlukan. Implementasi platform harus mengekspos kemampuan ini 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 daya:
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 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 di-build dan dimuat.
Sensor
CHRE API menyediakan 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 Android Sensors API, termasuk dukungan untuk pengelompokan sampel sensor guna mengurangi konsumsi daya. Memproses data sensor dalam CHRE memungkinkan pemrosesan sinyal gerakan yang jauh lebih rendah daya dan latensi yang lebih rendah dibandingkan dengan menjalankan 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 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 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 yang dikembangkan. Selain menghindari biaya mengaktifkan 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 untuk melakukan pengukuran Round-Trip Time (RTT) terhadap titik akses yang mendukung fitur tersebut, yang memungkinkan penentuan posisi relatif yang akurat.
WWAN
CHRE API menyediakan kemampuan untuk mengambil informasi identifikasi sel untuk sel penayangan dan tetangganya, yang biasanya digunakan untuk tujuan lokasi kasar.
Audio
CHRE dapat memproses batch data audio dari mikrofon berdaya rendah, yang biasanya memanfaatkan hardware yang digunakan untuk mengimplementasikan SoundTrigger HAL. Memproses data audio di CHRE dapat memungkinkan data tersebut digabungkan dengan data lain, seperti sensor gerakan.
Bluetooth
CHRE menyediakan API yang mendukung subkumpulan fungsi Bluetooth yang diuntungkan dari pengalihan daya rendah. CHRE memungkinkan nanoapp melakukan pemindaian BLE, memantau RSSI, dan memproses data iklan BLE tanpa mengaktifkan AP. Selain itu, kepemilikan koneksi soket Bluetooth yang dibuat dapat dipindahkan ke domain pengalihan, yang memerlukan lebih sedikit energi untuk pemeliharaan dan memungkinkan nanoapp berkomunikasi melalui koneksi soket BLE yang dialihkan.
Implementasi referensi
Kode referensi untuk framework CHRE disertakan dalam AOSP di project system/chre, yang diimplementasikan di C++11. Meskipun tidak benar-benar diperlukan, sebaiknya semua implementasi CHRE didasarkan pada basis kode ini, untuk membantu memastikan konsistensi dan mempercepat adopsi kemampuan baru. Kode ini dapat dilihat sebagai analogi dengan framework Android inti karena merupakan implementasi open source API 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 untuk memungkinkannya diadaptasi ke perangkat apa pun yang memenuhi persyaratan minimum.
Untuk detail teknis dan panduan porting, lihat
README
yang disertakan dalam project system/chre.