一、CHRE定义与用途

CHRE全称为Context Hub Runtime Environment,是Google提供的在低功耗处理器上运行应用程序而实现的一个通用软件平台。CHRE具有简单、标准化、嵌入式支持友好的特点,应用在需要始终在线运行或需要频繁上下文交互,并且算力要求不高的场景,广泛运用在Android系统开发,为传感器、蓝牙、Wifi、音频等模块提供了友好的API支持。

二、CHRE架构总览

图 1. CHRE 框架架构

从上层至底层,CHRE提供了APP与底层硬件直接交互的能力。APP申请ACCESS_CONTEXT_HUB权限后,可以通过ContextHubManager与Contexthub Hal交互;Contexthub Hal与CHRE底层通过Socket通信与FastRpc交互,达到控制Nanoapp(使用CHRE API运行在CHRE环境的应用)的效果。通过层层调用最终实现APP与底层硬件的通信。

1.代码目录介绍

  • ContextHubManager

位于core/java/android/hardware/location目录,提供APP调用的API

  • ContextHub Hal

位于system/chre/host/hal_generic目录,有承上启下的作用

  • CHRE

位于system/chre目录,CHRE的核心代码

图 2. CHRE 代码目录

Apps: 公共 Nanoapp 源代码,包括展示如何使用 CHRE API 的示例 Nanoapp,以及用于验证 API 功能的测试 Nanoapp

Build: CHRE的编译Makefile文件

Chpp: Context Hub Peripheral Protocol, Context Hub外围设备协议源代码

Chre api: CHRE暴露的Api接口,隶属于CHRE Framework部分,提供了Nanoapp/Sensor/Wlan 等模块的官方定义API接口

Core: CHRE框架核心代码,包含了Nanoapp事件处理的核心代码,适用于各个平台

Doc: 开发文档

External: Chre依赖的外围代码。如Kiss_fft

Host:支持 CHRE 实现但在应用程序处理器(“主机”)上运行的参考代码,例如 Context Hub HAL

Pal: Platform Abstraction Layer (PAL),平台抽象层

Platform:CHRE在特定平台上的实现相关代码

三、AP与CHRE间通信

1.App与Framework通信

图 3. ContextHubManager类图

AP通过ContextHubManager与CHRE之间通信,具体通信接口如下:

getContextHubInfo:通过Handle获取指定的ContextHub信息

loadNanoApp:在指定Handle的ContextHub加载指定的Nanoapp

unloadNanoApp:卸载指定的Nanoapp

getNanoAppInstanceInfo:获取Nanoapp实例的信息

findNanoAppOnHub:在系统上查找指定的Nanoapp

sendMessage: 向指定的Nanoapp发送信息

getContextHubs: 查询可用的ContextHub对象

createClient:在指定的ContextHub创建service的Client, 并注册Callback

ContextHubManager仅提供API调用, 函数功能的具体实现还是在ContextHubService中。APP可以通过getContextHubInfo/getContextHubs 获取ContextHubs信息,通过loadNanoApp/unloadNanoApp/findNanoAppOnHub 与Nanoapp交互。

图 4. ClientCallback 回调函数

APP通过CreateClient注册Client与Callback后可以拿到Nanoapp状态变化的Callback。包括NanoApp发送的消息,以及Aborted/Loaded/Unloaded/Enabled/Disabled的Callback。具体流程如下图:

图 5. APP调用流程

2.Framework到Hal通信

图 6. Contexthub Hal

Contexthub Hal层代码存放在system/chre/host/hal_generic。以V1_2为例,在V1_2/service.cc的main函数中,将Contexthub Hal注册为服务; 开放Hal层的能力到Framework层。

图 7. 初始化拿取Hal层实例

在ContextHubSerivce构造时, 就会通过getContextHubWrapper拿到Hal的服务handle, 并通过handle初始化ContextHubClientManager及ContextHubTransactionManager,这两个类中与Hal的通信均通过调用此handle实现。如loadNanoAppOnHub:

图 8. loadNanoapp 示例

3.Hal与CHRE通信

图 9. Hal与CHRE通信

以LoadNanoAPP为例,Hal层注册成为Socket的Client,CHRE Deamon注册成为Serivce,最后通过Fastrpc deamon与CHRE进行通信,将事件下发到CHRE。

通过上文的分析,可以得知CHRE框架有稳定的通路提供到APP,与底层的Nanoapp进行通信。

四、 CHRE NanoApp运行机制

1. NanoApp实现

单个NanoApp必须实现nanoappStart()nanoappHandleEvent()和nanoappEnd()接口, 并完成NanoAPP声明。以Sensor模块(system/chre/apps/sensor_world/sensor_world.cc)为例:

  • NanoAPP声明:

传入名称、id、版本号、权限参数完成声明。

  • NanoappStart实现

主要完成资源的申请、Sensor的初始化动作。

  • nanoappHandleEvent实现

处理其他APP发送的事件,对于Sensor模块,完成了数据接收处理,以及Sensor打开、关闭、采样率配置、及Timer事件处理。

  • NanoappEnd实现

NanoApp生命周期结束时的处理。

2.NanoApp初始化与事件处理

这里以Freertos上为例。Freertos init的时候,创建了一个Task执行chreThreadEntry函数,函数中调用到了EventLoopManagerSingleton的初始化,并且将StaticNanoApp加载。做完上述操作后,这个Task会循环执行Event处理函数,将事件队列中的事件取出并派发到相对应的Nanoapp,并由NanoApp的HandleEvent进行事件处理。相关细节见EventLoop::run()。

五、总结

本文介绍了CHRE的基本流程,包括AP端与CHRE的通信流程、CHRE运行机制、Nanoapp实现等内容,可以为学习和调试CHRE提供参考。

六、参考资料

1.https://source.android.google.cn/devices/contexthub 《上下文中心运行时环境 (CHRE)》

长按关注内核工匠微信

Linux内核黑科技|技术文章 |精选教程