J2ME 開發最大的挑戰在於機型碎片化。本文彙整 2008 年左右主流手機(Moto、Nokia、Sony Ericsson、Samsung、Bird、Alcatel 等)的螢幕規格、Java 運行環境、堆疊限制,以及實測踩坑記錄,供開發者在適配與測試階段快速查閱。
| 品牌/系列 | 代表機型 | 螢幕/遊戲/非全螢幕 | MIDP/CLDC | JAR限制/堆疊 | 關鍵特性與 Bug |
|---|---|---|---|---|---|
| Moto C 系列 | C650 | 128×128 / 128×116 / 128×100 | 2.0 / 1.0 | 100K / 800K | 支援 FunLight/3D API;需授權開啟攝像頭;setMediaTime 不支援,playerUpdate 回傳副本需用 equals 比較 |
| Moto C550/C370/E380 | — | 96×65 / 96×64 / 96×64 | 1.0 / 1.0 | 100K / 512K | 支援 Game API(相當 MIDP 2.0 功能) |
| Moto E398/V600 | — | 176×220 / 176×204 / 176×182 | 2.0 / 1.0 | 無限制 / 800K | V300 鍵值與 E398 互為相反數,取絕對值判斷 |
| Moto C975/C980/V980 | — | 176×220 / 176×204 / 176×182 | 2.0 / 1.1 | 無限制 / 1.5M | 支援標準 3D API、藍牙 |
| Moto E680 | — | 240×320 / 240×320 | 2.0 / 1.1 | 無限制 / 1.5M | 5 空格佔一字符寬度;代碼分段載入,避免超長方法導致延遲 |
| Nokia S40 v1 | — | 128×128 / 128×128 / 128×? | 1.0 / 1.0 | 64KB / 不明 | 按鍵延遲,中斷後原線程仍運行直到 repaint,記憶體不當會死機 |
| Nokia S40 v2 | — | 128×128 / 128×128 / 128×? | 2.0 / 1.0 | 110~128KB / 不明 | CMWAP 直連 |
| Nokia 6230i | — | 128×128 / 208×208 | 2.0 / 1.0 | 不明 | 遊戲螢幕分辨率特殊 |
| Nokia S60 MIDP 1.0 | 3650, N-Gage | 176×208 / 176×208 / 176×144 | 1.0 / 1.0 | 不明 | 3650:setClip+drawRegion 裁剪錯誤;頻繁 I/O 死機;N-Gage 背景緩衝裁剪失效、聲音播放問題 |
| Nokia S60 MIDP 2.0 | 6600, 7610, 6681 | 176×208 / 176×208 / 176×144 | 2.0 / 1.0 | 不明 | 6600:readFully 失效用 readByte;setClip+drawRegion 歐版錯誤。7610:drawRegion 拖慢速度,建議用 Nokia UI drawImage;繪圖不當死機。6681:頻繁 I/O 死機;drawRegion 記憶體洩漏,地圖繪製用 MIDP 1.0 drawImage |
| Sony Ericsson K700c | — | 176×220 / 176×220 / 176×176 | 2.0 / 1.1 | ? / 512K+ | 支援 Nokia UI API(但 drawPixels/getPixels 不可用);支援標準 3D API;單類檔 ≤70K 否則無法載入 |
| Bird S689 | — | 128×160 / 128×144 / 128×128 | 2.0 / 1.0 | 200K / 512K | CMWAP 需代理 |
| Alcatel OT556/557 | — | 128×160 / 128×160 / 128×129 | 2.0 / 1.0 | 256K / 512K | 字體 14×14,約 8 中文字/行 |
| Samsung X108/X608 | — | 128×128 / 128×128(全螢幕補丁) / 128×110 | 1.0 / 1.0 | ? / 不明 | CMWAP 需代理 |
Class.getResourceAsStream)2003 年起存在:使用該方法載入資源(含 Image.createImage)無法釋放記憶體,close()、null、System.gc() 均無效。受影響機型:Nokia 3230、7610。對策:集中載入、永不釋放、控制洩漏次數。
keyPressed() 無法捕獲軟鍵,且能否捕獲取決於方法代碼行數。對策:將邏輯提取到獨立方法,keyPressed 僅傳參呼叫。
drawRegion 極慢(Nokia S60 除 N-Gage QD 外)3230、7610 等機型效能極差。對策:自行實現裁剪/旋轉,或美術預製旋轉圖。
規格 512K,實測僅 412K。
repaint(SE K700c)keyPressed 中呼叫 repaint() 無反應。對策:在 keyReleased() 再補一次。
new String(byte[], "UTF8") 會丟字符。對策:用 InputStreamReader + StringBuffer 逐字符讀取。
copyArea 貼圖亂序(Moto V3/E398)違反 Spec 的覆蓋衝突處理。對策:自備螢幕大小的 Image 做雙緩衝,用兩次 drawImage 替代。
VolumeControl.setLevel(0) 仍有聲音。對策:再補 setMute(true)。
InputStream.ready() 永遠回傳 false(Nokia 3230)常用 while(is.ready()) is.read() 會卡死。對策:自行實現讀取邏輯或繼承覆寫。