李培明,孫甲松
(1.清華大學(xué)電子工程系北京100084;2.廈門雅迅網(wǎng)絡(luò)股份有限公司福建廈門361008)
基于Android車載終端的設(shè)備管理框架設(shè)計
李培明1,2,孫甲松1
(1.清華大學(xué)電子工程系北京100084;2.廈門雅迅網(wǎng)絡(luò)股份有限公司福建廈門361008)
為了實現(xiàn)對Android車載終端平臺新增的許多非Android原生系統(tǒng)中的外圍設(shè)備進(jìn)行統(tǒng)一管理,本文提出了一種基于Android LocalSocket和Service的設(shè)備管理框架。該設(shè)備管理框架的整體層次結(jié)構(gòu)包括應(yīng)用程序、設(shè)備管理服務(wù)、守護(hù)進(jìn)程、設(shè)備功能動態(tài)庫、內(nèi)核設(shè)備驅(qū)動,以及設(shè)備硬件等多個層次。實際應(yīng)用表明,該設(shè)備管理框架邏輯結(jié)構(gòu)清晰,能夠較好地支持上層和底層的數(shù)據(jù)互通,有效地將Android系統(tǒng)中非Android原生的設(shè)備進(jìn)行統(tǒng)一控制和管理,顯著提升了設(shè)備系統(tǒng)的穩(wěn)定性,達(dá)到了設(shè)計要求。
Android;車載終端;設(shè)備管理框架;LocalSocket;Service
近幾年來,隨著移動互聯(lián)網(wǎng)時代的到來,Android操作系統(tǒng)已經(jīng)從最初的智能手機(jī)領(lǐng)域逐漸進(jìn)入教育、醫(yī)療、軍事、汽車、家居等重要領(lǐng)域,并已經(jīng)成為移動平臺領(lǐng)域當(dāng)之無愧的王者。2011年1月至3月,Android占領(lǐng)了全球大部分的手機(jī)市場,市場份額首次超過了塞班系統(tǒng)上升到全球第一[1];2012年第一季度數(shù)據(jù)顯示,Android占領(lǐng)了中國68.4%的智能手機(jī)操作系統(tǒng)市場,在全球市場占有率為52.5%[2]。Android在國內(nèi)的發(fā)展不僅僅局限于作為智能手機(jī)操作系統(tǒng),現(xiàn)在已經(jīng)開始向作為其他移動終端操作系統(tǒng)的方向發(fā)展,例如移動互聯(lián)網(wǎng)設(shè)備、數(shù)字機(jī)頂盒、車載移動終端等領(lǐng)域。
Android平臺是一個標(biāo)準(zhǔn)的通用平臺,而在多媒體車載終端項目中增加了許多Android原生系統(tǒng)中沒有的設(shè)備,例如DVD、GPIO、音頻管理設(shè)備等。針對這些設(shè)備的控制,在Android原生系統(tǒng)中最常用的做法就是使用JNI方式進(jìn)行控制。
JNI是Java Native Interface的縮寫,即“Java本地接口”。在Android系統(tǒng)代碼層次結(jié)構(gòu)中,JNI處于Java代碼層與C/ C++本地代碼層之間的位置。在Android系統(tǒng)中提供JNI機(jī)制,使得在Java虛擬機(jī)內(nèi)部運行的Java代碼能夠調(diào)用C/C++本地層的應(yīng)用程序和庫,從而將Java代碼和C/C++本地層代碼緊密聯(lián)系在一起[3]。但是,在Android車載終端平臺上使用常規(guī)JNI方式進(jìn)行設(shè)備管理的缺點在于:
使用JNI方式進(jìn)行應(yīng)用程序開發(fā)需要同時實現(xiàn)Java、JNI、C/C++3個層次的代碼,開發(fā)工作量大,開發(fā)難度也較大;應(yīng)用程序如果要移植到其它平臺上,C/C++本地層代碼需要重新編寫,移植的工作量較大;從邏輯結(jié)構(gòu)方面考慮,一個JNI動態(tài)庫一般只適合管理一個外圍設(shè)備,隨著外圍設(shè)備的不斷增加,難以對這些設(shè)備進(jìn)行統(tǒng)一管理;而且系統(tǒng)使用過程中存在多個應(yīng)用程序同時訪問一個設(shè)備的可能,易造成設(shè)備訪問不可控,系統(tǒng)穩(wěn)定性差。此外,Java虛擬機(jī)為Java代碼提供了完善的安全機(jī)制使得Java代碼不會導(dǎo)致程序崩潰、濫用數(shù)據(jù)等,而一旦使用了JNI機(jī)制,這種安全機(jī)制就無能為力了[4]。
可見,在包含較多非Android原始設(shè)備的Android車載終端平臺上,對這些設(shè)備進(jìn)行統(tǒng)一管理變得非常重要。為了實現(xiàn)對這些設(shè)備的統(tǒng)一管理,本文提出并設(shè)計了一種基于Android LocalSocket和Service的方式,實現(xiàn)專門針對Android車載終端平臺的設(shè)備管理框架。該框架能夠?qū)崿F(xiàn)對系統(tǒng)中非Android原生的眾多設(shè)備進(jìn)行統(tǒng)一控制和管理。
基于Android車載終端平臺的設(shè)備管理框架的邏輯結(jié)構(gòu),如圖1所示。
圖1 設(shè)備管理框架的邏輯結(jié)構(gòu)圖
設(shè)備管理框架包括下述層次:應(yīng)用程序、設(shè)備管理服務(wù)、守護(hù)進(jìn)程、設(shè)備功能動態(tài)庫、內(nèi)核設(shè)備驅(qū)動,以及設(shè)備硬件。
按照從上到下的調(diào)用層次關(guān)系,整個設(shè)備管理框架的設(shè)計實現(xiàn)原理如下。
2.1應(yīng)用程序?qū)?/p>
系統(tǒng)中對設(shè)備管理框架的調(diào)用操作均由應(yīng)用程序發(fā)起。Android應(yīng)用程序通過服務(wù)綁定接口綁定設(shè)備管理服務(wù),綁定之后應(yīng)用程序可獲得設(shè)備管理服務(wù)中的DVD、GPIO、音頻管理等所有設(shè)備的AIDL(Android Interface Definition Language,即Android接口描述語言)接口。這些接口就是DVD、GPIO、音頻管理等所有設(shè)備,通過設(shè)備管理服務(wù)的AIDL接口提供給應(yīng)用程序調(diào)用的功能接口。
2.2設(shè)備管理服務(wù)層
設(shè)備管理服務(wù)位于Android系統(tǒng)中的Java框架層,介于Android應(yīng)用程序和設(shè)備管理守護(hù)進(jìn)程之間,并通過提供AIDL接口為應(yīng)用程序提供接口調(diào)用。設(shè)備管理服務(wù)向上層應(yīng)用程序提供AIDL調(diào)用接口,與下層的設(shè)備管理守護(hù)進(jìn)程通過Socket通信方式進(jìn)行數(shù)據(jù)通信,作用至關(guān)重要。通過對整個設(shè)備管理框架的功能劃分,設(shè)備管理服務(wù)需要實現(xiàn)如下功能:
1)設(shè)備管理服務(wù)感知應(yīng)用程序的調(diào)用操作,并將應(yīng)用程序的調(diào)用轉(zhuǎn)化為命令格式,并將這個命令通過Android LocalSocket(本質(zhì)上即為Socket套接字)通信傳送給設(shè)備管理守護(hù)進(jìn)程進(jìn)行處理。
2)建立和維護(hù)與設(shè)備管理守護(hù)進(jìn)程之間的數(shù)據(jù)通信,確定一套合理規(guī)范的通信協(xié)議。由于傳輸命令的內(nèi)容較為簡單,設(shè)備管理服務(wù)向設(shè)備管理守護(hù)進(jìn)程傳輸?shù)拿罡袷蕉x為:“Device Name@Function#parameter1#parameter2#...# parameterN”,其中“DeviceName”表示設(shè)備名稱,“Function”表示功能接口名稱,“parameter1#parameter2#...#parameterN”則表示傳遞的參數(shù),參數(shù)之間使用符號'#'分隔。以命令“GPIO@GPIO_UP#fmpowon”為例,其中“GPIO”表示設(shè)備名稱,“GPIO_UP”表示功能接口名稱,“fmpowon”表示功能接口的參數(shù)。
3)為DVD、GPIO、音頻管理等每個設(shè)備各創(chuàng)建(即手動編輯生成)一個AIDL接口文件,以供應(yīng)用程序調(diào)用。這里的AIDL文件只是接口聲明,需要在設(shè)備管理服務(wù)的其它Java文件中完成這些AIDL接口的代碼實現(xiàn),實現(xiàn)的主要內(nèi)容是生成命令格式并向守護(hù)進(jìn)程發(fā)送該命令。
由于設(shè)備管理服務(wù)對應(yīng)用程序提供了設(shè)備管理框架內(nèi)管理的所有設(shè)備的功能接口,設(shè)備管理服務(wù)的主要功能之一就是生成命令格式,命令格式中的“DeviceName”字段即包含了要調(diào)用的外圍設(shè)備模塊,設(shè)備管理服務(wù)通過這個字段就可以將AIDL接口與外圍設(shè)備聯(lián)系起來。
4)能穩(wěn)定地為Android應(yīng)用程序提供服務(wù),數(shù)據(jù)處理及時,協(xié)調(diào)應(yīng)用程序之間的執(zhí)行和數(shù)據(jù)同步。
2.3設(shè)備管理守護(hù)進(jìn)程層
設(shè)備管理守護(hù)進(jìn)程位于Android系統(tǒng)中的HAL層(即硬件抽象層),介于設(shè)備管理服務(wù)和設(shè)備功能動態(tài)庫之間,通過Android LocalSocket與上層的設(shè)備管理服務(wù)進(jìn)行數(shù)據(jù)通信,向下層則調(diào)用相應(yīng)設(shè)備功能動態(tài)庫提供的接口,起著信息樞紐的作用。通過對整個設(shè)備管理框架的功能劃分,設(shè)備管理守護(hù)進(jìn)程需要實現(xiàn)如下功能:
1)通過LocalSocket與上層的設(shè)備管理服務(wù)層進(jìn)行Socket數(shù)據(jù)通信,通過發(fā)送心跳包檢測鏈路機(jī)制監(jiān)測和更新上層客戶端的連接情況,準(zhǔn)確接收設(shè)備管理服務(wù)層發(fā)送的命令包并解析命令格式。
2)根據(jù)設(shè)備管理服務(wù)中規(guī)定的命令格式,從接收到的命令中解析得到調(diào)用的目標(biāo)設(shè)備名稱,這里假設(shè)是“GPIO”設(shè)備,如果是第一次調(diào)用該設(shè)備,則首先加載該設(shè)備的功能動態(tài)庫,然后調(diào)用設(shè)備功能動態(tài)庫中的初始化接口XXX_init(其中“XXX”是從命令中解析得到的設(shè)備名稱),例如GPIO_init,進(jìn)行初始化工作,否則直接調(diào)用該設(shè)備功能動態(tài)庫的命令處理接口XXX_processCmd,例如GPIO_process Cmd,進(jìn)行處理。
3)由于有些功能接口存在獲取響應(yīng)數(shù)據(jù)的需求,這要求設(shè)備管理守護(hù)進(jìn)程能夠接收來自設(shè)備功能動態(tài)庫的響應(yīng)數(shù)據(jù)并向設(shè)備管理服務(wù)層進(jìn)行傳遞,傳遞的數(shù)據(jù)封裝格式定義為:設(shè)備名稱+'@'+功能接口名稱+'#'+有效數(shù)據(jù)。以“AUDIO@GetMainVolume#80”為例,“AUDIO”表示音頻管理設(shè)備名稱,“GetMainVolume”表示功能接口名稱,即獲取系統(tǒng)主音量,“80”表示有效數(shù)據(jù),即音量值。
4)能穩(wěn)定地為設(shè)備管理服務(wù)層提供Socket連接的服務(wù)端,數(shù)據(jù)處理及時、可靠。
2.4設(shè)備功能動態(tài)庫層
在Linux系統(tǒng)中,Linux內(nèi)核提供了用戶空間與內(nèi)核空間進(jìn)行交互的一組接口,即系統(tǒng)調(diào)用。這些系統(tǒng)調(diào)用接口允許應(yīng)用程序受限地訪問硬件設(shè)備。系統(tǒng)調(diào)用是應(yīng)用程序訪問內(nèi)核空間的唯一手段;除了異常和陷入以外,它們是訪問內(nèi)核唯一的合法入口[5]。
設(shè)備管理框架中采用設(shè)備功能動態(tài)庫和設(shè)備管理守護(hù)進(jìn)程分離的設(shè)計思想。設(shè)備功能動態(tài)庫主要封裝與內(nèi)核設(shè)備驅(qū)動進(jìn)行交互的接口,應(yīng)用程序向硬件模塊傳遞的命令也將到達(dá)設(shè)備功能動態(tài)庫。即設(shè)備功能動態(tài)庫向上層提供接口給設(shè)備管理守護(hù)進(jìn)程調(diào)用,通過Linux系統(tǒng)調(diào)用向下層調(diào)用內(nèi)核設(shè)備驅(qū)動。
設(shè)備功能動態(tài)庫層向下層調(diào)用內(nèi)核設(shè)備驅(qū)動的基本過程如下:
1)在設(shè)備命令處理函數(shù)(即XXX_processCmd,其中XXX代表設(shè)備名稱)實現(xiàn)中,獲取守護(hù)進(jìn)程傳遞下來的功能接口名稱和參數(shù);
2)根據(jù)功能接口名稱查找設(shè)備動態(tài)庫中的功能接口名稱與功能接口函數(shù)指針映射表;
3)根據(jù)查找到的功能接口函數(shù)指針調(diào)用對應(yīng)的功能接口函數(shù);
4)在功能接口函數(shù)實現(xiàn)中,調(diào)用Linux操作系統(tǒng)提供的系統(tǒng)調(diào)用接口,實現(xiàn)對內(nèi)核設(shè)備驅(qū)動的調(diào)用。同時,接收內(nèi)核設(shè)備驅(qū)動返回的數(shù)據(jù),并將數(shù)據(jù)返回給守護(hù)進(jìn)程。數(shù)據(jù)上報給守護(hù)進(jìn)程的格式定義為:“功能接口名稱+'#'+有效數(shù)據(jù)”。
2.5內(nèi)核設(shè)備驅(qū)動層
內(nèi)核設(shè)備驅(qū)動直接與底層硬件打交道,并按照硬件設(shè)備的具體工作方式,驅(qū)動硬件設(shè)備進(jìn)行工作。內(nèi)核設(shè)備驅(qū)動作為應(yīng)用空間和硬件之間的紐帶,使得應(yīng)用空間只需通過調(diào)用系統(tǒng)調(diào)用接口就可以讓硬件完成要求的工作[6]。
Linux內(nèi)核通過系統(tǒng)調(diào)用接口,如open、read、write、ioctl、close等接口,與上層的設(shè)備功能動態(tài)庫進(jìn)行通信[7],并通過設(shè)備驅(qū)動代碼操作下層的設(shè)備硬件,完成硬件操作功能。
2.6設(shè)備硬件層
設(shè)備硬件接收來自內(nèi)核設(shè)備驅(qū)動的操作命令[8],執(zhí)行硬件功能實現(xiàn),并在必要時返回響應(yīng)數(shù)據(jù)給應(yīng)用程序。
設(shè)備管理框架的基本操作流程為:
1)Android應(yīng)用程序通過綁定服務(wù)接口綁定設(shè)備管理服務(wù),綁定之后,通過設(shè)備管理服務(wù)的AIDL接口文件,即可獲得設(shè)備管理服務(wù)中DVD、GPIO、音頻管理等所有設(shè)備提供的功能接口。
2)應(yīng)用程序調(diào)用設(shè)備管理服務(wù)AIDL接口文件中提供的功能接口。
3)設(shè)備管理服務(wù)感知應(yīng)用程序的調(diào)用操作,將應(yīng)用程序的調(diào)用轉(zhuǎn)化為命令格式[9],并將該命令通過Android Local Socket方式發(fā)送給設(shè)備管理守護(hù)進(jìn)程。
4)設(shè)備管理守護(hù)進(jìn)程接收到調(diào)用命令,根據(jù)已定義的命令格式,對接收到的命令進(jìn)行解析,得到調(diào)用的設(shè)備名稱。如果是第一次調(diào)用該設(shè)備[10],則首先加載該設(shè)備的功能動態(tài)庫,并調(diào)用動態(tài)庫中的初始化接口XXX_init進(jìn)行初始化工作,否則直接調(diào)用該設(shè)備功能動態(tài)庫的命令處理接口XXX_processCmd進(jìn)行命令處理。
5)設(shè)備功能動態(tài)庫接收守護(hù)進(jìn)程傳遞下來的功能接口名稱和參數(shù),并通過Linux操作系統(tǒng)提供的系統(tǒng)調(diào)用接口調(diào)用設(shè)備內(nèi)核驅(qū)動。
6)設(shè)備內(nèi)核驅(qū)動通過操作設(shè)備硬件寄存器等方式實現(xiàn)向下層調(diào)用硬件操作功能。
7)設(shè)備硬件接收內(nèi)核設(shè)備驅(qū)動的硬件操作命令,執(zhí)行硬件功能實現(xiàn)并在必要時返回響應(yīng)數(shù)據(jù)。
根據(jù)Android車載終端設(shè)備的特點,本文提出了設(shè)備管理框架的概念,設(shè)計并實現(xiàn)了專門針對Android車載終端的設(shè)備管理框架,將系統(tǒng)中非Android原生的設(shè)備進(jìn)行統(tǒng)一控制和管理。
通過設(shè)計、實現(xiàn)及使用該設(shè)備管理框架,為應(yīng)用程序開發(fā)提供了統(tǒng)一的接口,降低了應(yīng)用程序開發(fā)的難度,提高了應(yīng)用程序的代碼復(fù)用和可移植性;通過對設(shè)備的統(tǒng)一控制和管理,避免了多個應(yīng)用同時對同一硬件進(jìn)行操作存在的安全等隱患,有效地提高了系統(tǒng)的安全性。設(shè)備管理框架采用標(biāo)準(zhǔn)而又靈活的體系結(jié)構(gòu)設(shè)計,非常易于后續(xù)擴(kuò)展,同時易于在Android平臺的不同項目之間推廣和復(fù)用,給設(shè)備系統(tǒng)帶來了多方面的顯著有益效果,達(dá)到了設(shè)計要求。
[1]宋滟泓.Android獨大引二次開發(fā)潮中國廠商少積累難有作為[J].IT時代周刊,2012(6):51-52.
[2]百度百科.Android[EB/OL].[2015-01-25].http://baike.baidu.com/subview/1241829/9322617.htm.
[3]韓超,梁泉.Android系統(tǒng)原理及開發(fā)要點詳解[M].北京:電子工業(yè)出版社,2010.
[4]阿耀.JNI:使用Java調(diào)用本地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內(nèi)核設(shè)計與實現(xiàn)[M].3版.北京:機(jī)械工業(yè)出版社,2011.
[6]宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].2版.北京:人民郵電出版社,2010.
[7]李先妹.數(shù)字化變電站網(wǎng)絡(luò)通信技術(shù)的研究[J].陜西電力,2011(6):37-40.
[8]徐進(jìn),徐榮森,梅正茂.基于1394b總線仿真設(shè)備的WDM驅(qū)動開發(fā)[J].電子設(shè)計工程,2015(2):63-66.
[9]李剛.基于SOA的Web GIS系統(tǒng)框架設(shè)計分析[J].陜西電力,2011(2):38-41.
[10]張銀勇,吳劍,李向黨.某推進(jìn)系統(tǒng)氣路啟動特性研究[J].火箭推進(jìn),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—),男,福建泉州人,工程師。研究方向:嵌入式系統(tǒng)。