Lingkungan Runtime Hub Konteks (CHRE)

Smartphone berisi sejumlah prosesor, masing-masing dioptimalkan untuk melakukan tugas yang berbeda. Namun, Android hanya berjalan pada satu prosesor: prosesor aplikasi (AP). AP disetel untuk memberikan kinerja yang luar biasa untuk kasus penggunaan di layar seperti bermain game, tetapi terlalu haus daya untuk mendukung fitur yang membutuhkan pemrosesan singkat yang sering terjadi sepanjang waktu, bahkan saat layar mati. Prosesor yang lebih kecil mampu menangani beban kerja ini dengan lebih efisien, menyelesaikan tugasnya tanpa memengaruhi masa pakai baterai secara nyata. Namun, lingkungan perangkat lunak dalam prosesor berdaya rendah ini lebih terbatas dan dapat sangat bervariasi, 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, terstandarisasi, dan ramah tertanam. CHRE memudahkan OEM perangkat dan mitra tepercaya mereka untuk membongkar pemrosesan dari AP, untuk menghemat baterai dan meningkatkan berbagai bidang pengalaman pengguna, dan mengaktifkan kelas fitur yang selalu aktif dan sadar konteks, terutama yang melibatkan penerapan mesin belajar penginderaan lingkungan.

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 dari 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 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 menjalankan nanoapps yang dikembangkan dalam kode asli (C atau C++); Java tidak didukung.
  • Karena kendala sumber daya dan keterbatasan 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 umumnya menggunakan perangkat keras yang sama untuk mengimplementasikan hub sensor dan CHRE, CHRE sendiri tidak menyediakan fungsionalitas sensor yang diperlukan oleh Android Sensors HAL . CHRE terikat dengan HAL Hub Konteks, dan bertindak sebagai klien dari kerangka kerja sensor khusus perangkat untuk menerima data sensor tanpa melibatkan AP.

arsitektur kerangka CHRE

Gambar 1. Arsitektur kerangka kerja CHRE

Hub Konteks HAL

Lapisan abstraksi perangkat keras Context Hub (HAL) adalah antarmuka antara kerangka kerja Android dan implementasi CHRE perangkat, yang didefinisikan di hardware/interfaces/contexthub . Context Hub HAL mendefinisikan API yang melaluinya kerangka kerja Android menemukan hub konteks yang tersedia dan nanoapps-nya, berinteraksi dengan nanoapps tersebut melalui pengiriman pesan, dan memungkinkan nanoapps untuk dimuat dan dibongkar. Implementasi referensi HAL Hub Konteks yang bekerja dengan implementasi referensi CHRE tersedia di system/chre/host .

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

inisialisasi

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

Memuat dan membongkar nanoapps

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 kemungkinan respons pertama terhadap queryApps() .

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

Jika implementasi untuk memuat nanoapp melibatkan penulisannya ke memori non-volatil, seperti penyimpanan flash yang terpasang ke prosesor yang menjalankan CHRE, maka implementasi CHRE harus selalu boot dengan nanoapps dinamis ini dalam keadaan nonaktif. Ini berarti bahwa tidak ada kode nanoapp yang dijalankan hingga permintaan enableNanoapp() diterima melalui HAL. Aplikasi nano yang dimuat sebelumnya dapat diinisialisasi dalam status diaktifkan.

Hub konteks dimulai ulang

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

Ikhtisar sistem CHRE

CHRE dirancang di sekitar arsitektur yang digerakkan oleh peristiwa, di mana unit komputasi utama adalah peristiwa yang diteruskan ke titik masuk penanganan peristiwa nanoapp. Sementara kerangka kerja CHRE dapat multithreaded, nanoapp yang diberikan tidak pernah dieksekusi dari beberapa thread secara paralel. Kerangka kerja CHRE berinteraksi dengan aplikasi nano yang diberikan melalui salah satu dari tiga titik masuk aplikasi nano ( nanoappStart() , nanoappHandleEvent() , dan nanoappEnd() ) atau melalui panggilan balik yang disediakan dalam panggilan API CHRE sebelumnya, dan nanoapps berinteraksi dengan kerangka kerja 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 khusus vendor tambahan untuk digunakan oleh nanoapps khusus vendor .

Membangun sistem

Sementara 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 pembangunan Android, seperti kebutuhan akan rantai alat khusus. Oleh karena itu, proyek CHRE di AOSP menyediakan sistem pembangunan yang disederhanakan berdasarkan GNU Make untuk mengompilasi nanoapps, dan, secara opsional, kerangka kerja CHRE ke dalam pustaka 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 mendefinisikan antarmuka perangkat lunak antara aplikasi nano 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 API CHRE yang berbeda, yang berarti bahwa nanoapp tidak perlu dikompilasi ulang untuk dijalankan pada sistem yang mengimplementasikan versi berbeda dari CHRE API 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 terus berfungsi. Demikian pula, nanoapp dapat berjalan di CHRE API v1.2, dan dapat menentukan saat runtime apakah memerlukan fungsionalitas dari API v1.3 untuk mencapai fungsinya, atau apakah dapat beroperasi, berpotensi dengan degradasi fitur yang anggun.

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

Ringkasan versi

