本文在借鉴网友的资料后再重新梳理了一遍,都是站在前人的基础、巨人的肩膀上再次总结分析出来的,仅供大家参考!
本文主要描述了在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客户端实现
调用时序图
Android6.0 Sensor架构和问题分析
最新推荐文章于 2024-08-17 14:42:52 发布
本文详细介绍了Android 6.0系统在MTK6755平台上的sensor架构,包括系统五层架构、Sensor子系统结构、驱动、动态库、应用程序接口及开发、框架和HAL层的运作机制。文中还分析了Sensor服务的启动、客户端与服务端的通信流程,以及硬件抽象层HAL的接口和实现。
摘要由CSDN通过智能技术生成