首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 程序體積優化實戰指南

     編輯:J2ME

背景:J2ME 的嚴苛空間限制

MIDP 設備常限制應用 ≤50KB,遠小於 J2SE 環境。本文以一個「輸入文本框變化播放聲音」的 MIDlet 為例,演示體積優化技巧。

原始代碼(打包 4KB)

package com.j2medeveloper.techtips;
import javax.microedition.lcdui.*;
public class BeforeSizeOptimization extends BasicMIDlet {
    public static final Command exitCommand = new Command("Exit", Command.EXIT, 1);
    public BeforeSizeOptimization() {}
    protected void initMIDlet() { getDisplay().setCurrent(new MainForm()); }
    public class MainForm extends Form {
        public MainForm() {
            super("MainForm");
            addCommand(exitCommand);
            append(textField);
            setCommandListener(new CommandListener(){...});
            setItemStateListener(new ItemStateListener(){...});
        }
        private TextField textField = new TextField("Type anything", null, 20, 0);
    }
}

輔助類 BasicMIDlet 封裝生命週期。

五步優化法

  1. 精簡功能:確認每個功能是否必須,移除非核心「附屬功能」。
  2. 消除匿名內部類:每個類文件約 200 字節開銷。將 CommandListener、ItemStateListener 移至主類實現,共用監聽器實例。
  3. 復用現有類:不創建 Form 子類,直接實例化 Form 並配置。
  4. 扁平化繼承:BasicMIDlet 僅被繼承一次,合併至主類,減少類文件。
  5. 縮短命名:包名、類名、方法名、字段名縮短;可移除包名(MIDP 應用自包含)。使用混淆器(如 RetroGuard)自動完成並兼具代碼保護。

額外技巧:數組初始化優化

int[] arr = {0,1,2,3}; 編譯後生成逐條賦值指令,增大字節碼。改為:

  • 數據編碼為字符串,運行時解析。
  • 或存為二進制資源文件,用 getResourceAsStream() 讀取。

優化後代碼

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ASO extends MIDlet implements CommandListener, ItemStateListener {
    private Display display; private Form mainForm;
    private TextField mainFormTF = new TextField("Type anything", null, 20, 0);
    public static final Command exitCommand = new Command("Exit", Command.EXIT, 1);
    public ASO() {}
    public void commandAction(Command c, Displayable d) { if(c==exitCommand) exitMIDlet(); }
    protected void destroyApp(boolean u) throws MIDletStateChangeException { exitMIDlet(); }
    public void exitMIDlet() { notifyDestroyed(); }
    public Display getDisplay() { return display; }
    protected void initMIDlet() {
        mainForm = new Form("MainForm");
        mainForm.addCommand(exitCommand);
        mainForm.setCommandListener(this);
        mainForm.setItemStateListener(this);
        mainForm.append(mainFormTF);
        getDisplay().setCurrent(mainForm);
    }
    public void itemStateChanged(Item item) { if(item==mainFormTF) AlertType.INFO.playSound(getDisplay()); }
    protected void pauseApp() {}
    protected void startApp() throws MIDletStateChangeException {
        if(display==null){ display=Display.getDisplay(this); initMIDlet(); }
    }
}

優化後體積顯著縮減,技巧通用於所有 J2ME Profile。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved