賈 堂 曹 健,2* 官 玫 張 興,2
1(北京大學軟件與微電子學院 北京100871)2(北京大學信息科學技術(shù)學院 北京100871)
?
基于Android的虛擬桌面USB設備重映像系統(tǒng)的設計
賈堂1曹健1,2*官玫1張興1,2
1(北京大學軟件與微電子學院北京100871)2(北京大學信息科學技術(shù)學院北京100871)
虛擬桌面是基于服務器的計算模型,可提高計算機的資源管理效率。現(xiàn)有的虛擬桌面對USB設備支持不足,無法實現(xiàn)USB設備的桌面虛擬化。針對這一問題,在基于Android的虛擬桌面上設計USB設備重映像系統(tǒng),實現(xiàn)通過虛擬桌面對USB設備的操控。該系統(tǒng)通過NDK構(gòu)建USB設備監(jiān)聽模塊和控制模塊,利用Socket在進程間傳遞USB設備信息,利用基于TCP/IP協(xié)議的消息框架與服務器進行數(shù)據(jù)傳輸。實驗結(jié)果表明,在Android虛擬桌面上對重映像的USB設備進行讀寫操作,其傳輸速率與本地USB的傳輸速率相當。
虛擬桌面AndroidUSB設備重映像
虛擬桌面是一種基于服務器的計算模型,它通過虛擬化技術(shù)將服務器上的資源以桌面系統(tǒng)的形式映射到移動設備、個人計算機、瘦客戶機等終端設備。虛擬桌面運行于云計算數(shù)據(jù)中心,將終端設備與桌面環(huán)境解耦合[1]。用戶可通過終端設備登錄虛擬桌面,訪問服務器資源。
虛擬桌面通過網(wǎng)絡實現(xiàn)終端設備間的協(xié)同辦公,具有易管控、低成本、高安全性等優(yōu)點[2],已被廣泛應用于大型企業(yè)的遠程辦公系統(tǒng)。然而,現(xiàn)有的虛擬桌面僅支持鼠標、鍵盤等USB設備,無法滿足用戶對USB存儲設備、USB多媒體設備的操控需求。為解決這一問題,在Android平臺上實現(xiàn)了USB設備重映像系統(tǒng),使用戶能夠在虛擬桌面上對接入終端的USB設備進行讀寫操作,實現(xiàn)了U盤、硬盤、USB攝像頭、智能卡讀卡器等USB設備的桌面虛擬化。
1.1桌面虛擬化技術(shù)
桌面虛擬化技術(shù)基于服務器虛擬化技術(shù),它對計算機資源進行整合和抽象,向終端用戶及應用程序隱去計算資源的物理特性和硬件實現(xiàn)細節(jié),實現(xiàn)了桌面系統(tǒng)的遠程動態(tài)訪問與數(shù)據(jù)中心的統(tǒng)一托管。桌面虛擬化技術(shù)的架構(gòu)分為四層:資源池層、桌面管理層、網(wǎng)絡接入層和終端接入層,分別負責計算資源的部署、桌面系統(tǒng)的調(diào)度、網(wǎng)絡的連接以及終端設備的接入。
1.2USB設備重映像技術(shù)
USB設備重映像技術(shù)是指運行在終端上的虛擬桌面可識別并操控與該終端連接的USB設備。系統(tǒng)將USB設備描述符信息通過TCP/IP協(xié)議發(fā)送至服務器虛擬機端,從而將USB設備的使用權(quán)交由虛擬桌面。同時將終端設置為USB代理,負責處理用戶在虛擬桌面上對USB設備的操控請求。Android平臺虛擬桌面上的USB設備重映像技術(shù)涉及Android NDK開發(fā)、虛擬桌面專用協(xié)議PCoIP、JNI接口設計以及Unix進程間的通信。
2.1開發(fā)環(huán)境及功能概述
系統(tǒng)采用Android Studio為開發(fā)平臺,以Java語言為Android應用層開發(fā)語言,以C++語言為Android Native層開發(fā)語言,利用NDK構(gòu)建Android Native層核心功能模塊,以Junit為系統(tǒng)測試框架[3]。
系統(tǒng)運行過程中可實時獲取連接Android終端的USB設備信息,并更新用戶操作界面,顯示已連接的USB設備,為用戶提供操作菜單。系統(tǒng)響應USB設備重映像操作后可將USB設備信息通過消息傳遞框架通知服務器,將連接Android終端的USB設備的使用權(quán)交由虛擬桌面。
2.2架構(gòu)設計
虛擬桌面USB設備重映像系統(tǒng)由用戶操作界面、設備監(jiān)聽模塊、消息控制模塊、虛擬桌面和服務器五部分組成,如圖1所示。
圖1 系統(tǒng)整體架構(gòu)
系統(tǒng)分為應用層、JNI接口層和Native層(本地層)。其中應用層運行虛擬桌面,提供與用戶交互的界面。接口層提供JNI接口,負責應用層Java程序和Native層C++動態(tài)鏈接庫的互相調(diào)用。監(jiān)聽模塊和控制模塊位于Native層,監(jiān)聽模塊接收并處理應用層USB設備狀態(tài)廣播,獲取USB設備信息,響應用戶的USB操作請求;控制模塊調(diào)用USB函數(shù)庫,接收監(jiān)聽模塊傳遞的USB描述符信息,負責系統(tǒng)運行中線程之間的消息傳遞。消息傳遞框架基于TCP/IP協(xié)議[4],負責控制模塊與服務器的數(shù)據(jù)及請求傳遞。服務器為虛擬桌面提供運行環(huán)境,與應用層通過PCoIP協(xié)議進行通信[5]。
2.3功能設計
(1) 交互設計
系統(tǒng)為用戶呈現(xiàn)接入終端的USB設備,實時響應用戶操作,系統(tǒng)與用戶的交互如圖2所示。
圖2 系統(tǒng)與用戶交互
圖3 系統(tǒng)工作流程
四個交互對象分別是用戶、UI線程、監(jiān)聽進程和虛擬桌面。UI線程負責響應用戶的請求事件,監(jiān)聽進程獲取USB設備信息并反饋給UI線程,UI線程更新設備緩存并將USB設備以圖標形式呈現(xiàn)給用戶。響應用戶對USB設備的重映像請求后,UI線程向服務器發(fā)起連接請求,經(jīng)過握手操作,服務器會識別該USB設備,用戶可在虛擬桌面上操控USB設備。系統(tǒng)工作流程如圖3所示。
(2) 監(jiān)聽功能
為保障系統(tǒng)準確獲取USB設備狀態(tài),監(jiān)聽模塊應包含監(jiān)聽USB設備狀態(tài)、獲取USB設備信息、過濾與系統(tǒng)不兼容的設備、提供應用層接口、與UI線程通信等功能。具體而言,監(jiān)聽模塊監(jiān)聽USB設備狀態(tài),獲取能與系統(tǒng)兼容的USB設備的描述符。USB設備描述符記錄了設備序列號、設備適用的協(xié)議類型、設備商和產(chǎn)品編號等信息。監(jiān)聽模塊以動態(tài)鏈接庫的形式存在于Android Native層,提供與Android應用層交互的接口。監(jiān)聽模塊可通過進程間通信的方式,將獲取的USB設備信息傳遞給UI線程,更新設備列表。監(jiān)聽模塊功能如圖4所示。
圖4 監(jiān)聽模塊功能
圖5 監(jiān)聽模塊工作流程
監(jiān)聽模塊的工作流程如圖5所示。
(3) 控制模塊設計
系統(tǒng)控制模塊完成USB設備信息接收、更新設備緩存觸發(fā)UI重繪、線程間消息處理、與應用層交互、處理連接請求等操作。具體而言,控制模塊接收監(jiān)聽模塊傳遞的USB設備信息,更新設備緩存,保持與Android終端接入的USB設備同步,通過回調(diào)函數(shù)結(jié)合Android消息處理機制更新UI。控制模塊與安卓應用層的交互包括模塊的加載和停用、與應用層消息格式匹配等操作。同時,控制模塊負責處理與服務器的連接請求[6]。控制模塊功能如圖6所示。
圖6 控制模塊功能
控制模塊工作流程如圖7所示。
圖7 控制模塊工作流程
(4) JNI接口設計
系統(tǒng)應用層Java程序和Native層C++程序無法直接互相調(diào)用,JNI接口用于實現(xiàn)Android應用程序和Native動態(tài)鏈接庫的函數(shù)調(diào)用。系統(tǒng)主要JNI接口包括:加載USB設備監(jiān)聽模塊和控制模塊、監(jiān)聽模塊處理USB設備狀態(tài)廣播、監(jiān)聽模塊響應USB設備操作的請求等。
(5) 通信設計
系統(tǒng)模塊之間的通信包括:
應用層和監(jiān)聽模塊的通信,通過JNI接口實現(xiàn),主要包括監(jiān)聽模塊的啟動與信息的交互、USB設備的操作。
應用層和控制模塊的通信,包括更新UI、連接虛擬機。
監(jiān)聽模塊和控制模塊的通信,利用Socket本地套接字,綁定Android系統(tǒng)內(nèi)部存儲作為監(jiān)聽模塊和控制模塊通信的管道。
虛擬桌面與服務器之間的圖像、聲音傳遞,利用PCoIP協(xié)議(基于UDP協(xié)議)實現(xiàn)。
控制模塊與服務器傳遞URB及USB數(shù)據(jù)包,利用基于TCP/IP協(xié)議的消息傳遞框架實現(xiàn)。
3.1監(jiān)聽模塊功能實現(xiàn)
監(jiān)聽模塊在Android后臺運行,交互界面設置監(jiān)聽模塊啟動框,當框內(nèi)狀態(tài)改變時,系統(tǒng)進行判斷,若為選中狀態(tài),則調(diào)用創(chuàng)建監(jiān)聽進程的函數(shù)。若取消選擇,則調(diào)用終止監(jiān)聽服務的函數(shù)。Android 3.1版本開始支持USB HOST模式,可以實現(xiàn)利用Android廣播機制獲取USB設備狀態(tài)信息[7]。系統(tǒng)創(chuàng)建廣播接收對象,響應USB設備狀態(tài)廣播消息,具體過程如圖8所示。
圖8 處理USB狀態(tài)廣播消息
監(jiān)聽模塊注冊廣播接收器,接收來自系統(tǒng)關(guān)于USB設備狀態(tài)的廣播,設置事件過濾。
監(jiān)聽模塊響應事件廣播,重寫響應函數(shù):查詢SQLite數(shù)據(jù)庫,若USB設備型號存在于數(shù)據(jù)庫中,表明該設備與重映像系統(tǒng)兼容,監(jiān)聽模塊會獲取并傳遞該USB設備信息,其偽碼如下:
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)應用層Java函數(shù),發(fā)送增加設備的消息通知UI線程,更新UI。
控制模塊利用Handler類實現(xiàn)消息的獲取和發(fā)送,Handler將相應的方法放入其所在線程中執(zhí)行。系統(tǒng)創(chuàng)建新線程時生成一個消息隊列(MessageQueue),作為裝載線程間消息的容器,同時生成一個循環(huán)Looper,用于管理消息隊列。Looper負責阻塞讀取隊列中的消息,將消息逐個發(fā)送至對應的Handler完成響應[8]。消息處理過程如圖9所示。
圖9 控制模塊消息處理
系統(tǒng)的消息存放于全局消息池Message Pool中,消息池中的首個消息直接通過new()方法生成,其他消息通過Recycle()回收函數(shù)回收至消息池中[9]。
3.3JNI接口
JNI使得在Java虛擬機(JVM)內(nèi)部運行的Java代碼能夠與用其他編程語言(C、C++和匯編語言)實現(xiàn)的庫和應用程序進行交互[10]。系統(tǒng)通過JNI函數(shù)實現(xiàn)Android應用層和Android Native層的函數(shù)調(diào)用。
應用層的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)用應用層Java程序時,首先獲取Java類和類對象的屬性和方法。JNI定義jfieldID、jmethodID類分別表示應用層Java類對象的屬性和方法。JNI函數(shù)通過ID識別不同的域和方法[11]。表1列出Native層程序調(diào)用應用層程序的關(guān)鍵方法。
表1 Native層程序調(diào)用應用層程序的關(guān)鍵方法
監(jiān)聽模塊檢測到USB設備接入時,會發(fā)送增加設備的消息,控制模塊響應該消息,在UI線程中回調(diào)相應的增加設備函數(shù),UI線程將需要回調(diào)的函數(shù)ID都放入同一個結(jié)構(gòu)體中統(tǒng)一命名,并在初始化函數(shù)設置相應的環(huán)境變量[12]。
3.4進程間通信
監(jiān)聽模塊和控制模塊運行于不同進程中,系統(tǒng)利用Socket實現(xiàn)USB設備信息在不同進程間的傳遞。
Socket可用于網(wǎng)絡中計算機之間的通信,也可以用于本地不同進程之間的通信。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)聽模塊通過與控制模塊進行握手響應連接請求,連接成功后監(jiān)聽模塊和控制模塊可進行通信,直至其中一方調(diào)用Close()操作[14]。
4.1功能測試
測試采用Nexus 5手機運行虛擬桌面Horizon View 5.0[15],Android系統(tǒng)版本為4.4,USB設備為HP USB2.0存儲設備,容量為16 GB。測試地點網(wǎng)絡信號良好,無明顯干擾。
登錄虛擬桌面后啟動USB設備重映像主界面(USB Redirection),界面Arbitrator Devices一欄顯示接入Android終端的USB設備,如圖11所示。
圖11 系統(tǒng)運行結(jié)果
用戶可選擇USB設備進行重映像,虛擬桌面識別到設備后用戶即可對該USB設備進行讀寫操作,如圖12所示。
圖12 虛擬桌面識別重映像的USB設備
4.2傳輸速率測試
分別在Android平臺上的虛擬桌面、Android手機和個人計算機上傳輸相同的文件(虛擬桌面和PC均運行Windows 7 64位操作系統(tǒng),Android系統(tǒng)為4.4),測試10次后取傳輸速率(單位MB/s)的平均值,如圖13所示。
圖13 傳輸速率比較
測試結(jié)果顯示,在Android虛擬桌面上對重映像的USB設備進行讀寫操作,其讀寫速率達到手機讀寫USB設備速率的97%,PC讀寫USB設備速率的95%。
本文針對現(xiàn)有虛擬桌面無法對USB設備進行桌面虛擬化的問題,在Android平臺上設計了虛擬桌面USB設備重映像系統(tǒng),實現(xiàn)了用戶在Android虛擬桌面上對USB設備的操控。本文分析了USB設備重映像系統(tǒng)的功能,對系統(tǒng)進行架構(gòu)設計和模塊劃分。重點分析了USB設備的狀態(tài)監(jiān)聽和描述符信息的獲取、傳輸。經(jīng)過測試分析,用戶通過該系統(tǒng)在Android虛擬桌面上對重映像的USB設備進行讀寫操作,其速率達到手機和PC讀寫速率的95%以上,與本地USB傳輸速率相當。實驗顯示,USB設備重映像系統(tǒng)運行穩(wěn)定,可以應用于大型企業(yè)的虛擬化辦公系統(tǒng),為用戶遠程操控USB設備帶來方便。
目前USB設備重映像功能是作為獨立的輕量級Android應用而存在,用戶需手動加載功能模塊。如何將USB設備重映像功能融合到虛擬桌面應用中,從而使系統(tǒng)可以自動加載設備監(jiān)聽、控制模塊,是本文未來的改進方向。
[1] Matthew Portnoy.Virtualization Essentials[M].USA:Sybex,2012:7-15.
[2] 丁順,李明祿,翁楚良,等.一種基于虛擬機的安全監(jiān)測方法[J].計算機應用與軟件,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設計與實現(xiàn)[D].北京大學,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] 黃玉坤,陳榕,裴喜龍,等.基于跨語言對象遷移策略的復合本地對象模型[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程序設計研究[J].計算機應用與軟件,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é)同設計。曹健,講師。官玫,碩士生。張興,教授。
TP30
A
10.3969/j.issn.1000-386x.2016.09.058