1.引言?
??? 無線Java技術是在移動通信領域內的J2ME技術,最近兩年內迅速發展,截止到2003年2月,已經有21個生產廠家推出了100多種支持JAVA的手持設備。今年3月,CDMA領導廠商高通公司宣布,將在其CDMA的芯片中提供對J2ME的支持,其實現主要基于MIDP 2.0和CLDC1.0.4。今年6月,Sun和Intel達成協議,將聯合開發支持英特爾XScale處理器的Java應用程序" title="應用程序">應用程序運行環境。在硬件中集成Java,將進一步促進Java在市場中的普及。根據ARC Group2002年六月的《無線JAVA報告》,“到 2007年, 幾乎所有的手持設備都將提供對JAVA的支持”。?
??? 目前無線Java設備主要以手機為主,當前的實現主要基于CLDC1.0和MIDP1.0規范。MIDP2.0規范在去年11月推出,是未來無線Java技術的核心。今年6月,Sun與世界知名的手機廠商諾基亞、摩托羅拉、西門子和索尼—愛立信共同合作,開發適用于MIDP2.0技術標準的J2ME技術。預計合作的時間將為兩個月,相信支持MIDP2.0的設備不久將推向市場。MIDP2.0作為下一代移動設備開發規范,增強了對音頻、游戲、安全和Push注冊的支持,并且對用戶界面、網絡連接" title="網絡連接">網絡連接的功能做了增強,同時將OTA應用程序下載包括到規范中來。本文對MIDP2.0的新增特性做了較詳細的介紹。?
2.MIDP2.0的安全框架?
??? MIDP運行在Java虛擬機之上,這使它可以解決一部分安全問題。然而對于移動信息設備,還有特定的安全問題,比如程序在用戶不知道的情況下連接網絡,會耗費用戶的通信費用,還有程序可能會修改用戶的本地資料,或把用戶資料通過無線網絡泄漏出去。為了解決這種情況MIDP2.0增加了安全框架。?
1)?有安全隱患的操作 ?
??? 對于有安全隱患的操作,MIDP2.0按功能把它們分為以下幾組:?
??? 撥打電話:向外撥打電話的操作。?
??? 網絡訪問:與網絡發生連接、訪問網絡數據的操作(例如 GSM、 GPRS等網絡訪問)。?
??? 收發消息:接受和發送消息的操作。(如短信服務)?
??? 程序自動激活:導致MIDlet suite自動激活的操作(如push技術、定時MIDlet等)。?
??? 本地連接:訪問本地端口的操作(如COMM端口、紅外口、藍牙等)。?
??? 多媒體紀錄:捕獲靜止圖像、紀錄視頻或音頻的操作。?
??? 讀取用戶數據:讀取用戶電話簿或其他文件中數據的操作。?
??? 修改用戶數據:增加、刪除或修改用戶的電話簿和其他文件的操作。?
?
?
??? 當這些操作執行時,應由用戶指定是否允許這些操作運行。比如用戶通過http連接訪問http://wireless.java.sun.com 網站時,在J2ME Wireless Toolkit2.0模擬器中運行時會出現左圖所示的畫面,提示用戶該程序即將連接網站,詢問用戶是否進行該操作,如果用戶同意,則繼續進行連接網站的操作,如果用戶不同意,則拋出安全異常,指出該程序不具備http網絡訪問的權利.如右圖所示。
2)?權限許可證(Permission)。
??? 對于每一個有安全隱患的操作,都應有一個與之對應的權限許可證,當程序要進行這些操作時,AMS(應用程序管理軟件)應根據許可證的類型做出反應。
??? 許可證主要分為以下兩類:allowed 許可證 和 user 許可證。
??? Allowed表示一直允許該操作。
??? User需征求用戶的許可,依據用戶決定的持續時間分為三類。
??? oneshot,用戶決定只對本次有效,下次需要該功能許可時,繼續提問用戶。
??? session,用戶決定在此次程序運行期間內有效,程序重新啟動后繼續提問用戶。
??? blanket,用戶的決定一直有效,直到該程序被卸載。
??? 當某項操作沒有任何許可證時,必須拒絕該操作。
3)?保護域(Protection Domain)。
??? 程序中使用有安全隱患的操作時,應根據該操作的許可證做出反應,而一個操作有什么樣的許可證,與程序的來源有很大關系,來自可信賴的開發者的程序自然會獲得較多得許可證。這就涉及到保護域的問題。
??? 保護域實際上是一些許可證的集合,比如一個只允許http連接的保護域:
allow: javax.microedition.io.Connector.http
??? 在這個保護域中,所有其他的有安全隱患的操作都會被拒絕。
??? 下面是一個更為靈活的保護域,允許http連接,對于https和socket連接要征得用戶同意,拒絕其他有安全隱患的操作
allow: javax.microedition.io.Connector.http
blanket: javax.microedition.io.Connector.https
blanket: javax.microedition.io.Connector.socket
??? 每個程序都會進入一個保護域,同一個保護域中的所有程序都有相同的安全策略。
對于保護域的實現問題,比如要定義多少保護域,每個保護域的內容如何,MIDP2.0規范并沒有做強制性的規定,只是給了一個建議,具體如何實現由各個廠商自行決定。一個應用程序能夠進入什么樣的保護域,要看他來自何處,一個不明來歷的程序肯定不會獲得較多的權限。MIDP2.0安全框架提供了代碼簽名機制,開發者可以從權威認證機構獲得密鑰,然后對程序進行數字簽名,設備下載之后可以對該簽名進行驗證,以確定該程序確實來自它所聲稱的地方,通過驗證的程序會進入一些受信任的保護域。
3.MIDP2.0音頻開發技術
??? MIDP規范的目標是使開發出來的程序能在廣泛的移動信息設備上" title="設備上">設備上運行,但MIDP1.0規范并不支持音頻,如果開發有聲音功能的程序,則必須使用設備廠商自己提供的API,這使得開發出來的程序失去了廣泛的可移植性。MIDP2.0規范增加了對聲音的支持,這使以后開發音頻程序有了統一的規范。
??? 移動信息設備涉及的范圍很廣,這些設備的多" title="的多">的多媒體能力也有很大的差別,有些設備只能播放簡單的曲調,有些設備卻有很強的音頻和視頻渲染能力。由諾基亞領導的移動媒體API(MMAPI)專家組致力于為移動設備制定一組統一的多媒體API,以便開發出的多媒體程序能在各種設備上運行。MMAPI專家組的工作有以下兩個成果:
??制定出MMAPI規范(JSR—135),該規范包含了對音頻和視頻的支持,能夠完全實現該規范的設備是一些高性能的設備,有較強的多媒體功能。諾基亞在2003年3月推出的3300手機就增加了對MMAPI的支持。
??制定出MIDP2.0媒體API,鑒于MIDP規范面向大多數設備,MIDP2.0的媒體API實現了MMAPI的一個子集,只支持音頻功能,并與MMAPI保持兼容。
??? MIDP2.0媒體API與MMAPI有相同的體系結構。其中主要涉及三個基本概念:
??Manager
??Player
??Control
??? Manager是獲得系統音頻功能的入口,它只包含一些靜態方法,使用它來創建Player,查詢系統支持那些協議和媒體類型,Manager還提供了一個播放簡單曲調的方法。
??? Player負責播放媒體內容,它由Manager創建,可以管理自己的生命周期,控制播放進度,提供可用的Control。
??? Control是用于實現一個Player可能有的各種控制,如音量Control可以控制音量的大小。
??? 右圖說明了Manager 、Player 和Control之間的關系:Manager創建Player,Player提供Control,Control用來控制Player。
??? 下面以我們PC機上的多媒體系統為例說明這種關系。
??? Manager相當于PC機操作系統的一部分,用來管理各種播放軟件,而Player就相當于這些播放軟件,比如音頻播放器" title="播放器">播放器用來播放音頻,視頻播放器用來播放視頻,在這些播放器上有各種各樣的控制按鈕,這些按鈕與Control相當,用來控制播放器,比如音量按鈕控制播放器音量的大小。
??? 在PC機上,我們一般選擇一個播放器播放媒體文件,然后用播放器上的控制按鈕來控制播放過程。與之相對應,在移動設備上開發有音頻功能的程序時,首先用Manager創建一個Player,然后從Player中得到相應的Control,用Control對Player進行控制。
4.MIDP2.0的游戲開發技術
??? 對J2ME游戲開發的支持可能是開發者企盼已久的, MIDP2.0新增了一個游戲包javax.microedition.lcdui.game,該包由以下五個類組成:GameCanvas、Layer 、LayerManager、Sprite、TiledLayer。MIDP2.0提供的游戲API使得游戲本身可以更充分的利用設備自身的圖形處理功能。它的出現無疑大大簡化了J2ME游戲的開發工作,同時也使得開發者可以更多地控制程序的圖形處理性能。
1)?MIDP2.0的游戲運行機制
??? GameCanvas提供了基本的游戲運行機制,除了繼承其父類Canvas的特性,它還提供了特定于游戲的下列功能:
查詢鍵盤狀態:
??? 在MIDP1.0中,為了獲得用戶的鍵盤輸入,一般要使用系統的消息處理機制來處理鍵盤事件,但鍵盤事件的產生受系統線程調度的影響,因此不一定能反映用戶當前的按鍵狀態。GameCanvas提供了getKeyStates函數來查詢鍵盤狀態,該函數返回一個整數,這個整數的每一位代表一個健是否被按下,例如要查詢LEFT鍵是否被按下,可用如下語句:
?int keyState = getKeyStates();
????? ?if ((keyState & LEFT_KEY) != 0) {
????????? //do something
????? ?}
??? getKeyStates返回自上一次調用該函數以來有沒有鍵被按下,并且清除按鍵狀態,因此如果連續兩次調用該函數,第二次會很好地反映當前鍵盤的狀態。
??? 另外,為了提高性能,GameCanvas還可以阻止鍵盤事件的產生。用戶玩游戲時,經常會頻繁的按鍵,如果不阻止鍵盤事件的產生,系統會花費很多時間來發送鍵盤事件。
??? GameCanvas構造函數為:GameCanvas(boolean suppressKeyEvents)
其中參數suppressKeyEvents表示是否要阻止鍵盤事件的產生,當該參數為true時,keyPressed, keyRepeated 和 keyReleased 事件將會受到阻止,這時可以通過查詢鍵盤狀態來確定用戶的按健。
要注意的是,只有當GameCanvas正處于顯示狀態時,鍵盤事件才會受到阻止,并且受阻止的鍵僅限于與游戲有關的鍵,如UP、DOWN、FIRE等。其它鍵所產生的事件不會受到阻止。
??? 圖像的繪制與顯示:
??? 對每一個GameCanvas對象,系統都會為它開辟一個離屏圖像緩沖區,要顯示的圖像先在該緩沖區內繪制,繪制完成后再復制到實際顯示屏幕。這樣做既提高效率,又可以避免頻繁在實際屏幕繪圖產生的閃爍現象。
??? 實際操作時,先用getGraphics返回一個操作離屏圖像緩沖區的Graphics對象,使用該對象可緩沖區進行繪制。對緩沖區繪制完畢后使用flushGraphics函數將緩沖區復制到實際屏幕。
??? 有了上述功能,GameCanvas為游戲開發者提供了一個重要的機制:把整個游戲邏輯(包括圖像顯示和處理用戶輸入)封裝在一個單線程的單循環內,這解決了在MIDP1.0中依賴系統的輸入和顯示線程來控制游戲問題,有利于提高游戲的穩定性和性能。
??? 典型的游戲循環如下:
Graphics g = getGraphics();//獲得操作圖像緩沖區的Graphics對象
while (true) {
??// 更新游戲狀態?
?int keyState = getKeyStates();//查詢鍵盤狀態
? // 處理用戶輸入
? // 繪制圖像緩沖區
? flushGraphics();//將緩沖區復制到實際屏幕
? //延時.
}
2)?創建游戲場景。
??? GameCanvas提供了基本的游戲運行機制,游戲包的其它類方便了創建游戲場景。
??? 在一個游戲場景中,可能有各種角色和背景,MIDP2.0把每一個這樣的角色或背景作為一個層(Layer)的概念,抽象類Layer定義了層的基本屬性,如位置、大小、是否可見等。有兩個類繼承了Layer,分別是Sprite和TiledLayer。Sprite用來表示游戲中的動畫角色,TiledLayer用于創建大的背景。當游戲中的Layer很多時,有必要對這些Layer進行統一管理。LayerManager類可以集中管理這些Layer。
5.MIDP2.0其它新增特性
??? 除了上面所述之外,MIDP2.0還在以下方面做了增強:
1)?Push注冊
??? 用戶在Internet上瀏覽信息時,一般使用c/s(客戶/服務器)架構,由客戶機發出請求,服務器做出相應的相應,這種方式稱為pull方式。與之相對應的是push方式,即服務器主動的向客戶機發出信息。push技術非常適合無線網絡的特點,無線網絡的帶寬比較低,無線傳輸的信息服務費也比較高,使用push使用戶不必花費大量時間進行搜索,既有利于提高網絡的利用效率,又可以減少用戶的通信費用。push技術在無線商業上也有很大的應用價值,例如服務器可以根據用戶的設定,將各種實時信息發送到用戶的手機上,這些實時信息可以包括各種新聞、生活信息、廣告等。
??? MIDP2.0增加了對push注冊的支持,push注冊機制可以使MIDlet自動運行。運行方式有兩種,一種基于定時技術,當到達特定時間時,程序就會運行;另一種基于網絡,當設備收到網絡推送的信息時,可以啟動程序運行。設備的AMS維護著已注冊的push列表,這些列表包括注冊的網絡連接和定時器以及與它們對應的MIDlet。當這些列表中的某個網絡連接到來或是到達某個定時時間,AMS將根據列表激活相應的MIDlet。
2)?OTA應用程序傳輸
??? 在PC機上開發者通常使用光盤發布軟件, 移動設備沒有軟驅、光驅等數據交換設備,它主要通過無線網絡進行數據傳輸,因此軟件的發布也通過無線網絡進行。網絡運營商提供無線數據服務,開發者將自己開發的軟件提交到服務器上,用戶連接到服務器把軟件下載到自己的設備上運行。為了規范這一過程,MIDP規范推出時同時推出了OTA (over-the-air??? provisioning,無線服務提供方式)規范,MIDP1.0時,OTA作為一個推薦的行為,MIDP2.0對OTA做了增強,并把它作為規范的一部分,以后支持MIDP2.0的設備必須支持OTA,使得軟件的發布有了統一的規范。
??? OTA使移動信息設備上應用軟件的下載、安裝和刪除能夠通過無線網絡自動進行,用戶在這個過程中只需做很少的干預。一個OTA系統通常由用戶設備、無線傳輸網絡和提供服務的Web服務器組成。
??? 服務器的功能通常包括內容發布和管理、訪問控制、程序安裝、收費管理。一方面服務器使第三方軟件開發者能將他們開發的軟件發布到服務器上,另一方面使終端用戶可以下載、安裝這些軟件,一旦軟件安裝成功,可以通過收費系統收取用戶的費用,并根據下載數量來支付開發者的費用。在整個過程中,都有安全管理,這既包括對用戶身份信息的認證,也包括對程序的鑒別,以確保該程序不用于非法目的。除了這些基本功能,有些服務器還為用戶提供個性化服務,比如根據用戶的設備特點和用戶的設定為用戶提供可用程序列表,確保這些程序都能在用戶的設備上運行,當某一程序有新版本推出時通知用戶等。
3)?網絡連接增強
??? 在MIDP1.0中,只包含了對HTTP網絡連接的支持,MIDP2.0增加了支持的連接類型,包括HTTPS、Socket、Datagram等。
4)?用戶界面增強
??? MIDP2.0對用戶界面做了較多的增強,更方便開發者使用,例如對Form的布局管理,以字節數組的形式直接操縱Image圖像等。
參考文獻:
1.?JSR-118 Mobile Information Device Profile 2.0(Final Release), http://jcp.org/aboutJava/communityprocess/final/jsr118/index.html,2002年11月
2.?Jonathan Knudsen,What's New in MIDP 2.0,? http://wireless.java.sun.com/midp/articles ,2002年11月
3.?Jonathan Knudsen,Understanding MIDP 2.0's Security Architecture,http://wireless.java.sun.com/midp/articles ,2003年2月
4.?Enrique Ortiz,Introduction to OTA Application Provisioning,http://wireless.java.sun.com/midp/articles ,2002年11月
5.?Enrique Ortiz,The MIDP 2.0 Push Registry,http://wireless.java.sun.com/midp/articles ,2003年1月
6.?Jonathan Knudsen,Mobile Media API Overview http://wireless.java.sun.com/midp/articles ,2002年6月