J2ME開發中的構建管理

heixiongguai發表於2009-12-03

在一個J2ME專案中幹了半年的CM (Configuration Management)/BM (Build Management),學習到了很多普通開發人員較少機會接觸, 但是對專案本身又十分重要的知識,寫出來與大家分享。

前言

手機應用軟體的開發越來越流行,其中又以J2ME開發為甚。放眼當前 各品牌手機,大多數都支援J2ME,而Java中的“一次編寫,到處執行” 的概念也極大的吸引了開發者。但是,手機開發平臺與PC比仍然有很大 的差距,J2ME的開放性也造成了各個手機J2ME程式的不相容性,各大 廠商都極力的推自己的特性開發包,而不注重與其他手機相容。因此, 我們在開發J2ME程式的時候,不但要注意程式本身的開發,更要注意 為不同品牌、型號的手機進行特定構建,特別是開發人員人數在10-20的 開發團隊中。

1. 關於JDK/WTK的選擇

JDK屬於基礎設施,選擇的版本越新越好。通常,高版本的JDK可以設定 按照低版本的語法進行編譯,可以指定生成低版本的class檔案格式。

WTK也是同樣的道理,高版本的通常具有較好的相容性,這裡給一個提示, 如果你需要將你的程式再多種品牌的手機上執行,你可以同時安裝特定手機 品牌放出的J2ME WTK,通過在這類特定的WTK上進行測試,可以較早於真 機發現問題。在J2ME的開發過程中,JSR包的選擇十分重要,當使用某些 特定JSR時,一定要調研清楚,所需要支援的手機中是否都支援該JSR包。

2. 編譯指令碼的編寫

如同開發C/C++程式一樣編譯的時候需要寫Makefile,開發J2ME程式的 時候也需要有類似的指令碼來完成整個編譯和構建的過程,這裡面有一些 選擇,簡單的構建過程,Windows平臺上可以考慮編寫bat指令碼,基本 能夠滿足需求。對於較為負責的構建過程,推薦選擇Ant。Ant是一個 用於簡單或複雜Java工程的自動化構建、部署工具,它對於那些具有 分散式開發團隊或者相信通過頻繁的構建來進行不間斷整合的公司尤 其有用。在J2ME開發上,同樣可用。同時Ant有豐富的外掛,幫助完成 Ant本身無法完成的功能,對於特定的需求,構建管理者可以自己編寫 外掛,整合到Ant中。

用Ant來構建應用通常是編寫一個build.xml檔案,將該檔案傳給Ant, Ant根據build.xml檔案中的指示進行編譯和構建,在使用Eclipse+EclipseMe 開發J2ME應用時,可以從Eclipse匯出build.xml,不過還是推薦大家 自己編寫build.xml檔案。編寫build.xml時,也建議進行良好的設計, 越是複雜的構建過程,對build.xml要求也越高。

3. Antenna

Antenna是Ant的擴充套件包,它是專用來構建、編譯、打包、部署J2ME 應用的輔助工具。

Antenna中非常實用的工具就是WtkPreprocess,它給Java開發新增 了類似C/C++中的巨集定義和程式碼預處理的功能。Antenna支援的巨集定義 包括:

  • #ifdef
  • #ifndef
  • #elifdef
  • #elifndef
  • #if
  • #elif
  • #else
  • #endif
  • #condition
  • #debug
  • #mdebug
  • #enddebug
  • #define
  • #undefine
  • #expand

可以從 http://antenna.sourceforge.net/wtkpreprocess.php 獲得 詳細的說明。

使用Antenna的過程中,會有一些缺陷。例如,在開發過程中,我們 通過定義巨集來代表某個功能,對於不同的手機,當我們需要支援 該功能時,在編譯的過程中,開啟這個巨集即可,反之則關閉這個巨集。 如果該功能只與程式碼有關係,情況就十分簡單,Antenna的WtkPreprocess 可以完成我們需要的功能。但是如果該功能同時與資源有關係,當 我們選擇不支援該功能時,我們不但想在編譯的過程中,通過預處理, 去掉相關的程式碼,也希望該功能相關的資源也不被放入JAR包中, 而WtkPreprocess除了處理原始碼,其他都無能為力。因此在構建指令碼 的編寫過程中,需要特別注意這類問題。

4. Proguard

