ホーム > デベロッパ > DoJa と MIDP の相違点 & アプリサイズ −携帯 Java 技術情報−

DoJa と MIDP の相違点 & アプリサイズ

DoJa と MIDP の相違点 & アプリサイズ −携帯 Java 技術情報−

携帯 Java アプリの多キャリア・機種対応

携帯 Java の仕様

携帯 Java アプリの開発では、キャリア・機種毎に微妙に異なる携帯 Java の仕様を念頭に置いて、共有できる部分とできない部分を切り分けて設計することが重要です。

DoJa と MIDP の違い

起動クラス

DoJa は IApplication、MIDP は MIDlet です。

データの保存

DoJa はスクラッチパッド、MIDP はレコードストアにデータを保存します。

低レベル UI 関係のクラス ( Canvas )

描画、サイズ取得のメソッドはほぼ共通化できますが、DoJa と MIDP ではダブルバッファリングの方法が異なります。

高レベル UI 関係のクラス ( Panel、Frame など )

DoJa と MIDP では、仕様が異なるので共通できません。

グラフィックスコンテキスト ( Graphics )

DoJa から MIDP、或いは MIDP から DoJa への変換クラスを作成すれば共通化できます。

画像

画像変換すれば共通化できます。

キーイベントの処理

プリプロセッサをすれば共通化できます。MIDP ではソフトキーの押下を直接取得できません。

サウンド・動画

キャリアや端末に依存するので、共通化が困難です。

プリプロセッサの利用例 − キーイベント処理の共通化 −

キーの名前は MIDP に合わせます。commandAction、keyPressed から processEvent を呼び出すようにすると、DoJa と MIDP の処理は processEvent で共通化されます。

// (例) キーイベント処理の共通化
// Microsoft Visual C++ 付属プリプロセッサ CL.EXE を利用 
#ifdef DOJA
    #define PP_KEY_PRESSED_EVENT Display.KEY_PRESSED_EVENT
    #define FIRE Display.KEY_SELECT
    #define SOFT1 Display.KEY_SOFT1
    #define SOFT2 Display.KEY_SOFT2
#else
    #define PP_KEY_PRESSED_EVENT 0
    #define SOFT1 0x100
    #define SOFT2 0x101
#endif

(中略)

#ifdef MIDP
    Command[] command = new Command[2];
    public void commandAction(Command c, Displayable s) {
        if(c == command[0]){
            processEvent(PP_KEY_PRESSED_EVENT, SOFT1);
        } else if(c == command[1]){
            processEvent(PP_KEY_PRESSED_EVENT, SOFT2);
        }
    }

public void keyPressed(int keyCode) {
    if(keyCode != 0){
        processEvent(PP_KEY_PRESSED_EVENT, getGameAction(keyCode));
    }
}
#endif

public void processEvent(int type, int param){
    if(type == PP_KEY_PRESSED_EVENT){
        switch(param){
        case FIRE:
            // センターキーの処理
            break;
        case SOFT1:
            // ソフトキー1の処理
            break;
        case SOFT2:
            // ソフトキー2の処理
            break;
        }
    }
}

(後略)

Graphics 変換クラス

Graphics クラスはラッパークラスによって共通化できます。

DoJa から MIDP へのGraphics 変換クラス DojaGraphics
// DojaGraphics クラス
import javax.microedition.lcdui.*;

class DojaGraphics {
    public static final int BLUE = 0x000000FF;
    public static final int GREEN = 0x0000FF00;
    public static final int RED = 0x00FF0000;
    public static final int WHITE = 0x00FFFFFF;
    public static final int BLACK = 0x00000000;

    Graphics graphics;
    Font font;

    public DojaGraphics(Graphics g) {
        graphics = g;
    }

    public int getColorOfName(int c) {
        return c;
    }

    public void setColor(int c) {
        graphics.setColor(c);
    }

    public void setFont(Font f) {
        font = f;
        graphics.setFont(f);
    }

