APP下载

基于Android车载终端的设备管理框架设计

2016-10-14李培明孙甲松

电子设计工程 2016年12期
关键词:内核调用应用程序

李培明,孙甲松

(1.清华大学电子工程系北京100084;2.厦门雅迅网络股份有限公司福建厦门361008)

基于Android车载终端的设备管理框架设计

李培明1,2,孙甲松1

(1.清华大学电子工程系北京100084;2.厦门雅迅网络股份有限公司福建厦门361008)

为了实现对Android车载终端平台新增的许多非Android原生系统中的外围设备进行统一管理,本文提出了一种基于Android LocalSocket和Service的设备管理框架。该设备管理框架的整体层次结构包括应用程序、设备管理服务、守护进程、设备功能动态库、内核设备驱动,以及设备硬件等多个层次。实际应用表明,该设备管理框架逻辑结构清晰,能够较好地支持上层和底层的数据互通,有效地将Android系统中非Android原生的设备进行统一控制和管理,显著提升了设备系统的稳定性,达到了设计要求。

Android;车载终端;设备管理框架;LocalSocket;Service

近几年来,随着移动互联网时代的到来,Android操作系统已经从最初的智能手机领域逐渐进入教育、医疗、军事、汽车、家居等重要领域,并已经成为移动平台领域当之无愧的王者。2011年1月至3月,Android占领了全球大部分的手机市场,市场份额首次超过了塞班系统上升到全球第一[1];2012年第一季度数据显示,Android占领了中国68.4%的智能手机操作系统市场,在全球市场占有率为52.5%[2]。Android在国内的发展不仅仅局限于作为智能手机操作系统,现在已经开始向作为其他移动终端操作系统的方向发展,例如移动互联网设备、数字机顶盒、车载移动终端等领域。

Android平台是一个标准的通用平台,而在多媒体车载终端项目中增加了许多Android原生系统中没有的设备,例如DVD、GPIO、音频管理设备等。针对这些设备的控制,在Android原生系统中最常用的做法就是使用JNI方式进行控制。

JNI是Java Native Interface的缩写,即“Java本地接口”。在Android系统代码层次结构中,JNI处于Java代码层与C/ C++本地代码层之间的位置。在Android系统中提供JNI机制,使得在Java虚拟机内部运行的Java代码能够调用C/C++本地层的应用程序和库,从而将Java代码和C/C++本地层代码紧密联系在一起[3]。但是,在Android车载终端平台上使用常规JNI方式进行设备管理的缺点在于:

使用JNI方式进行应用程序开发需要同时实现Java、JNI、C/C++3个层次的代码,开发工作量大,开发难度也较大;应用程序如果要移植到其它平台上,C/C++本地层代码需要重新编写,移植的工作量较大;从逻辑结构方面考虑,一个JNI动态库一般只适合管理一个外围设备,随着外围设备的不断增加,难以对这些设备进行统一管理;而且系统使用过程中存在多个应用程序同时访问一个设备的可能,易造成设备访问不可控,系统稳定性差。此外,Java虚拟机为Java代码提供了完善的安全机制使得Java代码不会导致程序崩溃、滥用数据等,而一旦使用了JNI机制,这种安全机制就无能为力了[4]。

可见,在包含较多非Android原始设备的Android车载终端平台上,对这些设备进行统一管理变得非常重要。为了实现对这些设备的统一管理,本文提出并设计了一种基于Android LocalSocket和Service的方式,实现专门针对Android车载终端平台的设备管理框架。该框架能够实现对系统中非Android原生的众多设备进行统一控制和管理。

1 设备管理框架的逻辑结构图

基于Android车载终端平台的设备管理框架的逻辑结构,如图1所示。

图1 设备管理框架的逻辑结构图

设备管理框架包括下述层次:应用程序、设备管理服务、守护进程、设备功能动态库、内核设备驱动,以及设备硬件。

2 设备管理框架的实现原理

按照从上到下的调用层次关系,整个设备管理框架的设计实现原理如下。

2.1应用程序层

系统中对设备管理框架的调用操作均由应用程序发起。Android应用程序通过服务绑定接口绑定设备管理服务,绑定之后应用程序可获得设备管理服务中的DVD、GPIO、音频管理等所有设备的AIDL(Android Interface Definition Language,即Android接口描述语言)接口。这些接口就是DVD、GPIO、音频管理等所有设备,通过设备管理服务的AIDL接口提供给应用程序调用的功能接口。

2.2设备管理服务层

设备管理服务位于Android系统中的Java框架层,介于Android应用程序和设备管理守护进程之间,并通过提供AIDL接口为应用程序提供接口调用。设备管理服务向上层应用程序提供AIDL调用接口,与下层的设备管理守护进程通过Socket通信方式进行数据通信,作用至关重要。通过对整个设备管理框架的功能划分,设备管理服务需要实现如下功能:

