基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法
【專利摘要】本發(fā)明公開了一種基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,包括:修改虛擬機(jī)中的各Android系統(tǒng)中的圖形管理服務(wù),使得宿主機(jī)中Android系統(tǒng)和虛擬機(jī)中的各Android系統(tǒng)的圖形管理服務(wù)各自獨(dú)占一個(gè)tty設(shè)備;用戶通過輸入設(shè)備使內(nèi)核中產(chǎn)生輸入事件,內(nèi)核將該輸入事件轉(zhuǎn)發(fā)至各個(gè)Android系統(tǒng)中的輸入管理服務(wù),各Android系統(tǒng)接收到內(nèi)核傳來的輸入事件后,判斷當(dāng)前運(yùn)行的tty設(shè)備是否是自己占據(jù)的;如果是,則接收并處理該輸入事件;否則,則屏蔽該輸入事件。本發(fā)明充分利用Linux內(nèi)核的隔離性,解決了多個(gè)Android系統(tǒng)對輸入設(shè)備和顯示設(shè)備的分配問題。
【專利說明】基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)虛擬化【技術(shù)領(lǐng)域】,尤其涉及基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法。
【背景技術(shù)】
[0002]在Android操作系統(tǒng)的用戶量迅速增長的背景下,其安全性也受到越來越廣泛的關(guān)注。由于Android缺乏像iOS那樣封閉的生態(tài)系統(tǒng),惡意軟件已經(jīng)成為其安全性的最大威脅。為了限制惡意軟件的活動范圍,最大限度地保護(hù)用戶的個(gè)人信息,有人提出了 Android虛擬化這一解決方案。Android虛擬化是指在一臺設(shè)備上運(yùn)行多個(gè)Android操作系統(tǒng),這些操作系統(tǒng)相互隔離,安裝在某一個(gè)系統(tǒng)中的應(yīng)用軟件無法對其它系統(tǒng)構(gòu)成影響。這樣就可以將用戶的個(gè)人信息封鎖在某一個(gè)系統(tǒng)中,即使其它系統(tǒng)中安裝了惡意軟件也不會對個(gè)人信息構(gòu)成威脅。在這些虛擬化解決方案中,基于Container技術(shù)的虛擬化相對其它方案具有很大的性能優(yōu)勢。
[0003]Container (容器)技術(shù)是近年來操作系統(tǒng)虛擬化領(lǐng)域迅猛發(fā)展起來的一種技術(shù)。相較于其他的虛擬化技術(shù),Container技術(shù)是一種輕量級的虛擬化解決方案。該技術(shù)能夠利用Linux內(nèi)核提供的命名空間(NameSpace)特性和控制分組(Cgroups)特性來隔離出一套完整的虛擬平臺。因?yàn)镃ontainer技術(shù)隔離出的虛擬機(jī)平臺僅僅是主機(jī)系統(tǒng)中的一組進(jìn)程,而不需要完全模擬出一整套的硬件環(huán)境,所以Container技術(shù)一個(gè)最明顯的優(yōu)勢就是快速、輕量級。目前云計(jì)算領(lǐng)域在實(shí)現(xiàn)私有云的部署時(shí),主要就是采用Container技術(shù)。
[0004]因?yàn)榫哂猩鲜鎏攸c(diǎn),所以Container技術(shù)非常適合運(yùn)用到Android操作系統(tǒng)的虛擬化中。眾所周知,Android是為智能手機(jī)和其他手持式設(shè)備設(shè)計(jì)的一款操作系統(tǒng)。手持設(shè)備處理器的性能完全不足以讓傳統(tǒng)的虛擬化技術(shù)運(yùn)用在其上,而占用資源極少的Container技術(shù)則恰恰彌補(bǔ)了這個(gè)不足。
[0005]Android操作系統(tǒng)的架構(gòu)也使得其運(yùn)用Container技術(shù)成為可能。Android系統(tǒng)的底層是Linux內(nèi)核,上層則基于Linux內(nèi)核搭建起了 Android的運(yùn)行環(huán)境層。通過在Linux內(nèi)核層和Android層之間采用Container技術(shù),就可以達(dá)到多個(gè)Android運(yùn)行環(huán)境層共同運(yùn)行在一個(gè)內(nèi)核之上的效果。不同的Android運(yùn)行環(huán)境可以有不同的用戶數(shù)據(jù)、應(yīng)用、文件系統(tǒng)和設(shè)備。而進(jìn)程調(diào)度、內(nèi)存管理、與硬件交互等具體問題則交于Linux內(nèi)核統(tǒng)一管理。
[0006]不同的Android運(yùn)行環(huán)境層共用一個(gè)Linux內(nèi)核,也就得共用一套物理設(shè)備資源。這就帶來如何管理這些設(shè)備,讓每個(gè)Android運(yùn)行環(huán)境層都能以看似獨(dú)占的方式使用這些設(shè)備的問題。傳統(tǒng)的技術(shù)和觀念是所謂的“設(shè)備虛擬化”,即通過添加Linux內(nèi)核驅(qū)動,增加虛擬設(shè)備以模仿物理設(shè)備的功能,然后再在物理設(shè)備中添加處理和仲裁的相關(guān)功能。這種思路對于Linux虛擬設(shè)備非常適合,但是對于物理設(shè)備,修改驅(qū)動的方法必然會帶來非常大的不可移植性。因而對于物理設(shè)備,更好的思路應(yīng)該是充分利用內(nèi)核提供的隔離特性,從Android運(yùn)行環(huán)境層入手,對資源進(jìn)行隔離。[0007]在所有的這些設(shè)備中,最重要的就是用戶輸入和圖形顯示兩部分設(shè)備,因此如何進(jìn)行讓多Android系統(tǒng)共享輸入顯示設(shè)備是需要解決的問題。
【發(fā)明內(nèi)容】
[0008]為了增加Android系統(tǒng)運(yùn)行的安全性,利用Container技術(shù)進(jìn)行Android系統(tǒng)的虛擬化,為了解決在單Linux內(nèi)核中多Android系統(tǒng)共享輸入顯示設(shè)備的問題,本發(fā)明提供了一種多Android系統(tǒng)共享輸入和顯不設(shè)備的方法。
[0009]—種基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,所述多Android系統(tǒng)運(yùn)行于單Linux內(nèi)核環(huán)境中,所述多Android系統(tǒng)的其中一個(gè)運(yùn)行于宿主機(jī)中,其余運(yùn)行在虛擬機(jī)中,包括:
[0010]初始化虛擬機(jī)中的各Android系統(tǒng)中的圖形管理服務(wù),使得宿主機(jī)中Android系統(tǒng)和虛擬機(jī)中的各Android系統(tǒng)的圖形管理服務(wù)各自獨(dú)占一個(gè)tty設(shè)備;
[0011]用戶通過輸入設(shè)備使內(nèi)核中產(chǎn)生輸入事件,內(nèi)核將該輸入事件轉(zhuǎn)發(fā)至各個(gè)Android系統(tǒng)中的輸入管理服務(wù),各Android系統(tǒng)接收到內(nèi)核傳來的輸入事件后,判斷當(dāng)前在前臺運(yùn)行的tty設(shè)備是否是自己占據(jù)的;
[0012]如果是,則接收并處理該輸入事件;
[0013]否則,則屏蔽該輸入事件。
[0014]利用單Linux內(nèi)核的隔離性,使得宿主機(jī)與虛擬機(jī)各自占用一個(gè)tty設(shè)備,并且在不同的tty設(shè)備中打開設(shè)備文件并寫入文件互不影響。通過讓Android輸入管理服務(wù)自主判斷當(dāng)前內(nèi)核傳來的輸入事件是否為傳給自己,有選擇的屏蔽或接收該輸入事件,從而實(shí)現(xiàn)了輸入設(shè)備的共享。
[0015]圖形管理服務(wù)通過以下新增的代碼來各自獨(dú)占一個(gè)tty設(shè)備,其中新增的代碼是預(yù)先設(shè)定的,代碼增加方式如下:
[0016]SI,在圖形管理服務(wù)的DisplayDevice類中增加一個(gè)新類TerminalManager,TerminalManager 繼承 Android 系統(tǒng)的基類 Thread ;
[0017]S2,將TerminalManager的對象mTermManager作為成員變量添加到DisplayDevice 類中。
[0018]SurfaceFlinger是Android系統(tǒng)的圖形管理服務(wù),其源代碼位于Android系統(tǒng)的 frameworks/native/services/surfaceflinger 目錄下。通過在 DisplayDevice.cpp增加一個(gè)新類TerminalManager,讓各個(gè)Android系統(tǒng)的SurfaceFlinger占據(jù)一個(gè)不同的tty設(shè)備進(jìn)行顯示。mTermManager使得圖形管理服務(wù)另外啟動一個(gè)線程。新線程專門負(fù)責(zé)接收并處理內(nèi)核發(fā)來的獲得屏幕和釋放屏幕的信號。因?yàn)閳D形管理服務(wù)SurfaceFlinger中操縱顯示設(shè)備的代碼實(shí)現(xiàn)在類DisplayDevice中,所以在DisplayDevice中添加對象mTermManager能夠更自然而方便的實(shí)現(xiàn)上述作用。
[0019]所述新類TerminalManager 用于:
[0020]向操作系統(tǒng)查詢空閑的tty設(shè)備,并將圖形管理服務(wù)切換到該tty設(shè)備,切換完成后將新tty設(shè)備設(shè)置為圖形模式;
[0021]設(shè)置新tty設(shè)備的切換操作方式為由進(jìn)程管理,并通過用戶自定義的方式增加獲取屏幕和釋放屏幕兩個(gè)響應(yīng)信號;[0022]以及向內(nèi)核中注冊所述兩個(gè)響應(yīng)信號的處理函數(shù)。
[0023]其中,用戶自定義是指Linux的一個(gè)信號類型SI⑶SR。通過調(diào)用SurfaceFlinger的screenAcquired函數(shù)和screenReleased函數(shù)即可實(shí)現(xiàn)兩個(gè)響應(yīng)信號的響應(yīng)函數(shù)。
[0024]其中宿主機(jī)和虛擬機(jī)運(yùn)行在各自的命名空間內(nèi),并且由Cgroups組件限制虛擬機(jī)能夠訪問的資源。在Android系統(tǒng)中建立命名空間,使得宿主機(jī)和虛擬機(jī)的圖形管理器運(yùn)行在不同的命名空間中,宿主機(jī)和虛擬機(jī)相互感知不到對方的存在,從而為宿主機(jī)和虛擬機(jī)之間提供隔離保證。再使用Cgroups組件限制虛擬機(jī)能夠訪問的資源,并限制其權(quán)限,這樣就保證了宿主機(jī)的安全。
[0025]宿主機(jī)和虛擬機(jī)中對應(yīng)目錄下的tty設(shè)備文件都分配相同的主設(shè)備號和次設(shè)備號。
[0026]宿主機(jī)中tty設(shè)備文件的主設(shè)備號與虛擬機(jī)中tty設(shè)備文件的主設(shè)備號相同,宿主機(jī)中tty設(shè)備文件的次設(shè)備號與虛擬機(jī)中tty設(shè)備文件的次設(shè)備號相同,這樣內(nèi)核中所有的虛擬tty設(shè)備對宿主機(jī)和虛擬機(jī)都是可見的。虛擬機(jī)圖形界面在啟動的時(shí)候向內(nèi)核中查詢空閑的tty設(shè)備并占據(jù)該設(shè)備作為自己的輸出終端。這樣當(dāng)宿主機(jī)和虛擬機(jī)各自獨(dú)占一個(gè)tty設(shè)備后,就可以獨(dú)立隔離地讀寫幀緩存設(shè)備文件,從而實(shí)現(xiàn)宿主系統(tǒng)和虛擬系統(tǒng)能夠同時(shí)地在不同的tty設(shè)備下顯示自己的圖形界面而互不干擾。
[0027]各Android系統(tǒng)通過輸入管理服務(wù)中的代碼邏輯來判斷當(dāng)前在前臺運(yùn)行的tty設(shè)備是否是自己占據(jù)的,其中代碼邏輯是預(yù)先增加的。
[0028]通過修改各Android系統(tǒng)中的輸入管理服務(wù),使各Android系統(tǒng)屏蔽不屬于自己tty設(shè)備的事件,轉(zhuǎn)交屬于自己tty設(shè)備的輸入事件,避免了輸入沖突。
[0029]預(yù)先增加的代碼邏輯在各Android系統(tǒng)中輸入管理服務(wù)中的EventHub類下的成員函數(shù)getEvents中,代碼邏輯分為兩部分:
[0030]輸入管理服務(wù)每次從輸入設(shè)備文件中讀取輸入事件時(shí),取得當(dāng)前在前臺運(yùn)行的tty設(shè)備的編號;
[0031]并通過所取得的編號判斷在前臺運(yùn)行的tty設(shè)備是不是對應(yīng)SurfaceFlinger所占據(jù)的tty設(shè)備,如果不是則表明該輸入事件不是發(fā)送給自己的,則對消息不作處理;否則接受消息并進(jìn)行處理。
[0032]當(dāng)前運(yùn)行的tty設(shè)備為Linux系統(tǒng)的一種狀態(tài):如果一個(gè)tty設(shè)備的內(nèi)容輸出到顯示器上,那么這個(gè)tty設(shè)備就是當(dāng)前在前臺運(yùn)行的tty設(shè)備。例如,在Linux中,圖形界面輸出到tty7,在按下ctrl+alt+fl鍵時(shí),系統(tǒng)切換到了 ttyl, ttyl的內(nèi)容顯示在顯示器上,那么當(dāng)前在前臺運(yùn)行的tty設(shè)備就是ttyl ;而通過按下ctrl+alt+f7鍵切換回圖形界面時(shí),則tty7的內(nèi)容輸出到顯示器上,這時(shí)當(dāng)前在前臺運(yùn)行的tty設(shè)備就是tty7。
[0033]Android輸入管理服務(wù)是WindowManagerService。該服務(wù)代碼的實(shí)現(xiàn)分java和c++兩層,在修改輸入管理服務(wù)時(shí),只需修改c++層,將不必要的事件屏蔽即可。
[0034]WindowManagerService 的 c++層代碼實(shí)現(xiàn)在 frame/base/service/input 中,該目錄下的EventHub.cpp負(fù)責(zé)讀取/dev/input下的設(shè)備文件來獲取用戶輸入,因此修改該文件即可。具體地,類EventHub下的成員函數(shù)getEvents負(fù)責(zé)讀取用戶輸入,因此通過在該成員函數(shù)getEvents中增加代碼邏輯來實(shí)現(xiàn)對輸入管理服務(wù)的修改。
[0035]通過本發(fā)明基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,充分利用Linux內(nèi)核的隔離性,解決了多個(gè)Android系統(tǒng)同時(shí)運(yùn)行時(shí)對輸入設(shè)備和顯示設(shè)備的分配問題。
【專利附圖】
【附圖說明】
[0036]圖1是本發(fā)明一個(gè)實(shí)施例的架構(gòu)圖;
[0037]圖2是本發(fā)明實(shí)施例從系統(tǒng)啟動到運(yùn)行SurfaceFlinger的流程圖;
[0038]圖3是Android系統(tǒng)輸入部分的架構(gòu)圖。
【具體實(shí)施方式】
[0039]基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法主要對Android系統(tǒng)進(jìn)行修改。本發(fā)明實(shí)施例進(jìn)行操作的Android系統(tǒng)版本為Android4.3。
[0040]圖1為本發(fā)明一個(gè)實(shí)施例整體的架構(gòu)圖,當(dāng)前實(shí)施例中包括I個(gè)虛擬機(jī)。如圖1所示,Linux內(nèi)核為宿主機(jī)和虛擬機(jī)分別提供命名空間,宿主機(jī)和虛擬機(jī)運(yùn)行在各自的命名空間內(nèi),且由Cgroups組件限制虛擬機(jī)能夠訪問的空間。在初始化圖形管理服務(wù)以后,宿主機(jī)和虛擬機(jī)中Android系統(tǒng)的SurfaceFlinger各自占用一個(gè)tty設(shè)備,宿主機(jī)中表示為ttyX,虛擬機(jī)中表示為tty Y。宿主機(jī)和虛擬機(jī)中的tty設(shè)備均配置為圖形模式,且各個(gè)各自占據(jù)對應(yīng)的tty設(shè)備,且宿主機(jī)tty設(shè)備文件的主設(shè)備號和次設(shè)備號與虛擬機(jī)中tty設(shè)備文件的主設(shè)備號和次設(shè)備號相同。
[0041]現(xiàn)具體說明本發(fā)明當(dāng)前實(shí)施例基于單Linux內(nèi)核的多Android系統(tǒng)共享顯示設(shè)備的方法:圖2給出了本發(fā)明當(dāng)前實(shí)施例從系統(tǒng)啟動到宿主機(jī)運(yùn)行SurfaceFlinger (即圖形管理服務(wù))的簡要流程圖(步驟(I)至步驟(3)),具體步驟如下:
[0042](I) Linux內(nèi)核啟動并初始化,在內(nèi)核初始化完成時(shí)啟動init進(jìn)程。
[0043](2) init進(jìn)程打開/dev/ttyl (即宿主機(jī)tty設(shè)備),并將其置為圖形模式。
[0044](3) init 進(jìn)程啟動 SystemServer 服務(wù),SystemServer 服務(wù)又啟動SurfaceFlinger。SurfaceFlinger占據(jù)系統(tǒng)當(dāng)前在前臺運(yùn)行的tty設(shè)備來輸出內(nèi)容。因而,SurfaceFlinger在當(dāng)前在前臺運(yùn)行的tty設(shè)備中打開/dev/graphics/fbO,并創(chuàng)建雙緩存,并將顯示內(nèi)容交替刷入/dev/graphics/fbO中。
[0045](4) SystemServer繼續(xù)啟動Android系統(tǒng)的其他相關(guān)服務(wù),直至Android系統(tǒng)初始化完成。
[0046]至此,宿主機(jī)Android系統(tǒng)的啟動完成。
[0047](5)在宿主機(jī)Android系統(tǒng)啟動結(jié)束后,虛擬機(jī)的init進(jìn)程開始在新的NameSpace中啟動。
[0048](6)虛擬機(jī)init進(jìn)程不打開新的tty設(shè)備,直接啟動SystemServer服務(wù),SystemServer服務(wù)啟動SurfaceFlinger。SurfaceFlinger向操作系統(tǒng)查詢空閑的tty設(shè)備,并切換到該tty設(shè)備,記該tty設(shè)備為ttyX。
[0049](7)切換完成后,SurfaceFlinger將ttyX置為圖形模式,后續(xù)過程和宿主機(jī)相同,最終宿主機(jī)和虛擬機(jī)的圖形管理服務(wù)各自占據(jù)一個(gè)tty設(shè)備。
[0050]其中關(guān)鍵步驟為步驟(2)和(3)。/dev/graphics/fbO是 Linux 中 Framebuffer 設(shè)備的圖形設(shè)備文件,它有一個(gè)特性是在不同的tty設(shè)備之下打開該圖形設(shè)備文件所寫入的內(nèi)容不會相互影響。但在Android的代碼中SurfaceFlinger默認(rèn)都是從/dev/ttyl啟動圖形模式的。因此本發(fā)明對宿主機(jī)和虛擬機(jī)的SurfaceFlinger的源代碼都進(jìn)行了修改,使得宿主機(jī)和虛擬機(jī)在啟動時(shí)不從當(dāng)前在前臺運(yùn)行的tty設(shè)備中啟動圖形模式,而是查找ー個(gè)空閑的tty設(shè)備并啟動圖形模式,因而避免對相同的tty設(shè)備進(jìn)行訪問而造成沖突。
[0051]通過預(yù)先修改宿主機(jī)和虛擬機(jī)內(nèi)Android系統(tǒng)中SurfaceFlinger中的源代碼,使得宿主機(jī)中Android系統(tǒng)和虛擬機(jī)中的各Android系統(tǒng)的圖形管理服務(wù)各自獨(dú)占ー個(gè)tty設(shè)備。
[0052]SurfaceFlinger 的源代碼位于 Android 系統(tǒng)的 frameworks/native/ services/surfacef linger 目錄下。通過對 SurfaceFlinger 源代碼中 DisplayDevice.cpp 的修改,讓各個(gè)SurfaceFlinger占據(jù)ー個(gè)不同的tty設(shè)備進(jìn)行顯示。
[0053]具體的改動有: [0054](I)設(shè)i十一個(gè)新的類TerminalManager,該類要繼承Android系統(tǒng)的基類Thread,該新類用于:
[0055]向Android系統(tǒng)查詢空閑的tty設(shè)備并切換到該tty設(shè)備;切換完成后將新tty設(shè)備設(shè)置成圖形模式;將新tty設(shè)備的切換操作方式設(shè)置為“由進(jìn)程管理”,并增加獲取屏幕信號和釋放屏幕信號。
[0056]實(shí)現(xiàn)操作系統(tǒng)獲取屏幕響應(yīng)信號和釋放屏幕響應(yīng)信號的處理函數(shù)。通過調(diào)用SurfaceFlinger的screenAcquired函數(shù)和screenReleased即可實(shí)現(xiàn)這兩個(gè)信號的響應(yīng)函數(shù)。
[0057](2)將TerminalManager類的對象mTermManager作為成員變量添加到DisplayDevice 類中,在 DisplayDevice 的構(gòu)造開始時(shí)將 mTermManager 構(gòu)造好。
[0058]在向顯示器輸出時(shí),由進(jìn)程管理各個(gè)tty設(shè)備,在不同Android系統(tǒng)的圖形管理服務(wù)所占據(jù)的tty設(shè)備之間切換,通過用戶輸入信號,將對應(yīng)的tty設(shè)備切換為當(dāng)前在前臺運(yùn)行的tty設(shè)備。
[0059]圖3展示了 Android系統(tǒng)輸入部分的架構(gòu)?,F(xiàn)根據(jù)圖3具體說明共享輸入設(shè)備的方法:
[0060]Linux輸入事件是通過讀取輸入設(shè)備文件來獲得的,一般情況下,這些設(shè)備文件都位于/dev/input目錄下。用戶通過觸摸屏、鍵盤、鼠標(biāo)等輸入設(shè)備向輸入設(shè)備文件中寫入輸入事件,由EventHub.cpp從輸入設(shè)備文件讀取用戶的輸入事件;輸入事件以隊(duì)列形式輸入到WindowManagerService中,由WindowManagerService對輸入事件進(jìn)行管理,并最終發(fā)送至JAVA應(yīng)用程序。在本發(fā)明當(dāng)前實(shí)施例中,容器中運(yùn)行的Android虛擬機(jī)和宿主機(jī)中擁有相同的設(shè)備文件,也就是說,相同的外部輸入事件能夠同時(shí)轉(zhuǎn)發(fā)給宿主機(jī)和虛擬機(jī)。通過修改Android系統(tǒng)中輸入事件處理部分的源代碼,讓其將不屬于自己終端的輸入事件丟棄,這樣在不同的終端中,輸入事件就能轉(zhuǎn)發(fā)給不同的Android系統(tǒng)運(yùn)行實(shí)體。
[0061]Android系統(tǒng)的輸入服務(wù)是WindowManagerService。該服務(wù)代碼的實(shí)現(xiàn)分java和c++兩層,只需修改c++層的代碼,將不必要的事件屏蔽即可。
[0062]WindowManagerService 的 c++ 層代碼實(shí)現(xiàn)在 frame/base/service/input 這一目錄中,該目錄下的EventHub.cpp負(fù)責(zé)讀取/dev/input下的設(shè)備文件來獲取用戶輸入,只需修改該文件即可。[0063]具體地,類EventHub (即EventHub.cpp)下的成員函數(shù)getEvents負(fù)責(zé)讀取用戶輸入。在該成員函數(shù)中增加兩部分代碼邏輯:
[0064]每次獲取事件時(shí)獲取當(dāng)前SurfaceFlinger所在的tty設(shè)備。
[0065]判斷當(dāng)前所在的tty設(shè)備是不是對應(yīng)SurfaceFlinger被激活的tty設(shè)備:如果不是,則表明該輸入事件不是發(fā)送給自己的,對消息不作處理;否則表明自己當(dāng)前正是處于前臺占據(jù)顯示屏幕的tty設(shè)備,接受消息并進(jìn)行處理。
【權(quán)利要求】
1.ー種基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,所述多Android系統(tǒng)運(yùn)行于單Linux內(nèi)核環(huán)境中,所述多Android系統(tǒng)的其中ー個(gè)運(yùn)行于宿主機(jī)中,其余運(yùn)行在虛擬機(jī)中,其特征在于,包括: 初始化虛擬機(jī)中的各Android系統(tǒng)中的圖形管理服務(wù),使得宿主機(jī)中Android系統(tǒng)和虛擬機(jī)中的各Android系統(tǒng)的圖形管理服務(wù)各自獨(dú)占ー個(gè)tty設(shè)備; 用戶通過輸入設(shè)備使內(nèi)核中產(chǎn)生輸入事件,內(nèi)核將該輸入事件轉(zhuǎn)發(fā)至各個(gè)Android系統(tǒng)中的輸入管理服務(wù),各Android系統(tǒng)接收到內(nèi)核傳來的輸入事件后,判斷當(dāng)前在前臺運(yùn)行的tty設(shè)備是否是自己占據(jù)的; 如果是,則接收并處理該輸入事件; 否則,則屏蔽該輸入事件。
2.如權(quán)利要求1所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在于,圖形管理服務(wù)通過以下新增的代碼來各自獨(dú)占ー個(gè)tty設(shè)備,其中新增的代碼是預(yù)先設(shè)定的,代碼增加方式如下: 51,在圖形管理服務(wù)的DisplayDevice類中增加一個(gè)新類TerminalManager,TerminalManager 繼承 Android 系統(tǒng)的基類 Thread ; 52,將TerminalManager 的對象 mTermManager 作為成員變量添加到 DisplayDevice 類中。
3.如權(quán)利要求2所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在于,所述新類TerminalManager用于: 向操作系統(tǒng)查詢空閑的tty設(shè)備,并將圖形管理服務(wù)切換到該tty設(shè)備,切換完成后將新tty設(shè)備設(shè)置為圖形模式; 設(shè)置新tty設(shè)備的切換操作方式為由進(jìn)程管理,并通過用戶自定義的方式増加獲取屏幕和釋放屏幕兩個(gè)響應(yīng)信號; 以及向內(nèi)核中注冊所述兩個(gè)響應(yīng)信號的處理函數(shù)。
4.如權(quán)利要求1所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在于,其中宿主機(jī)和虛擬機(jī)運(yùn)行在各自的命名空間內(nèi),并且由Cgroups組件限制虛擬機(jī)能夠訪問的資源。
5.如權(quán)利要求4所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在于,宿主機(jī)和虛擬機(jī)中對應(yīng)目錄下的tty設(shè)備文件都分配相同的主設(shè)備號和次設(shè)備號。
6.如權(quán)利要求1所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在于,各Android系統(tǒng)通過輸入管理服務(wù)中的代碼邏輯來判斷當(dāng)前在前臺運(yùn)行的tty設(shè)備是否是自己占據(jù)的,其中代碼邏輯是預(yù)先増加的。
7.如權(quán)利要求6所述基于單Linux內(nèi)核的多Android系統(tǒng)共享輸入顯示設(shè)備的方法,其特征在干,預(yù)先增加的代碼邏輯在各Android系統(tǒng)中輸入管理服務(wù)中的EventHub類下的成員函數(shù)getEvents中,代碼邏輯分為兩部分: 輸入管理服務(wù)每次從輸入設(shè)備文件中讀取輸入事件時(shí),取得當(dāng)前在前臺運(yùn)行的tty設(shè)備的編號; 并通過所取得的編號判斷在前臺運(yùn)行的tty設(shè)備是不是對應(yīng)SurfaceFlinger所占據(jù)的tty 設(shè)備,如果不是則表明該輸入事件不是發(fā)送給自己的,則對消息不作處理;否則接受消息并進(jìn)行處理。
【文檔編號】G06F21/53GK103593185SQ201310537870
【公開日】2014年2月19日 申請日期:2013年11月4日 優(yōu)先權(quán)日:2013年11月4日
【發(fā)明者】王總輝, 孫偉杰, 徐磊, 李川, 李國璽 申請人:浙江大學(xué)