眾多 MIDP 設備限制 JAR 包 ≤ 50KB(甚至 30KB)。本文以一個僅顯示文本框並播放聲音的 Demo MIDlet(原始 4KB)為例,演示六大通用瘦身技巧,最終壓縮至更小體積。
審視每個類:是否必須?用戶真正需要?Demo 已極簡,無刪減空間。實戰中常見冗餘:未使用的工具類、調試代碼、預留擴展接口。**刪除代碼是最高級的優化**。
每個類文件約 200 字節開銷。Demo 中兩個匿名監聽器(`CommandListener`、`ItemStateListener`)生成兩個 `.class` 文件。優化:主 MIDlet 實現雙接口,邏輯內遷,消滅兩個類文件。內部類同理,編譯器生成合成方法訪問外部私有成員,增加體積。
Demo 定義 `Mainform extends Form` 子類僅為添加組件。優化:直接 `new Form("Mainform")` 鏈式調用 `addCommand`、`setCommandListener`、`append`,省去一個類文件。
Demo 繼承 `BasicMIDlet` 抽象基類(模板方法模式)。但基類僅被繼承一次,**優化**:「合併基類與子類」,消除繼承結構,節省類文件與方法表開銷。原則:單繼承抽象類若無復用價值,內聯合併。
// 源碼
int[] arr = {0, 1, 2, 3};
// 編譯器生成等效字節碼
arr[0]=0; arr[1]=1; arr[2]=2; arr[3]=3; // 每次賦值一條指令
大數組會產生大量指令。兩種替代方案:
方案二速度最快、體積最小,適合大型查找表、關卡數據、字體位圖。
| 指標 | 優化前 | 優化後 | 手段 |
|---|---|---|---|
| 類文件數 | 3 (MIDlet, BasicMIDlet, Mainform, 2匿名類) | 1 (單一 MIDlet 類) | 策略 2,3,4 |
| 包結構 | com.j2medeveloper.techtips | 默認包 | 策略 5 |
| 符號長度 | 長名稱 | 混淆後 a/b/c... | 策略 5 (混淆器) |
| JAR 體積 | ~4 KB | ~2.5 KB | 綜合效果 |
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ASO extends MIDlet implements CommandListener, ItemStateListener {
private Display display;
private Form mainform;
private TextField tf = new TextField("Type anything", null, 20, 0);
private static final Command EXIT = new Command("Exit", Command.EXIT, 1);
public void commandAction(Command c, Displayable d) {
if (c == EXIT) notifyDestroyed();
}
public void itemStateChanged(Item item) {
if (item == tf) AlertType.INFO.playSound(display);
}
protected void destroyApp(boolean u) { notifyDestroyed(); }
protected void pauseApp() {}
protected void startApp() {
if (display == null) {
display = Display.getDisplay(this);
mainform = new Form("Mainform");
mainform.addCommand(EXIT);
mainform.setCommandListener(this);
mainform.setItemStateListener(this);
mainform.append(tf);
display.setCurrent(mainform);
}
}
}
J2ME 瘦身是系統工程:**刪代碼 > 消滅類 > 扁平化繼承 > 去包名 > 混淆符號 > 外部化數據**。將這六步內化為發布前檢查清單,50KB 紅線不再是阻礙,而是優化技藝的試金石。