| 階段 | 工具 | 輸入 | 輸出 | 關鍵點 |
|---|---|---|---|---|
| 編譯 | javac | *.java | *.class (未混淆) | -bootclasspath 指定 midpapi.zip |
| 混淆 (可選) | ProGuard / RetroGuard | *.class | *.class (混淆) | 縮減體積 30-50%、保護邏輯 |
| 預審核 | preverify | 混淆後 *.class | 帶 StackMap *.class | 設備端驗證加速、省電 |
| 打包 | jar | 預審核 *.class + 資源 | MIDletSuite.jar | 含 META-INF/MANIFEST.MF |
| 描述文件 | 文本編輯器 | — | MIDletSuite.jad | OTA 必備、屬性外部化 |
| 部署安裝 | 數據線/紅外/藍牙/OTA | .jar + .jad | 設備上運行 | AMS 管理生命周期 |
javac -bootclasspath %WTK_HOME%\lib\midpapi.zip -d build\classes src\com\myapp\*.java
-bootclasspath 必須指向 WTK 的 midpapi.zip (含 CLDC/MIDP 標準庫),避免誤用 JSE 類庫-encoding UTF-8
# proguard.cfg
-injars build\classes
-outjars build\obfuscated
-libraryjars %WTK_HOME%\lib\midpapi.zip
-dontwarn
-keep public class * extends javax.microedition.midlet.MIDlet
-keepclassmembers class * {
public protected *;
}
-optimizationpasses 3
java -jar proguard.jar @proguard.cfg
preverify -classpath %WTK_HOME%\lib\midpapi.zip;build\obfuscated -d build\verified build\obfuscated
build\verified 含 StackMap 屬性的 class 文件preverify.exe
cd build\verified
jar cvfm ..\MyApp.jar ..\manifest.mf com\myapp\*.class res\*.png res\*.mid
manifest.mf 內容參見下節。
MIDlet-Name: MyApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: MyCompany
MIDlet-1: MyApp,/icon.png,com.myapp.MyApp
MIDlet-Jar-URL: https://download.mycompany.com/MyApp.jar
MIDlet-Jar-Size: 45678
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
MIDlet-Description: My Awesome J2ME App
MIDlet-Icon: /icon.png
MIDlet-Data-Size: 10240
SERVER_URL: https://api.mycompany.com/v1/
MIDlet-Jar-Size = JAR 文件實際字節數 (dir MyApp.jar 或 ls -l)MIDlet-Jar-URL OTA 必須為絕對 HTTP/HTTPS URL
Manifest-Version: 1.0
MIDlet-Name: MyApp
MIDlet-Version: 1.0.0
MIDlet-Vendor: MyCompany
MIDlet-1: MyApp,/icon.png,com.myapp.MyApp
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
MIDlet-Description: My Awesome J2ME App
MIDlet-Icon: /icon.png
MIDlet-Data-Size: 10240
Created-By: 1.6.0 (Sun Microsystems Inc.)
.jad 鏈接MIDlet-Install-Notify URL| 操作 | 觸發 | AMS 行為 | 數據處理 |
|---|---|---|---|
| 首次安裝 | 用戶確認 | 創建隔離存儲、註冊權限 | RMS 初始化空 |
| 更新 (版本號升高/相同/降低) | 用戶確認 | 替換類文件/資源 | 簽名一致/URL同源 → 保留 RMS;否則詢問用戶 |
| 刪除 | 用戶選擇 | 移除文件、註銷權限、刪除圖標 | RMS 默認刪除,可提示用戶保留 |
| 運行 | 用戶點擊圖標 | 實例化 MIDlet → Paused → startApp() → Active | 讀取 RMS、恢復狀態 |
| 暫停 | 來電/按鍵鎖/切換應用 | pauseApp() | 釋放非關鍵資源、保存進度 |
| 銷毀 | 用戶退出/系統回收 | destroyApp(true) → notifyDestroyed() | 釋放所有資源、持久化數據 |
// 服務端接收 POST 參數示例 (JSP/Servlet)
String status = request.getParameter("status"); // 900, 901, 902...
String suiteName = request.getParameter("suite");
| 代碼 | 含義 |
|---|---|
| 900 | 成功 |
| 901 | 內存不足 |
| 902 | 用戶取消 |
| 903 | 服務丟失 (網絡斷開) |
| 904 | JAR 大小不匹配 |
| 905 | 屬性不匹配 (JAD/MANIFEST 關鍵屬性不一致) |
| 906 | 無效的 JAD |
| 907 | 無效的 JAR |
| 908 | Configuration/Profile 不兼容 |
| 909 | 驗證失敗 (簽名/證書) |
| 910 | 授權失敗 (權限不足) |
| 911 | Push 註冊失敗 |
| 912 | 刪除通知 |
現代 IDE 均內建 J2ME 插件,可自動完成上述全流程。核心配置點:
midpapi.zip、preverify.exe)從 .java 到手機運行,J2ME 獨有的 **預審核 + JAD/JAR 雙文件 + AMS 生命周期** 機制構建了完整的交付鏈路。掌握每個環節的輸入輸出、關鍵參數、常見錯誤碼,並將其固化為自動化構建腳本,是專業 J2ME 團隊交付高質量產品的基礎保障。