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