楊 程,黃俊偉,周俊揚,楊 倩
(1.重慶重郵信科股份有限公司應(yīng)用部,重慶 400065;2.重慶理工大學(xué)電子信息與自動化學(xué)院 重慶 400054)
QT 作為一款跨平臺的C++圖形用戶界面應(yīng)用程序開發(fā)框架,致力于發(fā)展跨平臺GUI 領(lǐng)域,以其優(yōu)良的跨平臺性、豐富的API和高程度的模塊化開始在行業(yè)終端中展現(xiàn)出不平凡的實力。
Android 日志系統(tǒng)(Android Logging System)是一套系統(tǒng)級的、多功能的日志系統(tǒng),它完整地記錄Android 智能系統(tǒng)從應(yīng)用層、框架層及其硬件抽象層等所有日志信息,同時Android 日志系統(tǒng)提供串口輸出功能,用戶可以將日志信息通過USB 傳輸至PC 端,再通過PC 端的調(diào)試工具呈現(xiàn)出來。
目前,在工程項目中,包括QT 在內(nèi)的多種應(yīng)用框架,由于沒有一套完善的系統(tǒng)調(diào)試解決方案,大部分的應(yīng)用開發(fā)都被局限于模擬器調(diào)試,而無法在設(shè)備上進行實時跟蹤調(diào)試,傳統(tǒng)的日志保存方法無法提供足夠的實時性且開發(fā)調(diào)試效率慢。
為了解決這一問題,本文提出了Android 日志系統(tǒng)跨平臺移植方案。不僅可以使QT 設(shè)備并且其他任意嵌入式Linux 設(shè)備都可以正常使用Android 日志系統(tǒng),本文以智能終端行業(yè)中最流行的兩種智能終端系統(tǒng)為研究對象,分析Android 日志系統(tǒng)的整體架構(gòu),并在QT 架構(gòu)上進行功能性移植,具有更好的代表性和實用價值。
Android是Google 開發(fā)的基于Linux 平臺的開源手機操作系統(tǒng),該平臺由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,被譽為第一個完整、開放而且免費的一種平臺[1]。截止2013 年初,基于Android 操作系統(tǒng)的智能手機占據(jù)全球市場份額的80%,中國市場占有率90%以上。
QT是一個跨平臺的C++ 圖形用戶界面庫,由挪威TrollTech 公司出品,目前包括QT,基于Framebuffer的QT Embedded,快速開發(fā)工具QT Designer,國際化工具QT Linguist 等部分QT 支持所有Unix 系統(tǒng),當(dāng)然也包括Linux,還支持WinNT/Win2k,Win95/98 平臺。使用QT 您只需一次性開發(fā)應(yīng)用程序,無須重新編寫源代碼,便可跨不同桌面和嵌入式操作系統(tǒng)部署這些應(yīng)用程序[2]。
圖1 Android 日志系統(tǒng)整體架構(gòu)圖
Android 日志系統(tǒng),主要分為兩個大的部分,一部分為Device 或Emulator 部分,第二部分為PC 部分。Device 端,主要完成保存全部的日志信息(Log)至內(nèi)核(Kernel)空間,并將其緩存在四個不同的循環(huán)緩沖區(qū)(Circular Buffer)中;開啟ADBD 守護進程,等待與PC 端進行信息交互。PC 端,根據(jù)不同用戶的不同需求,通過USB 獲取到Device 端緩存的日志信息,Client 可以使用ADB 命令行,也可以使用DDMS 等開發(fā)調(diào)試工具。
2.1.1 Android 日志開發(fā)接口
Android 日志信息中總共定義了5 種不同級別的輸出,系統(tǒng)根據(jù)LOG的等級判斷是否需要輸出相應(yīng)Log 信息,在IDE 中分別以不同的顏色,以便用戶能夠更精準(zhǔn)地進行查找。
2.1.2 Android Debug Bridge
(1)ADB 介紹
Android Debug Bridge是一種多功能的命令行工具,實現(xiàn)用戶與Android 智能手機或模擬器之間的通信功能,ADB 主要由客戶端、服務(wù)端和守護進程三部分組成。
(2)ADB 功能簡介
· 管理模擬器或設(shè)備狀態(tài)
· 在設(shè)備或模擬器上執(zhí)行命令
· 管理模擬器或設(shè)備上的端口信息
· 同步設(shè)備或模擬器上的文件信息
圖2 Android Log 設(shè)備端數(shù)據(jù)流程圖
Android 系統(tǒng)將日志信息分為四種不同的類型,分別為系統(tǒng)、RIL、音頻、以及主要信息。因此在Logger 驅(qū)動中,首先在初始化的過程中會生成4個MISC 文件,分別保存system、radio、main、event,每個MISC 文件中包含一個循環(huán)緩沖數(shù)據(jù)流(Circular Buffer),其內(nèi)容大小都為256 k,由于Android 日志系統(tǒng)記錄整個系統(tǒng)的日志信息,所以處于系統(tǒng)啟動流程中的優(yōu)先啟動對象(詳見3.1.1)。然后用戶根據(jù)需求對4個MISC 文件進行讀寫操作,在設(shè)備端通常是寫操作,通過open打開指定類型文件節(jié)點,通過writev,readv 對設(shè)備文件信息進行讀取操作。
3.1.1 Android 啟動流程
圖3 Android 啟動流程圖
Android 啟動流程主要包含:硬件上電、內(nèi)核啟動、INIT啟動。當(dāng)Android 完成INIT 過程后,根據(jù)init.rc和init_XXX.rc(指定設(shè)備INIT 配置信息)文件,開啟指定的后臺服務(wù)進程(Background Service Program),啟動Zygote 程序,再由Zygote 程序逐步啟動Android 上層GUI(Graphical User Interface)和應(yīng)用程序。
3.1.2 Android INIT 介紹
INIT是Linux 系統(tǒng)操作中不可缺少的程序之一,它是一個由內(nèi)核啟動的自動啟動的用戶級進程,進程編號始終為1[2]。Android INIT 主要完成的功能如下所示[3]:
(1)初始化日志系統(tǒng);
(2)解析init.rc和init.XXX.rc 文件;
(3)設(shè)備初始化;
(4)初始化屬性服務(wù)器;
(5)開啟屬性服務(wù);
(6)進入一個無限循環(huán)。
移植Android 日志系統(tǒng)方案設(shè)計主要可以分為兩個部分:QT 啟動流程設(shè)計;QT 日志函數(shù)設(shè)計。
3.2.1 QT 啟動流程設(shè)計
使用Android 日志系統(tǒng),首先需要完成Android 日志系統(tǒng)的初始化流程,完成文件設(shè)備節(jié)點的注冊;其次為了解決Android 日志系統(tǒng)保存日志信息不完整的問題,需要在QT的啟動過程中添加日志信息自動保存的守護進程,方便后續(xù)項目開發(fā)調(diào)試時進行查看;最后,啟動QT 平臺下的第一個應(yīng)用程序。
3.2.2 QT 日志函數(shù)設(shè)計
由于原生QT 日志輸入將定向為標(biāo)準(zhǔn)輸出流或標(biāo)準(zhǔn)錯誤輸入流中,我們需要修改QT 輸出日志的函數(shù)實現(xiàn),將日志內(nèi)容重定向到Android Logger 注冊的4個不同的MISC 文件節(jié)點中,完成Android 日志系統(tǒng)在QT 平臺上的移植。
圖4 傳統(tǒng)QT 啟動流程
傳統(tǒng)基于Linux的QT 設(shè)備在內(nèi)核啟動完成后,將直接通過init 程序進入QT的應(yīng)用處理流程。
圖5 移植后的QT 啟動流程
移植Android 日志系統(tǒng)首先需要有Android 系統(tǒng)的初始環(huán)境,所以需要移植Android的Init 程序,在完成日志系統(tǒng)的初始化后,通過Service 服務(wù)程序開啟ADBD 守護進程,用于與遠端ADB 進行信息交互,然后可以根據(jù)設(shè)備性能選擇性移植部分Service 程序,如Logcatd 進程,可以將所有的日志性能都保存在指定的路徑下,由于Android 保存日志信息的循環(huán)緩沖流只能保存256 k 數(shù)據(jù),超時的數(shù)據(jù)將被丟棄,使用Logcatd 進行完整信息保存,不論是在實時的調(diào)試或是離線調(diào)試都可很方便快捷地查看完整日志信息。最后啟動QT應(yīng)用。
在移植Android 日志系統(tǒng)的過程中,為了實現(xiàn)QT 日志信息與Android Logger的交互,需要將數(shù)據(jù)信息直接寫入到Logger的MISC 文件中,由2.2 章節(jié)可知,在Logger 存在4個不同的MISC 文件,我們現(xiàn)在只使用其中的main的MISC 文件,但可以根據(jù)修改,使用不同的MISC 文件,進行分別保存。代碼實現(xiàn)細節(jié)如下:
步驟一:在QT應(yīng)用中加入測試LOG 信息;
步驟二:設(shè)備上運行QT 程序,通過ADB 截取LOG;
步驟三:觀察LOG 內(nèi)容及時間。
測試完成,驗證成功。
本文通過對Android 日志系統(tǒng)從架構(gòu)和流程上做出深入剖析,提出一種新型的、跨平臺的系統(tǒng)調(diào)試解決方案設(shè)計,并成功在以QT為架構(gòu)的工程實現(xiàn)中得到驗證。本設(shè)計方案在未來將不僅限于QT,應(yīng)用空間潛力巨大。除Android 日志系統(tǒng)外,其還擁有很多可以被其他平臺吸取的優(yōu)點,比如在通信業(yè)務(wù)方面的RIL 框架設(shè)計,獨立硬件設(shè)備的硬件抽象層的理念。如何更好地吸收這些開發(fā)資源的優(yōu)點,運用于我們自身所需要的地方,將成為繼續(xù)研究的方向。
[1]韓超,梁泉.Android 系統(tǒng)原理及開發(fā)要點詳解[M].北京:電子工業(yè)出版社,2010:10.
[2]閆效鶯.基于嵌入式Linux 軟件平臺技術(shù)的研究[D].西安:西北大學(xué),2006:45.
[3]李凱.Android 操作系統(tǒng)分析與移植[D].廣州:華南理工大學(xué),2011:37.