賈 堂 曹 健,2* 官 玫 張 興,2
1(北京大學(xué)軟件與微電子學(xué)院 北京100871)2(北京大學(xué)信息科學(xué)技術(shù)學(xué)院 北京100871)
?
基于Android的虛擬桌面USB設(shè)備重映像系統(tǒng)的設(shè)計
賈堂1曹健1,2*官玫1張興1,2
1(北京大學(xué)軟件與微電子學(xué)院北京100871)2(北京大學(xué)信息科學(xué)技術(shù)學(xué)院北京100871)
虛擬桌面是基于服務(wù)器的計算模型,可提高計算機的資源管理效率?,F(xiàn)有的虛擬桌面對USB設(shè)備支持不足,無法實現(xiàn)USB設(shè)備的桌面虛擬化。針對這一問題,在基于Android的虛擬桌面上設(shè)計USB設(shè)備重映像系統(tǒng),實現(xiàn)通過虛擬桌面對USB設(shè)備的操控。該系統(tǒng)通過NDK構(gòu)建USB設(shè)備監(jiān)聽模塊和控制模塊,利用Socket在進程間傳遞USB設(shè)備信息,利用基于TCP/IP協(xié)議的消息框架與服務(wù)器進行數(shù)據(jù)傳輸。實驗結(jié)果表明,在Android虛擬桌面上對重映像的USB設(shè)備進行讀寫操作,其傳輸速率與本地USB的傳輸速率相當。
虛擬桌面AndroidUSB設(shè)備重映像
虛擬桌面是一種基于服務(wù)器的計算模型,它通過虛擬化技術(shù)將服務(wù)器上的資源以桌面系統(tǒng)的形式映射到移動設(shè)備、個人計算機、瘦客戶機等終端設(shè)備。虛擬桌面運行于云計算數(shù)據(jù)中心,將終端設(shè)備與桌面環(huán)境解耦合[1]。用戶可通過終端設(shè)備登錄虛擬桌面,訪問服務(wù)器資源。
虛擬桌面通過網(wǎng)絡(luò)實現(xiàn)終端設(shè)備間的協(xié)同辦公,具有易管控、低成本、高安全性等優(yōu)點[2],已被廣泛應(yīng)用于大型企業(yè)的遠程辦公系統(tǒng)。然而,現(xiàn)有的虛擬桌面僅支持鼠標、鍵盤等USB設(shè)備,無法滿足用戶對USB存儲設(shè)備、USB多媒體設(shè)備的操控需求。為解決這一問題,在Android平臺上實現(xiàn)了USB設(shè)備重映像系統(tǒng),使用戶能夠在虛擬桌面上對接入終端的USB設(shè)備進行讀寫操作,實現(xiàn)了U盤、硬盤、USB攝像頭、智能卡讀卡器等USB設(shè)備的桌面虛擬化。
1.1桌面虛擬化技術(shù)
桌面虛擬化技術(shù)基于服務(wù)器虛擬化技術(shù),它對計算機資源進行整合和抽象,向終端用戶及應(yīng)用程序隱去計算資源的物理特性和硬件實現(xiàn)細節(jié),實現(xiàn)了桌面系統(tǒng)的遠程動態(tài)訪問與數(shù)據(jù)中心的統(tǒng)一托管。桌面虛擬化技術(shù)的架構(gòu)分為四層:資源池層、桌面管理層、網(wǎng)絡(luò)接入層和終端接入層,分別負責計算資源的部署、桌面系統(tǒng)的調(diào)度、網(wǎng)絡(luò)的連接以及終端設(shè)備的接入。
1.2USB設(shè)備重映像技術(shù)
USB設(shè)備重映像技術(shù)是指運行在終端上的虛擬桌面可識別并操控與該終端連接的USB設(shè)備。系統(tǒng)將USB設(shè)備描述符信息通過TCP/IP協(xié)議發(fā)送至服務(wù)器虛擬機端,從而將USB設(shè)備的使用權(quán)交由虛擬桌面。同時將終端設(shè)置為USB代理,負責處理用戶在虛擬桌面上對USB設(shè)備的操控請求。Android平臺虛擬桌面上的USB設(shè)備重映像技術(shù)涉及Android NDK開發(fā)、虛擬桌面專用協(xié)議PCoIP、JNI接口設(shè)計以及Unix進程間的通信。
2.1開發(fā)環(huán)境及功能概述
系統(tǒng)采用Android Studio為開發(fā)平臺,以Java語言為Android應(yīng)用層開發(fā)語言,以C++語言為Android Native層開發(fā)語言,利用NDK構(gòu)建Android Native層核心功能模塊,以Junit為系統(tǒng)測試框架[3]。
系統(tǒng)運行過程中可實時獲取連接Android終端的USB設(shè)備信息,并更新用戶操作界面,顯示已連接的USB設(shè)備,為用戶提供操作菜單。系統(tǒng)響應(yīng)USB設(shè)備重映像操作后可將USB設(shè)備信息通過消息傳遞框架通知服務(wù)器,將連接Android終端的USB設(shè)備的使用權(quán)交由虛擬桌面。
2.2架構(gòu)設(shè)計
虛擬桌面USB設(shè)備重映像系統(tǒng)由用戶操作界面、設(shè)備監(jiān)聽模塊、消息控制模塊、虛擬桌面和服務(wù)器五部分組成,如圖1所示。