1)设备管理服务感知应用程序的调用操作,并将应用程序的调用转化为命令格式,并将这个命令通过Android LocalSocket(本质上即为Socket套接字)通信传送给设备管理守护进程进行处理。

2)建立和维护与设备管理守护进程之间的数据通信,确定一套合理规范的通信协议。由于传输命令的内容较为简单,设备管理服务向设备管理守护进程传输的命令格式定义为:“Device Name@Function#parameter1#parameter2#...# parameterN”,其中“DeviceName”表示设备名称,“Function”表示功能接口名称,“parameter1#parameter2#...#parameterN”则表示传递的参数,参数之间使用符号'#'分隔。以命令“GPIO@GPIO_UP#fmpowon”为例,其中“GPIO”表示设备名称,“GPIO_UP”表示功能接口名称,“fmpowon”表示功能接口的参数。

3)为DVD、GPIO、音频管理等每个设备各创建(即手动编辑生成)一个AIDL接口文件,以供应用程序调用。这里的AIDL文件只是接口声明,需要在设备管理服务的其它Java文件中完成这些AIDL接口的代码实现,实现的主要内容是生成命令格式并向守护进程发送该命令。

由于设备管理服务对应用程序提供了设备管理框架内管理的所有设备的功能接口,设备管理服务的主要功能之一就是生成命令格式,命令格式中的“DeviceName”字段即包含了要调用的外围设备模块,设备管理服务通过这个字段就可以将AIDL接口与外围设备联系起来。

4)能稳定地为Android应用程序提供服务,数据处理及时,协调应用程序之间的执行和数据同步。

2.3设备管理守护进程层

设备管理守护进程位于Android系统中的HAL层(即硬件抽象层),介于设备管理服务和设备功能动态库之间,通过Android LocalSocket与上层的设备管理服务进行数据通信,向下层则调用相应设备功能动态库提供的接口,起着信息枢纽的作用。通过对整个设备管理框架的功能划分,设备管理守护进程需要实现如下功能:

1)通过LocalSocket与上层的设备管理服务层进行Socket数据通信,通过发送心跳包检测链路机制监测和更新上层客户端的连接情况,准确接收设备管理服务层发送的命令包并解析命令格式。

2)根据设备管理服务中规定的命令格式,从接收到的命令中解析得到调用的目标设备名称,这里假设是“GPIO”设备,如果是第一次调用该设备,则首先加载该设备的功能动态库,然后调用设备功能动态库中的初始化接口XXX_init(其中“XXX”是从命令中解析得到的设备名称),例如GPIO_init,进行初始化工作,否则直接调用该设备功能动态库的命令处理接口XXX_processCmd,例如GPIO_process Cmd,进行处理。

3)由于有些功能接口存在获取响应数据的需求,这要求设备管理守护进程能够接收来自设备功能动态库的响应数据并向设备管理服务层进行传递,传递的数据封装格式定义为:设备名称+'@'+功能接口名称+'#'+有效数据。以“AUDIO@GetMainVolume#80”为例,“AUDIO”表示音频管理设备名称,“GetMainVolume”表示功能接口名称,即获取系统主音量,“80”表示有效数据,即音量值。

4)能稳定地为设备管理服务层提供Socket连接的服务端,数据处理及时、可靠。

2.4设备功能动态库层

在Linux系统中,Linux内核提供了用户空间与内核空间进行交互的一组接口,即系统调用。这些系统调用接口允许应用程序受限地访问硬件设备。系统调用是应用程序访问内核空间的唯一手段;除了异常和陷入以外,它们是访问内核唯一的合法入口[5]。

设备管理框架中采用设备功能动态库和设备管理守护进程分离的设计思想。设备功能动态库主要封装与内核设备驱动进行交互的接口,应用程序向硬件模块传递的命令也将到达设备功能动态库。即设备功能动态库向上层提供接口给设备管理守护进程调用,通过Linux系统调用向下层调用内核设备驱动。

设备功能动态库层向下层调用内核设备驱动的基本过程如下:

1)在设备命令处理函数(即XXX_processCmd,其中XXX代表设备名称)实现中,获取守护进程传递下来的功能接口名称和参数;

2)根据功能接口名称查找设备动态库中的功能接口名称与功能接口函数指针映射表;

3)根据查找到的功能接口函数指针调用对应的功能接口函数;

4)在功能接口函数实现中,调用Linux操作系统提供的系统调用接口,实现对内核设备驱动的调用。同时,接收内核设备驱动返回的数据,并将数据返回给守护进程。数据上报给守护进程的格式定义为:“功能接口名称+'#'+有效数据”。

2.5内核设备驱动层

内核设备驱动直接与底层硬件打交道,并按照硬件设备的具体工作方式,驱动硬件设备进行工作。内核设备驱动作为应用空间和硬件之间的纽带,使得应用空间只需通过调用系统调用接口就可以让硬件完成要求的工作[6]。

Linux内核通过系统调用接口,如open、read、write、ioctl、close等接口,与上层的设备功能动态库进行通信[7],并通过设备驱动代码操作下层的设备硬件,完成硬件操作功能。