ProGuard是一款免費的Java類檔案壓縮器、優化器和混淆器。 它能發現並刪除無用類、欄位(field)、方法和屬性值(attribute)。 它也能優化位元組碼並刪除無用的指令。最後,它使用簡單無意義的 名字來重新命名你的類名、欄位名和方法名。經過以上操作的jar檔案 會變得更小,並很難進行逆向工程。

在J2ME開發中,通常都會使用到該工具,並且該工具是開源的, 很容易獲取。

5. Preverify

Preverify是WTK帶的一個驗證class檔案的工具,通過了Preverify的 class檔案,在手機上執行前僅需要做一些二次驗證的工作。

6. Size Control

編寫J2ME程式的時候,JAR包的大小是個大問題,手機上的儲存空間 和程式執行空間都十分珍貴,因此我們需要盡最大的能力減小 JAR包 的大小。

6.1 kjar/kzip

在製作JAR包時,有很多方法。JDK本身提供了jar命令,可以製作JAR包, JAR包其實可以理解為標準的ZIP包。

此處,我們推薦使用一個稱為kjar的工具,可以從http://supremej2me.bambalam.se/guides/optimization-tools/kjar/ 下載到,他是通過改寫壓縮演算法,使製作的JAR包能比普通JAR包減小10% 左右的大小。同時,由於kjar只能執行於Windows平臺,並且通常被病毒 防火牆誤認為病毒,用起來並不方便,因此你可以從http://advsys.net/ken/utils.htm 下載kzip,包括Windows和Linux版本,能實現同樣的功能。

6.2 BamFS

BamFS是另一個減少JAR包大小的工具,可以從http://supremej2me.bambalam.se/guides/optimization-tools/bamfs/ 下載。該工具可以將所有資原始檔,包括圖片、文字等,打成一個大 的二進位制檔案,並且提供了一個java類,方便開發人員從這個大的二 進位制檔案中讀取所有資源。通過減少JAR包中檔案的數目(或者資料夾 的層次),同樣也可以減少JAR包的大小。

6.3 mbooster

mbooster是一個很強的工具,但同時,也是個收費的工具,開發者 可以向該公司申請trial的license,網址是 http://www.innaworks.com/mBooster.html , mbooster可以減小JAR包的大小,同時也能提高程式的執行速度, 它可以優化class檔案,PNG檔案,普通情況小可以減小30-40%左右的 大小。

7. 自動構建工具

選擇一個自動構建的工具,會極大的減少構建管理者的工作量, 在這裡推薦 CruiseControl ,該工具被廣泛的用於Java專案和 極限開發之中。CruiseControl內建支援各類的版本管理工具, 支援Ant、Maven等多種構建工具,支援定時構建,支援多種釋出 方式。

構建管理者所需要做的事情就是,將自己製作的構建環境放入 CruiseControl之中,對其進行適當的配置,接下來的事情就十分 簡單了,每次需要構建時,只需要登陸到CruiseControl提供的 Web介面,滑鼠點選某連結來trigger構建,後臺會自動完成構建、 釋出,併發郵件通知相關人員,一旦編譯出錯,也會以郵件的 方式通知大家。

8. 需要遵守的一些原則

1. 整個Build Environment需要有良好的結構,可以參考一些開源 專案的結構。為目標構建人員(例如開發人員、測試人員等) 提供簡單的介面,即通過簡單的設定,就能構建出想要得東西。 對於提供的介面,一定要有詳細的文件描述。

2. 要求開發人員儘量使用標準的構建環境進行構建。J2ME的開發, 通常都會在Eclipse/NetBeans裡面完成,但一定要求開發人員 在提交程式碼到版本控制系統中之前,至少需要使用標準構建環境 構建一次JAR包,並驗證。這樣可以幫助儘早發現問題,因為IDE 與自訂製的構建環境總是存在差別的。

3. 建議將所有用到的第三方庫/程式碼/程式都放入Build Environment中, 而整個Build Environment是應該放入版本控制系統中的。對於 JDK/WTK/Ant等基礎設施工具,可以要求開發人員自己安裝,並 設定好環境變數。可以編寫適當的指令碼,對環境以及版本進行判斷。 每次構建之前,先判斷,若不滿足,則不予構建。

9. 結束語

J2ME開發看似簡單,裡面還是有很多東西需要注意的,特別是面對 眾多品牌手機的情況下,希望我的經驗也能對你有所幫助。

Enjoy your trip!

相關文章