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