2.6设备硬件层

设备硬件接收来自内核设备驱动的操作命令[8],执行硬件功能实现,并在必要时返回响应数据给应用程序。

3 设备管理框架的基本操作流程

设备管理框架的基本操作流程为:

1)Android应用程序通过绑定服务接口绑定设备管理服务,绑定之后,通过设备管理服务的AIDL接口文件,即可获得设备管理服务中DVD、GPIO、音频管理等所有设备提供的功能接口。

2)应用程序调用设备管理服务AIDL接口文件中提供的功能接口。

3)设备管理服务感知应用程序的调用操作,将应用程序的调用转化为命令格式[9],并将该命令通过Android Local Socket方式发送给设备管理守护进程。

4)设备管理守护进程接收到调用命令,根据已定义的命令格式,对接收到的命令进行解析,得到调用的设备名称。如果是第一次调用该设备[10],则首先加载该设备的功能动态库,并调用动态库中的初始化接口XXX_init进行初始化工作,否则直接调用该设备功能动态库的命令处理接口XXX_processCmd进行命令处理。

5)设备功能动态库接收守护进程传递下来的功能接口名称和参数,并通过Linux操作系统提供的系统调用接口调用设备内核驱动。

6)设备内核驱动通过操作设备硬件寄存器等方式实现向下层调用硬件操作功能。

7)设备硬件接收内核设备驱动的硬件操作命令,执行硬件功能实现并在必要时返回响应数据。

4 结论

根据Android车载终端设备的特点,本文提出了设备管理框架的概念,设计并实现了专门针对Android车载终端的设备管理框架,将系统中非Android原生的设备进行统一控制和管理。

通过设计、实现及使用该设备管理框架,为应用程序开发提供了统一的接口,降低了应用程序开发的难度,提高了应用程序的代码复用和可移植性;通过对设备的统一控制和管理,避免了多个应用同时对同一硬件进行操作存在的安全等隐患,有效地提高了系统的安全性。设备管理框架采用标准而又灵活的体系结构设计,非常易于后续扩展,同时易于在Android平台的不同项目之间推广和复用,给设备系统带来了多方面的显著有益效果,达到了设计要求。

[1]宋滟泓.Android独大引二次开发潮中国厂商少积累难有作为[J].IT时代周刊,2012(6):51-52.

[2]百度百科.Android[EB/OL].[2015-01-25].http://baike.baidu.com/subview/1241829/9322617.htm.

[3]韩超,梁泉.Android系统原理及开发要点详解[M].北京:电子工业出版社,2010.

[4]阿耀.JNI:使用Java调用本地C代码[EB/OL].(2011-09-16)[2015-01-25].http://www.zdyc.net/html/diary/newWrite/ showlog_vm/sid=1/cat_id=1/log_id=214?sid=1&cat_id= 1&log_id=213.

[5](美)拉芙(Love,R)著;陈莉君,康华译.Linux内核设计与实现[M].3版.北京:机械工业出版社,2011.

[6]宋宝华.Linux设备驱动开发详解[M].2版.北京:人民邮电出版社,2010.

[7]李先妹.数字化变电站网络通信技术的研究[J].陕西电力,2011(6):37-40.

[8]徐进,徐荣森,梅正茂.基于1394b总线仿真设备的WDM驱动开发[J].电子设计工程,2015(2):63-66.

[9]李刚.基于SOA的Web GIS系统框架设计分析[J].陕西电力,2011(2):38-41.

[10]张银勇,吴剑,李向党.某推进系统气路启动特性研究[J].火箭推进,2012(6):20-23,51.

Design of device management framework based on Android in vehicle terminal

LI Pei-ming1,2,SUN Jia-song1
(1.Department of Electronic Engineering,Tsinghua University,Beijing 100084,China;2.Yaxon Network Co.Ltd.,Xiamen 361008,China)

In order to manage the devices which are not in the primary system of Android,a framework for management of devices which based on LocalSocket and Service is proposed.The framework of the overall hierarchical structure consists of the application,the service for management of peripheral devices,the guardian process,the dynamic library for devices,the kernel device drivers,the device hardware,and so on.Practical application shows that the framework for management of peripheral devices have many advantages,including the clear framework of logic structure,better to support the data interoperability between upper layer and bottom layer,effectively control and manage the peripheral devices which are not in the primary system of Android.The stability of the system is significantly improved,and the design requirement is achieved.

Android;vehicle terminal;management of peripheral devices;LocalSocket;Service

TN92

A

1674-6236(2016)12-0097-03

2015-07-02稿件编号:201507028

李培明(1983—),男,福建泉州人,工程师。研究方向:嵌入式系统。

猜你喜欢

内核调用应用程序
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
核电项目物项调用管理的应用研究
删除Win10中自带的应用程序
Linux内核mmap保护机制研究
谷歌禁止加密货币应用程序
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信
三星电子将开设应用程序下载商店