圖1 系統(tǒng)整體架構(gòu)
系統(tǒng)分為應(yīng)用層、JNI接口層和Native層(本地層)。其中應(yīng)用層運行虛擬桌面,提供與用戶交互的界面。接口層提供JNI接口,負責應(yīng)用層Java程序和Native層C++動態(tài)鏈接庫的互相調(diào)用。監(jiān)聽模塊和控制模塊位于Native層,監(jiān)聽模塊接收并處理應(yīng)用層USB設(shè)備狀態(tài)廣播,獲取USB設(shè)備信息,響應(yīng)用戶的USB操作請求;控制模塊調(diào)用USB函數(shù)庫,接收監(jiān)聽模塊傳遞的USB描述符信息,負責系統(tǒng)運行中線程之間的消息傳遞。消息傳遞框架基于TCP/IP協(xié)議[4],負責控制模塊與服務(wù)器的數(shù)據(jù)及請求傳遞。服務(wù)器為虛擬桌面提供運行環(huán)境,與應(yīng)用層通過PCoIP協(xié)議進行通信[5]。
2.3功能設(shè)計
(1) 交互設(shè)計
系統(tǒng)為用戶呈現(xiàn)接入終端的USB設(shè)備,實時響應(yīng)用戶操作,系統(tǒng)與用戶的交互如圖2所示。

圖2 系統(tǒng)與用戶交互

圖3 系統(tǒng)工作流程
四個交互對象分別是用戶、UI線程、監(jiān)聽進程和虛擬桌面。UI線程負責響應(yīng)用戶的請求事件,監(jiān)聽進程獲取USB設(shè)備信息并反饋給UI線程,UI線程更新設(shè)備緩存并將USB設(shè)備以圖標形式呈現(xiàn)給用戶。響應(yīng)用戶對USB設(shè)備的重映像請求后,UI線程向服務(wù)器發(fā)起連接請求,經(jīng)過握手操作,服務(wù)器會識別該USB設(shè)備,用戶可在虛擬桌面上操控USB設(shè)備。系統(tǒng)工作流程如圖3所示。
(2) 監(jiān)聽功能
為保障系統(tǒng)準確獲取USB設(shè)備狀態(tài),監(jiān)聽模塊應(yīng)包含監(jiān)聽USB設(shè)備狀態(tài)、獲取USB設(shè)備信息、過濾與系統(tǒng)不兼容的設(shè)備、提供應(yīng)用層接口、與UI線程通信等功能。具體而言,監(jiān)聽模塊監(jiān)聽USB設(shè)備狀態(tài),獲取能與系統(tǒng)兼容的USB設(shè)備的描述符。USB設(shè)備描述符記錄了設(shè)備序列號、設(shè)備適用的協(xié)議類型、設(shè)備商和產(chǎn)品編號等信息。監(jiān)聽模塊以動態(tài)鏈接庫的形式存在于Android Native層,提供與Android應(yīng)用層交互的接口。監(jiān)聽模塊可通過進程間通信的方式,將獲取的USB設(shè)備信息傳遞給UI線程,更新設(shè)備列表。監(jiān)聽模塊功能如圖4所示。