Seperti skema versi Android HIDL , CHRE API mengikuti versi semantik . Versi mayor menunjukkan kompatibilitas biner, sedangkan versi minor bertambah ketika fitur kompatibel mundur diperkenalkan. CHRE API menyertakan anotasi kode sumber untuk mengidentifikasi versi mana yang memperkenalkan fungsi atau parameter, misalnya @since v1.1 .

Implementasi CHRE juga memperlihatkan 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 aplikasi nano 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, bersama dengan penyempurnaan umum untuk mengaktifkan komunikasi nanoapp-ke-nanoapp, dan peningkatan lainnya.

Versi 1.2 (Android 9)

Menambahkan dukungan untuk data dari mikrofon berdaya rendah, jangkauan Wi-Fi RTT, pemberitahuan 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 pendeteksi langkah, dan memperluas kejadian 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

Sementara sumber sinyal kontekstual, seperti sensor, dikategorikan ke dalam area fitur opsional, beberapa fungsi inti diperlukan di semua 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 API CHRE, ada juga fitur tingkat sistem CHRE wajib yang ditentukan pada tingkat HAL Hub Konteks. Yang paling signifikan dari ini adalah kemampuan untuk memuat dan membongkar nanoapps 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 dan fitur bahasa yang memerlukan dukungan waktu proses. Mengikuti prinsip-prinsip ini, beberapa fitur secara eksplisit dikecualikan karena memori dan/atau dependensi tingkat OS yang ekstensif, dan yang lainnya karena digantikan oleh API khusus CHRE yang lebih sesuai. Meskipun tidak dimaksudkan sebagai daftar yang lengkap, kemampuan berikut tidak dimaksudkan untuk tersedia bagi nanoapps:

  • Pengecualian C++ dan informasi jenis runtime (RTTI)
  • Dukungan multithreading pustaka standar, termasuk header C++11 <thread> , <mutex> , <atomic> , <future>
  • Pustaka Input/Output Standar C dan C++
  • Pustaka Template 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
  • Lokalisasi dan dukungan karakter Unicode
  • Perpustakaan tanggal dan waktu
  • Fungsi yang mengubah aliran 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 yang setara tersedia dari fungsi CHRE API dan/atau pustaka utilitas. Misalnya, chreLog dapat digunakan untuk logging debug yang ditargetkan ke sistem logcat Android, di mana program yang lebih tradisional mungkin menggunakan printf atau std::cout .

Sebaliknya, beberapa fungsi perpustakaan standar diperlukan. Terserah implementasi platform untuk mengekspos ini melalui perpustakaan statis untuk dimasukkan dalam biner nanoapp, atau dengan menghubungkan dinamis antara nanoapp dan sistem. Ini termasuk, tetapi 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/daya: expf , log2f , powf , sqrtf
    • Fungsi trigonometri/hiperbolik: sinf , cosf , tanf , asinf , acosf , atan2f , tanhf

Sementara beberapa platform yang mendasari mendukung fungsionalitas tambahan, aplikasi nano tidak dianggap portabel di seluruh implementasi CHRE kecuali jika membatasi dependensi eksternalnya ke fungsi API CHRE dan fungsi pustaka 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 ini mungkin tidak diperlukan untuk mendukung implementasi CHRE yang kompatibel, fitur ini mungkin diperlukan untuk mendukung aplikasi nano tertentu. Meskipun platform tidak mendukung kumpulan 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 kedekatan. API ini dimaksudkan untuk menyediakan kumpulan fitur yang mirip dengan Android Sensors API, termasuk dukungan untuk mengelompokkan sampel sensor guna mengurangi konsumsi daya. Memproses data sensor dalam CHRE memungkinkan daya yang jauh lebih rendah dan pemrosesan sinyal gerak dengan latensi yang lebih rendah dibandingkan dengan menjalankan pada AP.

GNSS

CHRE memasok API untuk meminta data lokasi dari sistem satelit navigasi global (GNSS), termasuk GPS dan konstelasi satelit lainnya. Ini termasuk 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 dengan 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. Sementara GNSS bekerja dengan baik untuk lokasi luar ruangan, hasil pemindaian Wi-Fi dapat memberikan informasi lokasi yang akurat di dalam ruangan dan di daerah maju. Selain menghindari biaya membangunkan Titik Akses untuk pemindaian, CHRE dapat mendengarkan hasil pemindaian Wi-Fi yang dilakukan oleh firmware Wi-Fi untuk tujuan konektivitas, yang biasanya tidak dikirimkan ke Titik Akses karena alasan daya. Memanfaatkan pemindaian konektivitas untuk tujuan kontekstual membantu mengurangi jumlah total pemindaian Wi-Fi yang dilakukan, menghemat daya.

Dukungan untuk Wi-Fi telah 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 akurat.

WWAN

CHRE API menyediakan kemampuan untuk mengambil informasi identifikasi sel untuk sel yang melayani dan tetangganya, yang biasanya digunakan untuk tujuan lokasi berbutir 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 dapat memungkinkannya untuk menyatu dengan data lain, seperti sensor gerak.

Implementasi referensi

Kode referensi untuk kerangka kerja 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 adopsi kemampuan baru. Kode ini dapat dilihat sebagai analog dengan kerangka kerja inti Android karena merupakan implementasi sumber terbuka dari API yang digunakan aplikasi, berfungsi sebagai dasar dan standar untuk kompatibilitas. Meskipun dapat dikustomisasi dan diperluas dengan kemampuan khusus vendor, rekomendasinya adalah mempertahankan 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 .