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