圖4 監(jiān)聽模塊功能

圖5 監(jiān)聽模塊工作流程
監(jiān)聽模塊的工作流程如圖5所示。
(3) 控制模塊設(shè)計
系統(tǒng)控制模塊完成USB設(shè)備信息接收、更新設(shè)備緩存觸發(fā)UI重繪、線程間消息處理、與應(yīng)用層交互、處理連接請求等操作。具體而言,控制模塊接收監(jiān)聽模塊傳遞的USB設(shè)備信息,更新設(shè)備緩存,保持與Android終端接入的USB設(shè)備同步,通過回調(diào)函數(shù)結(jié)合Android消息處理機制更新UI??刂颇K與安卓應(yīng)用層的交互包括模塊的加載和停用、與應(yīng)用層消息格式匹配等操作。同時,控制模塊負責處理與服務(wù)器的連接請求[6]??刂颇K功能如圖6所示。

圖6 控制模塊功能
控制模塊工作流程如圖7所示。

圖7 控制模塊工作流程
(4) JNI接口設(shè)計
系統(tǒng)應(yīng)用層Java程序和Native層C++程序無法直接互相調(diào)用,JNI接口用于實現(xiàn)Android應(yīng)用程序和Native動態(tài)鏈接庫的函數(shù)調(diào)用。系統(tǒng)主要JNI接口包括:加載USB設(shè)備監(jiān)聽模塊和控制模塊、監(jiān)聽模塊處理USB設(shè)備狀態(tài)廣播、監(jiān)聽模塊響應(yīng)USB設(shè)備操作的請求等。
(5) 通信設(shè)計
系統(tǒng)模塊之間的通信包括:
應(yīng)用層和監(jiān)聽模塊的通信,通過JNI接口實現(xiàn),主要包括監(jiān)聽模塊的啟動與信息的交互、USB設(shè)備的操作。
應(yīng)用層和控制模塊的通信,包括更新UI、連接虛擬機。
監(jiān)聽模塊和控制模塊的通信,利用Socket本地套接字,綁定Android系統(tǒng)內(nèi)部存儲作為監(jiān)聽模塊和控制模塊通信的管道。
虛擬桌面與服務(wù)器之間的圖像、聲音傳遞,利用PCoIP協(xié)議(基于UDP協(xié)議)實現(xiàn)。
控制模塊與服務(wù)器傳遞URB及USB數(shù)據(jù)包,利用基于TCP/IP協(xié)議的消息傳遞框架實現(xiàn)。
3.1監(jiān)聽模塊功能實現(xiàn)
監(jiān)聽模塊在Android后臺運行,交互界面設(shè)置監(jiān)聽模塊啟動框,當框內(nèi)狀態(tài)改變時,系統(tǒng)進行判斷,若為選中狀態(tài),則調(diào)用創(chuàng)建監(jiān)聽進程的函數(shù)。若取消選擇,則調(diào)用終止監(jiān)聽服務(wù)的函數(shù)。Android 3.1版本開始支持USB HOST模式,可以實現(xiàn)利用Android廣播機制獲取USB設(shè)備狀態(tài)信息[7]。系統(tǒng)創(chuàng)建廣播接收對象,響應(yīng)USB設(shè)備狀態(tài)廣播消息,具體過程如圖8所示。

