Java本來就是為了嵌入式系統(tǒng)而生
1990年12月,Sun內(nèi)部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一個(gè)叫做Green Team的小組。Green Team小組的主要目標(biāo),是要發(fā)展一種新架構(gòu),而這種架構(gòu)必須能夠在消費(fèi)性電子產(chǎn)品作業(yè)平臺(tái)上運(yùn)行,現(xiàn)在我們普遍認(rèn)識(shí)的PDA、手機(jī)或是信息家電(IA),都是屬于這種架構(gòu)的目標(biāo)平臺(tái)。接著,Green Team在1992年的9月3號(hào),發(fā)表了一款由Java 技術(shù)之父 James Gosling所領(lǐng)軍研發(fā),名叫Star Seven(*7)的機(jī)器,研發(fā)出一部交互式的掌上型家用娛樂裝置,可透過使用動(dòng)畫觸碰式屏幕的使用者接口來控制其它電子設(shè)備。
經(jīng)過了13年的時(shí)間,現(xiàn)在我們檢視J2ME的發(fā)展歷史,我們可以發(fā)現(xiàn),雖然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME這個(gè)名詞的出現(xiàn)。但是Java并非1999年開始才開始發(fā)展嵌入式系統(tǒng)上的應(yīng)用。其實(shí),Java本來就是為了嵌入式系統(tǒng)而發(fā)展的一種架構(gòu)。即使目前大家多半將Java的應(yīng)用聚焦于企業(yè)上的J2EE應(yīng)用。但是嚴(yán)格來說,J2ME才是Java真正“回歸本心”的領(lǐng)域。
半路殺出的Personal Java
Personal Java是正規(guī)Java版本的一個(gè)分支,其目的在于能夠讓PDA或高階手機(jī)執(zhí)行Java程序,目前在Windows Mobile或Symbian OS(僅限采用UIQ或Nokia Series 80的行動(dòng)電話)平臺(tái)上都可以開發(fā)Personal Java應(yīng)用程序。
雖然從Java 1.0發(fā)表之后,Java就被廣泛地使用在桌上型應(yīng)用程序以及Applet的開發(fā)上,但是,從Java 1.1開始,Java又回到了它一開始的老路-也就是嵌入式系統(tǒng)方面的應(yīng)用,在當(dāng)時(shí)Sun Microsystems發(fā)表了Embedded Java與Personal Java(也有人簡稱為PJava)這兩項(xiàng)規(guī)格。Personal Java的規(guī)格是從Java 1.1之中所分支出來,因此Personal Java的規(guī)格是根據(jù)Java 1.1的規(guī)格而制定的,但是并非Java 1.1的全部規(guī)格都包含進(jìn)來,所以Personal Java只能算是Java 1.1平臺(tái)的子集合。
Personal Java特別適合用在具有豐富圖形顯示能力的消費(fèi)性電子產(chǎn)品上面,于是我們可以發(fā)現(xiàn)Sun Microsystems網(wǎng)站上對(duì)于Personal Java的參考實(shí)作是建立在Windows Mobile產(chǎn)品(過去叫做Pocket PC)上頭的。
在1999年,一般PDA或手機(jī)的能力,離Personal Java所需要的硬件條件仍有很大的一段差距,因此Personal Java并不是一個(gè)很成功的產(chǎn)品。因此Sun Microsystems在此時(shí)將Java區(qū)分成J2SE、J2EE、J2ME這三塊,希望可以重新塑造整個(gè)架構(gòu),尤其是J2ME,希望Java可以在嵌入式系統(tǒng)的領(lǐng)域有所發(fā)展。
J2ME從何而來?
談到J2ME,大家就會(huì)聯(lián)想到KVM這個(gè)名詞, KVM的設(shè)計(jì)者Antero Taivalsaari,最早在Sun Microsystems參與Spotless Project,這個(gè)項(xiàng)目才是J2ME的最早起源。由于Antero Taivalsaari曾經(jīng)在世界知名電信設(shè)備制造商工作,所以他有了在手機(jī)上開發(fā)JVM的概念,后來得到公司支持,就有了各位所知的KVM(K Virtual Machine)。
最早應(yīng)用KVM的產(chǎn)品,就是一個(gè)可以在Palm OS上執(zhí)行的KJava。KJava并不算是一個(gè)正式產(chǎn)品,只能算是一個(gè)概念測試產(chǎn)品。開發(fā)人員會(huì)開發(fā)名為Spotlet的應(yīng)用程序,透過工具和KVM的輔助,應(yīng)用程序就可以在PDA上執(zhí)行。雖然KJava早已成為過去式,但是仍有電信廠商使用這個(gè)名詞,作為手機(jī)上Java平臺(tái)的名稱,不過,已經(jīng)不是真正的KJava了。有了KJava的發(fā)展經(jīng)驗(yàn),Sun著手設(shè)計(jì)J2ME的架構(gòu),讓J2ME可以應(yīng)付未來嵌入式系統(tǒng)的發(fā)展。
J2ME整體架構(gòu)
J2ME最基本的規(guī)范制定在JSR-68(Java規(guī)格編號(hào)第68號(hào)),在此規(guī)格里頭定義了J2ME的技術(shù)架構(gòu)。根據(jù)此規(guī)范,J2ME由三種類型的規(guī)范堆棧而成,分別是Configuration、Profile以及Optional Packages。這三種類型的規(guī)范定義由其它的規(guī)范所定義。
在最底層的Configuration規(guī)范,定義了硬件所必須具備的能力,比方說硬件至少具備多少ROM、RAM,CPU的頻率最少應(yīng)該是多少,連接網(wǎng)絡(luò)時(shí)頻寬至少要多快。Configuration規(guī)格之中定義了一組低階的API,這代表Java至少必須提供的低階功能,這組低階的API就是核心類別函數(shù)庫的子集合。
在Configuration之上的規(guī)范稱為Profile。Profile針對(duì)各種不同機(jī)器的特性定義了高階的API,這些高階的API通常都是與其它平臺(tái)不相關(guān)的擴(kuò)充類別函數(shù)庫。這些高階API決定了該種機(jī)器上Java程序的撰寫方法。比方說行動(dòng)通訊裝置(手機(jī)、PDA等)這類型裝置上Java程序的撰寫方式,以及能夠調(diào)用的API,都定義在MIDP(Mobile Information Device Profile)之中。
就算是同類型的裝置,有些功能也不一定具備(有些廠商的機(jī)器可能有,有些廠商的機(jī)器可能沒有,例如手機(jī)上的照相機(jī)、和弦鈴聲等),這些功能就定義在“廠商選擇性實(shí)現(xiàn)套件(Optional Package)”之中,比方說,有的廠商會(huì)提供簡單的數(shù)據(jù)庫管理系統(tǒng)(DBMS)在該裝置上,那么他們就會(huì)實(shí)現(xiàn)JDBC Optional Package。不提供數(shù)據(jù)庫管理系統(tǒng)的廠商就不需要實(shí)現(xiàn)JDBC Optional Package。所以稱作廠商選擇性實(shí)現(xiàn)套件。
所謂的廠商選擇性實(shí)現(xiàn)套件,意思是說,這是一組和其它規(guī)格(或API)沒有任何相依性的類別函數(shù)庫,如果廠商愿意提供這樣的功能給程序設(shè)計(jì)師(通常是因?yàn)橛布哂谐浞值哪芰梢酝瓿梢?guī)格之中所制定的功能),就會(huì)將這組類別函數(shù)庫實(shí)現(xiàn)出來,程序設(shè)計(jì)師也可以利用這些功能開發(fā)出功能更多的應(yīng)用程序。
MIDP工業(yè)標(biāo)準(zhǔn)
雖然J2ME架構(gòu)完整,但是目前的發(fā)展,除了Personal Profile之外,最大的應(yīng)用在于架構(gòu)在CLDC之上的MIDP。目前所有標(biāo)示可以支持Java的手機(jī),所支持的都是MIDP,幾乎所有的無線通訊廠商皆采用MIDP作為其開發(fā)程序的標(biāo)準(zhǔn)。
在MIDP 1.0的時(shí)代,由于規(guī)格上本身的功能不足,使得許多廠商不得不加入自己專屬的API,例如震動(dòng)、背光、聲音等擴(kuò)充功能(例如:Nokia UI API),以彌補(bǔ)MIDP平臺(tái)的不足。
到了MIDP 2.0,增加了許多眾所期盼的功能,但是,即使規(guī)格更清楚了,即使很多新功能都已經(jīng)由JCP制定成標(biāo)準(zhǔn)的Optional Packages,這些問題依然無解。市面上的MIDP平臺(tái)仍然處于混亂狀態(tài)。開發(fā)者必須在執(zhí)行時(shí)期偵測各種專屬API和Optional Package的存在,這會(huì)增加多余的程序代碼。平臺(tái)的混亂會(huì)造成在某個(gè)裝置上可以順利安裝及執(zhí)行,而到了其它裝置時(shí),有可能無法執(zhí)行,甚至有可能連安裝都有問題,所以開發(fā)者通常要開發(fā)好幾種版本的MIDP應(yīng)用程序供各種廠牌、各種型號(hào)的裝置使用。
為了解決上述問題,進(jìn)一步提高M(jìn)IDP應(yīng)用程序的可移植性,Sun Microsystems以MIDP 2.0規(guī)格為核心,設(shè)計(jì)了JTWI規(guī)格。未來的無線通訊平臺(tái),將不會(huì)只有符合MIDP 2.0規(guī)格,而是必須要符合JTWI規(guī)格。這將是J2ME軟件在可移植性上的一大突破。JTWI(Java Technology for Wireless Industry)是一個(gè)統(tǒng)合性的規(guī)格,其目的是為了確保MIDP軟件的可移植性。所以JTWI規(guī)格除了規(guī)范無線通訊平臺(tái)(特別是手機(jī))所必須支持的J2ME標(biāo)準(zhǔn)之外,也對(duì)既有規(guī)格中模糊不清的地方與以加強(qiáng)。所以新款的手機(jī)為了加強(qiáng)移植性,都會(huì)支持JTWI標(biāo)準(zhǔn)。JTWI只是一個(gè)統(tǒng)合性的規(guī)范,并沒有制定任何新功能,目的只是要統(tǒng)一當(dāng)前平臺(tái)混亂的現(xiàn)象,讓J2ME應(yīng)用程序更具可移植性。JTWI主要分成幾個(gè)部分:
1 .規(guī)定平臺(tái)必須支持的API。
2 .統(tǒng)一的應(yīng)用程序執(zhí)行環(huán)境。
3 .既有規(guī)格的理清與加強(qiáng)。
在規(guī)定平臺(tái)必須支持的API的部分,JTWI規(guī)定至少必須支持CLDC 1.0、MIDP 2.0以及WMA 1.1:
所以,只要廠商宣稱支持JTWI平臺(tái),那么代表一定支持CLDC 1.0、MIDP 2.0以及WMA 1.1規(guī)格之中的所有功能。另外,廠商可以根據(jù)裝置本身的能力,將CLDC 1.0提升成CLDC 1.1,可以加入MMAPI 1.1。因此實(shí)際上JTWI平臺(tái)會(huì)有一下幾種組合方式:
其中,CLDC 1.1 + MIDP 2.0 + WMA 1.1 + MMAPI 1.1是最完整、功能最強(qiáng)平臺(tái)。
在統(tǒng)一應(yīng)用程序執(zhí)行環(huán)境方面,過去讓J2ME應(yīng)用程序開發(fā)者最為頭大的問題有以下幾項(xiàng):
● 應(yīng)用程序的大小可以多大?
● 執(zhí)行時(shí)期的內(nèi)存有多少可以使用?
● 有多少內(nèi)存空間可以作為永久儲(chǔ)存之用?
由于規(guī)范中對(duì)于J2ME應(yīng)用程序本身的大小和執(zhí)行環(huán)境沒有很詳細(xì)地規(guī)范,使得每家廠商都有自己的規(guī)范,比方說Nokia限制應(yīng)用程序最大只能30 KB,Motorola則可以支持50 KB以上的應(yīng)用程序。這些規(guī)范都嚴(yán)重地困擾著開發(fā)人員。這些問題在JTWI之中都獲得改善。
JTWI定義了應(yīng)用程序的標(biāo)準(zhǔn)大小(Standard-size Application)。JTWI規(guī)定,可以執(zhí)行J2ME應(yīng)用程序的行動(dòng)通訊裝置,至少可以容許大小為64 KB以上的程序主體(JAR文件)、5 KB以上的應(yīng)用程序描述文件(JAD文件)、以及30 KB以上的永續(xù)儲(chǔ)存空間、執(zhí)行時(shí)期的內(nèi)存(Heap Memory)為256 KB。上述大小只是底線,廠商可以視裝置的實(shí)際能力支持更大的內(nèi)存空間。標(biāo)準(zhǔn)應(yīng)用程序大小(Standard-size Application)將成為一個(gè)計(jì)算用的單位,舉例來說,廠商會(huì)說這個(gè)裝置可以安裝20個(gè)標(biāo)準(zhǔn)應(yīng)用程序,開發(fā)者所撰寫的程序可以說這個(gè)程序需要占掉3個(gè)標(biāo)準(zhǔn)應(yīng)用程序的空間。
至于對(duì)既有規(guī)格的理清與加強(qiáng)的部分,我們將在往后章節(jié)一一說明。最重要的一點(diǎn)是,JTWI規(guī)定,該裝置所支持的任何媒體格式(例如圖片、聲音、影像等)都應(yīng)該能夠使用HTTP 1.1獲取,也就是說,存取這些媒體時(shí)所使用的URL都必須能夠接受http作為存取的通訊協(xié)議。