    //実装省略
    public void lock() {}
    public void unlock(boolean forced) {}

    public void drawString(String str, int x, int y){
        graphics.drawString( str, x, y, graphics.BASELINE | graphics.LEFT);
    }

    public void drawImage(Image img, int x, int y) {
        graphics.drawImage( img, x, y, graphics.TOP | graphics.LEFT);
    }

    public void drawLine(int x1, int y1, int x2, int y2) {
        graphics.drawLine(x1, y1, x2, y2);
    }

    public void fillRect(int x, int y, int w, int h) {
        graphics.fillRect(x, y, w, h);
    }

    public void drawRect(int x, int y, int w, int h) {
        graphics.drawRect(x, y, w, h);
    }
}
// DojaGraphics クラスの使用例
    public synchronized void paint(Graphics g) {
#ifdef MIDP
        paint(new DojaGraphics(g));
    }

    public void paint(DojaGraphics g) {
#endif
    g.lock();

    g.setColor(g.getColorOfName(g.WHITE));

    (中略)

    g.unlock(true);
}

サイズ最適化のために、DojaGraphics クラスは一部のメソッドしか実装していません。必要に応じて実装するメソッドを追加します。

携帯 Java アプリのサイズ制限

キャリア・機種毎に、携帯 Java アプリには以下の表に記すサイズ制限があります。

キャリアJAR ファイルのサイズ制限 ( 機種により異なる )
NTT DoCoMo10KB / 30KB / 100KB / 1024KB
auEZアプリ(Java) : 50KB / 150KB ; オープンアプリ(Java) : 300KB
SoftBank ※30KB / 50KB / 80KB / 200KB / 1024KB
WILLCOM1024KB

※ SoftBank では J-Phone、vodafone の携帯 Java も含みます。

携帯 Java アプリのサイズ圧縮方法

Java API の利用

極力 Java API を利用するようにします。

一時変数の削減

Dialog dialog = new Dialog(Dialog.DIALOG_ERROR,"...");
dialog.show();

は、

new Dialog(Dialog.DIALOG_ERROR,"...").show();

として、一時変数 dialog を削除できます。

メソッドのインライン化

getter,setterなどのメソッドはインライン展開し、削除します。

フィールドの削除

未使用フィールドは削除します。

定数式

定数式は計算結果に置き換えます。

変数の配列化

複数の変数を 1 つの配列にします。

クラス融合

複数のクラスを 1 つのクラスにします

名前の共有・短縮

クラス名、メソッド名、フィールド名を短くし、共有するようにします。

携帯 Java アプリ圧縮ツール

フリーツール

ProGuard

http://proguard.sourceforge.net/

フリーの携帯 Java アプリ圧縮ツールとして最もよく利用されています。SophiaCompress(Java) と組み合わせて使うことで圧縮率が最大化されます。

JavaBlender

http://homepage.mac.com/t.sekiguchi/javablender/index-j.html

名前の短縮やクラス融合の機能を持つ携帯 Java アプリ圧縮ツールです。2005 年 4 月 26 日を最後にアップデートされていません。

jarg

http://jarg.sourceforge.net/

オープンソースの携帯 Java アプリ圧縮ツールです。2003 年 1 月 29 日を最後にアップデートされていません。

RetroGuard

http://www.retrologic.com/

RetroGuard は 逆コンパイルしたソースを解読不可能にする Obfuscator です。名前の短縮によりアプリは小さくなります。

商用ツール

SophiaCompress(Java)

/products/sophiacompress_java/

国内で最もよく使われている商用の携帯 Java アプリ圧縮ツールです。圧縮率の高さと使いやすさに定評があります。

DashO Pro

http://www.preemptive.com/products/dasho/index.html

DashO Pro も RetroGuard と同じ Obfuscator から出発しています。

mBooster

http://www.innaworks.com/

クラス融合、画像圧縮、スタックマップ削減などの機能に特徴があります。