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