J2ME Polish 是一個強大的框架,專為解決 J2ME 應用在眾多手機裝置上的相容性與部署難題而生。它提供了預處理指令、Ant 建構整合與裝置資料庫,讓開發者能從單一原始碼產出針對不同螢幕尺寸、按鍵佈局、API 支援度的最佳化 JAR 檔。本文將以實戰步驟帶你在 Eclipse 環境下快速上手 Polish,並解析核心設定檔與預處理語法。
C:\J2ME-Polish),無需執行安裝程式。build.xml 複製到你的專案根目錄。build.xml → Run As → Ant Build,即可觸發自動化建構流程。build.xml 深度解析以下節錄關鍵區塊並加註說明:
<project name="MyGame" default="J2MEpolish">
<!-- 1. 關鍵路徑屬性 -->
<property name="wtk.home" value="C:\WTK22"/>
<property name="polish.home" value="C:\J2ME-Polish"/>
<!-- 2. 定義 Polish Ant Task -->
<taskdef name="J2MEpolish"
classname="de.enough.polish.ant.PolishTask"
classpath="${polish.home}/import/enough-J2MEpolish-build.jar:
${polish.home}/import/jdom.jar:
${polish.home}/import/proguard.jar:
${polish.home}/yguard-lib.jar:
${wtk.home}/wtklib/kenv.zip"/>
<target name="init">
<property name="test" value="false"/>
<property name="dir.work" value="build"/>
</target>
<target name="clean" description="清除建構輸出">
<delete dir="build"/>
<delete dir="dist"/>
</target>
<!-- 3. 主建構目標 -->
<target name="J2MEpolish" depends="init" description="J2ME 建構控制器">
<J2MEpolish>
<!-- 3.1 應用程式基本資訊 (對應 JAD 屬性) -->
<info license="GPL"
name="驅魔Q傳"
version="1.0"
description="單機版;諾基亞_N${polish.name};動作類"
vendorName="創藝和弦"
icon="/icon.png"
jarName="ExorcismSWord_NOK_N${polish.name}.jar"/>
<!-- 3.2 裝置需求:只為 Nokia 7610 建構 -->
<deviceRequirements unless="test">
<or>
<requirement name="Identifier" value="Nokia/7610"/>
</or>
</deviceRequirements>
<!-- 3.3 建構參數微調 -->
<build symbols=""
fullscreen="yes"
usePolishGui="false"
workDir="${dir.work}">
<midlet class="GhostMidlet" name="驅魔Q傳"/>
<variables includeAntProperties="true">
<variable name="update-url" value="https://www.enough.de/update"/>
<variable name="title" value="cc"/>
</variables>
<!-- 3.4 資源檔依裝置差異化打包 -->
<resources dir="res" excludes="">
<fileset dir="res/" if="polish.Identifier == Nokia/7610"/>
</resources>
<!-- 3.5 混淆與 JAD 微調 -->
<obfuscator name="ProGuard" useDefaultPackage="true" unless="test"/>
<jad>
<attribute name="MicroEdition-Configuration" value="CLDC-1.0"/>
<attribute name="MicroEdition-Profile" value="MIDP-1.0"/>
<attribute name="Media-Price" value="單次下載8元"/>
</jad>
</build>
</J2MEpolish>
</target>
</project>
wtk.home、polish.home 必須指向實際安裝路徑,路徑錯誤是建構失敗主因之一。deviceRequirements 區塊決定輸出哪些裝置的 JAR;善用 groups.xml、devices.xml 可批量管理。resources 區塊搭配 if 條件,可實現「同一專案、不同裝置載入不同圖片/資料」的精準打包。Polish 在原始碼中支援 //#if、//#elif、//#endif 等指令,編譯期即可依裝置屬性裁剪程式碼:
//#if (polish.ScreenWidth == 240)
byte offsetX = 20;
int titleNameX = 25 + offsetX;
int titleNameY = 43 + 20;
//#elif (polish.ScreenHeight == 220)
int titleNameX = 25;
int titleNameY = 43;
//#endif
//#if (polish.Vendor == Sony-Ericsson) || (polish.Vendor == Samsung) || (polish.Vendor == Nokia)
final static public int isLeftKey = -6;
final static public int isRightKey = -7;
//#elif (polish.Vendor == Motorola)
//# final static public int isLeftKey = -21;
//# final static public int isRightKey = -22;
//#endif
這樣寫法讓單一代碼庫即可應付 Nokia、Sony Ericsson、Motorola 等主流廠商的按鍵差異,免去維護多版本原始碼的痛苦。
| 現象 | 可能原因 | 對策 |
|---|---|---|
| JDK 版本錯誤 | Polish 舊版相容 JDK 1.4.2,JDK 1.5+ 可能報錯 | 改用 JDK 1.4.2 或升級 Polish 版本 |
| 路徑屬性錯誤 | wtk.home、polish.home、midlet 類名、資源目錄不存在 | 逐一核對 build.xml 中的路徑與類名 |
| 預處理語法錯誤 | 控制台會標示行號 | 檢查 //#if 區塊是否正確閉合 |
| 混淆器找不到庫 | ProGuard / yGuard 路徑遺漏 | 補齊 classpath 中的混淆器 JAR |
掌握 J2ME Polish 的 Ant 整合與預處理機制,即可將「一碼多裝置」落地。建議先從單一裝置建構成功起步,再逐步擴展 deviceRequirements 與差異化資源,逐步建立自動化、可維護的多裝置建構管線。