圖8 處理USB狀態(tài)廣播消息
監(jiān)聽模塊注冊廣播接收器,接收來自系統(tǒng)關(guān)于USB設(shè)備狀態(tài)的廣播,設(shè)置事件過濾。
監(jiān)聽模塊響應(yīng)事件廣播,重寫響應(yīng)函數(shù):查詢SQLite數(shù)據(jù)庫,若USB設(shè)備型號存在于數(shù)據(jù)庫中,表明該設(shè)備與重映像系統(tǒng)兼容,監(jiān)聽模塊會獲取并傳遞該USB設(shè)備信息,其偽碼如下:
Loop:
Step NONE_DEVICE_DETECTED:
Jump to Loop
Step USB_DEVICE_ATTACHED:
Get Device Information
if device in database:
Transfer Device Descriptor
else:break
Step USB_DEVICE_DETACHED:
Jump to Loop
3.2控制模塊功能實現(xiàn)
控制模塊的關(guān)鍵功能為處理多線程和異步消息。在Native線程中控制模塊通過Socket套接字獲取來自監(jiān)聽模塊的消息后,會回調(diào)應(yīng)用層Java函數(shù),發(fā)送增加設(shè)備的消息通知UI線程,更新UI。
控制模塊利用Handler類實現(xiàn)消息的獲取和發(fā)送,Handler將相應(yīng)的方法放入其所在線程中執(zhí)行。系統(tǒng)創(chuàng)建新線程時生成一個消息隊列(MessageQueue),作為裝載線程間消息的容器,同時生成一個循環(huán)Looper,用于管理消息隊列。Looper負責阻塞讀取隊列中的消息,將消息逐個發(fā)送至對應(yīng)的Handler完成響應(yīng)[8]。消息處理過程如圖9所示。

圖9 控制模塊消息處理
系統(tǒng)的消息存放于全局消息池Message Pool中,消息池中的首個消息直接通過new()方法生成,其他消息通過Recycle()回收函數(shù)回收至消息池中[9]。
3.3JNI接口
JNI使得在Java虛擬機(JVM)內(nèi)部運行的Java代碼能夠與用其他編程語言(C、C++和匯編語言)實現(xiàn)的庫和應(yīng)用程序進行交互[10]。系統(tǒng)通過JNI函數(shù)實現(xiàn)Android應(yīng)用層和Android Native層的函數(shù)調(diào)用。
應(yīng)用層的Java程序調(diào)用Native層程序時,JVM會向Native層傳遞兩個指針,分別為JNIEnv類型和jobject類型,形式如下:
JNIEXPORT void JNICALL Java_ClassName_MethodName
(JNIEnv *env,jobject obj)
{
/*Native層函數(shù)具體實現(xiàn)*/
}
JNIEnv類型的指針包含JVM的接口,通過該指針可以對Java程序進行操作,如創(chuàng)建Java類對象、獲取對象屬性、調(diào)用對象的方法等。jobject obj參數(shù)為聲明Native層函數(shù)的Java對象的引用。
Native層程序調(diào)用應(yīng)用層Java程序時,首先獲取Java類和類對象的屬性和方法。JNI定義jfieldID、jmethodID類分別表示應(yīng)用層Java類對象的屬性和方法。JNI函數(shù)通過ID識別不同的域和方法[11]。表1列出Native層程序調(diào)用應(yīng)用層程序的關(guān)鍵方法。

表1 Native層程序調(diào)用應(yīng)用層程序的關(guān)鍵方法
監(jiān)聽模塊檢測到USB設(shè)備接入時,會發(fā)送增加設(shè)備的消息,控制模塊響應(yīng)該消息,在UI線程中回調(diào)相應(yīng)的增加設(shè)備函數(shù),UI線程將需要回調(diào)的函數(shù)ID都放入同一個結(jié)構(gòu)體中統(tǒng)一命名,并在初始化函數(shù)設(shè)置相應(yīng)的環(huán)境變量[12]。
3.4進程間通信
監(jiān)聽模塊和控制模塊運行于不同進程中,系統(tǒng)利用Socket實現(xiàn)USB設(shè)備信息在不同進程間的傳遞。
Socket可用于網(wǎng)絡(luò)中計算機之間的通信,也可以用于本地不同進程之間的通信。Socket提供了多種套接字類型,系統(tǒng)采用AF_UNIX本地套接字來實現(xiàn)監(jiān)聽模塊和控制模塊之間的通信[13]。具體實現(xiàn)過程如圖10所示。

