Android6.0 Sensor架构和问题分析

本文在借鉴网友的资料后再重新梳理了一遍,都是站在前人的基础、巨人的肩膀上再次总结分析出来的,仅供大家参考!

本文主要描述了在Android 6.0系统、MTK6755平台上sensor相关软硬件的体系架构的分析理解。
一、系统架构(Architecture)
1.1 Android体系架构图
 
图1.1
图1.1是Android系统的典型五层体系架构图,分别为Applications、Framework、Native、HAL和Kernel五大层次。我们接下来分析的sensor子系统也基本按照这五个层次分别进行分析。
1.2  Sensor子系统架构图
 
图1.2
1、黄色部分表示硬件,它要挂在I2C总线上(目前大部分sensor基本都通过I2C进行通信和控制)。
2、红色部分表示驱动,驱动中会申请Input设备,注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数据传到HAL层,准确说是HAL从Event读。
    在MTK6755平台中,这里的驱动driver实际上分成了两层,一层为虚拟逻辑Hub层,用来管理兼容不同类型的所有的sensor,如有可能有两家厂商的不同g-sensor,则可以通过这个虚拟逻辑出来的Hub进行统一管理;另一层为每款具体sensor的真正驱动,通过注册挂载到Hub中。如图1.3:
 
图1.3
从图1.3可以看出,MTK平台对虚拟逻辑Hub层使用了两种实现方式,一种是以前平台一直使用的hwmsen虚拟逻辑Hub,由它统一管理所有类型所有厂商的sensor,目前我司没有使用这种方式,因此在后面就不对它进行分析了;另一种是分别为每一种类型的sensor实现了一个虚拟逻辑Hub,如accel负责管理所有G-sensor。

3、图1.2绿色部分表示动态库,它封装了整个Sensor的IPC机制,如SensorManager是客户端,SensorService是服务端,而HAL部分是封装了服务端对Kernel的直接访问。在MTK平台的HAL层里,也同样为对接下层的两种虚拟逻辑Hub实现了不同的HAL层代码。

4、蓝色部分就是我们的Framework和Application了,JNI负责访问Sensor的客户端,而Application就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果,如屏幕旋转,打电话时灭屏,自动调节背光等。
二、应用(Applications)
2.1 传感器介绍
    Android 6.0 系统sensors.h文件中定义了26种传感器类型,其中主要的8种传感器类型分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)。其他的几种传感器基本都可以由上述的传感器进行算法实现,如动作探测传感器(significant motion)、步行探测传感器(step detector)、计步传感器(step counter)、心率计传感器(heart rate)等。
2.2 应用开发
    Android定义的API接口给应用层提供了几种方法,可以很容易让你在运行时确定设备上有哪些sensor。API还提供了让你确定每个sensor信息和功能的接口,比如sensor名字、类型、厂商、数据值的范围、数据精度等。
    Android开发者官网上给出的典型的应用开发代码如下:
 
图2.1
在构造函数中,获取SystemSensorManager,并获取到加速传感器的Sensor;在onResume方法中调用SystemSensorManager.registerListener注册监听器;
Activity同时实现了SensorEventListener接口。当Sensor数据有改变的时候将会调用onSensorChanged方法。
 
图2.2
三、框架(Framework)
3.1 Sensor总体调用关系图
 
图3.1
sensor框架分为三个层次,客户端、服务端、HAL层,服务端负责从HAL读取数据,并将数据写到管道中,客户端通过管道读取服务端数据。
客户端主要类
SensorManager.java
    从android4.1开始,把SensorManager定义为一个抽象类,定义了一些主要的方法,该类主要是应用层直接使用的类,提供给应用层的接口
SystemSensorManager.java
    继承于SensorManager,客户端消息处理的实体,应用程序通过获取其实例,并注册监听接口,获取sensor数据。
SensorEventListener接口
    用于注册监听的接口
Looper
    用申请注册的线程Looper或系统初始化线程的Looper,来负责读取sensor数据
android_hardware_SensorManager.cpp
    负责与java层通信的JNI接口
SensorManager.cpp
    sensor在Native层的客户端,负责与服务端SensorService.cpp的通信
SenorEventQueue.cpp
    消息队列
服务端主要类
SensorService.cpp
    服务端数据处理中心
SensorEventConnection
    从BnSensorEventConnection继承来,实现接口ISensorEventConnection的一些方法,ISensorEventConnection在SensorEventQueue会保存一个指针,指向调用服务接口创建的SensorEventConnection对象
BitTube.cpp
    在这个类中创建了管道,用于服务端与客户端读写数据
SensorDevice
    负责与HAL读取数据
HAL层
  sensor.h是google为Sensor定义的Hal接口,单独提出去

3.2客户端实现
调用时序图
 

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值