一、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内核黑科技|技术文章 |精选教程