圖10 監(jiān)聽模塊和控制模塊通信
系統(tǒng)的監(jiān)聽模塊作為通信Server端,首先調(diào)用Socket()函數(shù)創(chuàng)建AF_UNIX類型的套接字,并在Android系統(tǒng)內(nèi)部存儲中創(chuàng)建文件。通過調(diào)用Bind()函數(shù)綁定該文件的絕對路徑:/data/data/filename,綁定成功后監(jiān)聽模塊可對Client端的連接請求進行阻塞監(jiān)聽。
控制模塊作為通信Client端,首先創(chuàng)建本地套接字,向Server端監(jiān)聽模塊發(fā)起連接請求。監(jiān)聽模塊通過與控制模塊進行握手響應(yīng)連接請求,連接成功后監(jiān)聽模塊和控制模塊可進行通信,直至其中一方調(diào)用Close()操作[14]。
4.1功能測試
測試采用Nexus 5手機運行虛擬桌面Horizon View 5.0[15],Android系統(tǒng)版本為4.4,USB設(shè)備為HP USB2.0存儲設(shè)備,容量為16 GB。測試地點網(wǎng)絡(luò)信號良好,無明顯干擾。
登錄虛擬桌面后啟動USB設(shè)備重映像主界面(USB Redirection),界面Arbitrator Devices一欄顯示接入Android終端的USB設(shè)備,如圖11所示。

圖11 系統(tǒng)運行結(jié)果
用戶可選擇USB設(shè)備進行重映像,虛擬桌面識別到設(shè)備后用戶即可對該USB設(shè)備進行讀寫操作,如圖12所示。

圖12 虛擬桌面識別重映像的USB設(shè)備
4.2傳輸速率測試
分別在Android平臺上的虛擬桌面、Android手機和個人計算機上傳輸相同的文件(虛擬桌面和PC均運行Windows 7 64位操作系統(tǒng),Android系統(tǒng)為4.4),測試10次后取傳輸速率(單位MB/s)的平均值,如圖13所示。

圖13 傳輸速率比較
測試結(jié)果顯示,在Android虛擬桌面上對重映像的USB設(shè)備進行讀寫操作,其讀寫速率達到手機讀寫USB設(shè)備速率的97%,PC讀寫USB設(shè)備速率的95%。
本文針對現(xiàn)有虛擬桌面無法對USB設(shè)備進行桌面虛擬化的問題,在Android平臺上設(shè)計了虛擬桌面USB設(shè)備重映像系統(tǒng),實現(xiàn)了用戶在Android虛擬桌面上對USB設(shè)備的操控。本文分析了USB設(shè)備重映像系統(tǒng)的功能,對系統(tǒng)進行架構(gòu)設(shè)計和模塊劃分。重點分析了USB設(shè)備的狀態(tài)監(jiān)聽和描述符信息的獲取、傳輸。經(jīng)過測試分析,用戶通過該系統(tǒng)在Android虛擬桌面上對重映像的USB設(shè)備進行讀寫操作,其速率達到手機和PC讀寫速率的95%以上,與本地USB傳輸速率相當。實驗顯示,USB設(shè)備重映像系統(tǒng)運行穩(wěn)定,可以應(yīng)用于大型企業(yè)的虛擬化辦公系統(tǒng),為用戶遠程操控USB設(shè)備帶來方便。
目前USB設(shè)備重映像功能是作為獨立的輕量級Android應(yīng)用而存在,用戶需手動加載功能模塊。如何將USB設(shè)備重映像功能融合到虛擬桌面應(yīng)用中,從而使系統(tǒng)可以自動加載設(shè)備監(jiān)聽、控制模塊,是本文未來的改進方向。
[1] Matthew Portnoy.Virtualization Essentials[M].USA:Sybex,2012:7-15.
[2] 丁順,李明祿,翁楚良,等.一種基于虛擬機的安全監(jiān)測方法[J].計算機應(yīng)用與軟件,2012,29(6):51-56.
[3] Do H,Rothermel G,Kinneer A.Prioritizing JUnit Test Cases:An Empirical Assessment and Cost-Benefits Analysis[J].Empirical Software Engineering,2006,11(1):33-70.
[4] Degermark M,Engan M,Nordgren B,et al.Low-loss TCP/IP header compression for wireless networks[J].Wireless Networks,1997,3(5):375-387.
[5] Calyam P,Patali R,Berryman A,et al.Utility-directed resource allocation in virtual desktop clouds[J].Computer Networks,2011,55(18):4112-4130.
[6] Zhou Y M,Guo H H.A Research of USB Device Redirection Mechanism over IP network in Desktop Cloud System[C]//Proceedings of the Advances in Intelligent Systems Research,2012.
[7] 張智.USB3.0 Host Model設(shè)計與實現(xiàn)[D].北京大學(xué),2011.
[8] Jun L,Hua-jun W.The Analyzing of Android Handler Misleading Usage and Avoiding It[J].Software,2013,34(3):147-148.
[9] Fang C W,Xie W B.Android-based Message Encryption Implementation[J] .Communications Technology,2012,45(6):14-16,20.
[10] 黃玉坤,陳榕,裴喜龍,等.基于跨語言對象遷移策略的復(fù)合本地對象模型[J].計算機研究與發(fā)展,2015,52(1):141-155.
[11] Lee Y H,Chandrian P,Li B.Efficient Java Native Interface for Android Based Mobile Devices[C]//Proceedings of 2011 IEEE 10th International Conference on Trust, Security and Privacy in Computing and Communications.IEEE,2011:1202-1209.
[12] Shabtai A,Kanonov U,Elovici Y,et al.“Andromaly”:a behavioral malware detection framework for android devices[J].Journal of Intelligent Information Systems,2012,38(1):161-190.
[13] Stevens W R,Rago S A.Advanced Programming in the UNIX Environment[M].3rd ed.Addison-Wesley Professional,2013.
[14] 黎源,王會進.Linux下面向?qū)ο蟮腟ocket程序設(shè)計研究[J].計算機應(yīng)用與軟件,2010,27(12):27-28,36.
[15] Jason Langone, Andre Leibovici.VMware View 5 Desktop Virtualization Solutions[M].Packt Publishing,2012 :16-18.
DESIGN OF USB REDIRECTION SYSTEM FOR VIRTUAL DESKTOP BASED ON ANDROID
Jia Tang1Cao Jian1,2*Guan Mei1Zhang Xing1,2
1(School of Software and Microelectronics,Peking University,Beijing 100871,China)2(SchoolofElectronicsEngineeringandComputerScience,PekingUniversity,Beijing100871,China)
Virtual desktop is a server-based computing model and can improve the efficiency of resource management on computers.Existing virtual desktop cannot realise desktop virtualisation of USB devices due to insufficient USB device support.To tackle this problem,we designed the USB redirection system on Android-based virtual desktop,and implemented the operation of USB devices through virtual desktop.The system exploits NDK to construct USB device monitor module and control module,exploits Socket to transmit USB device information between processes,and exploits TCP/IP-based message framework to transmit data with server.Experimental results demonstrated that to make the read and write operation on redirected USB device on Android-based virtual desktop has the data transmission rate similar to the rate on local USB.
Virtual desktopAndroidUSB device redirection
2015-04-24。PKU-ITU合作項目。賈堂,碩士生,主研領(lǐng)域:桌面虛擬化技術(shù),軟硬件協(xié)同設(shè)計。曹健,講師。官玫,碩士生。張興,教授。
TP30
A
10.3969/j.issn.1000-386x.2016.09.058