HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
J2ME(DoJa/MIDP)の開発環境
J2ME(携帯電話向けJAVA)では、アプリのサイズを小さくすることが求められます。
最近の海外端末や、DoCoMoでも903i以降の機種はかなり大きなアプリでも大丈夫ですが、それでも数MBなので、リッチコンテンツを搭載しようと思うと極力容量は削りたいところです。
また、JAVAのクラスファイルは容易にリバースエンジニアリング出来てしまいますが、DRMなどに対応させるのは結構面倒&対応機種も限られてきます。

そこで、登場するのが難読化&最適化ツールです。
これは、クラス名やメソッド名なんかを短い名前に付け替えたりして、(リバースエンジニアリングされても)読みにくく、かつクラスファイルの縮小もしてくれるという物です。

今回は、備忘録をかねて、有名どころのProGuardをDoJaやMIDP端末向けに利用する方法を紹介します。

あと、携帯向けだとJAVAの理念はすっかり鳴りを潜めてしまい、メーカや機種による差異がかなり大きいです。
そうなると欲しくなるのがプリプロセッサなのですが、Sunは頑なにプリプロセッサの導入を拒否してくれちゃっています。
なので、今回はCのプリプロセッサも使えるようにする工夫も入れてあります。(ただし、デバッグ文の削除とか機種による動作の違いを吸収するとかいった程度を想定しています)
まず、前提です。
DoJaは国内のDoCoMo向け環境の最新版DoJa5.0が対象です。
(もっと古いものでも基本は同じだと思いますので応用は可能だと思います)
MIDPは海外GSM端末(SBMのNokia端末も含む)のMIDP2.0端末を基本としています。
MIDPやCLDCのバージョンは簡単に変えられるように考えてありますが、国内(KDDIやSBM)の端末では、いろいろ変えないと動かないかもしれません。

あと、開発環境ですが、javaの開発環境としてはeclipseを使っていることを前提としています。
DoJaの場合は純正のプラグイン、MIDPの場合はEclipseMeのプラグインです。
なお、MIDP開発環境についてはこちらが参考になります。
(この通りにセットアップすれば、eclipseからProGuardを起動することも出来ますので、難読化だけが目的ならこれで終わりです)

では、まず基本的な手順から。
当然のように、まずはちゃんと動くプログラムを作るところから始めないといけません。
上記のプラグインを使っていれば、eclipseでデバッグ実行も出来るのでそういった機能を使いつつ、目的の動作がエミュレータでちゃんと動くところまで作りこみましょう。
#当然この時点で実機テストも出来ればやっておいたほうが良いでしょう

プログラムが完成したら、プリプロセッサで機種による差異を吸収させつつ難読化&最適化されたバイナリを作成することになります。
プリプロセッサをかけるのは、単純にCコンパイラにプリプロセッシングのみ行うようなオプションをつけて実行すれば良いだけです。
ただし、これだと開発中にプリプロセッサディレクティブ(#から始まるやつ)をJAVAコンパイラがエラーとしてしまいますので、その辺の対策が必要です。
この辺はいろいろツールが出回っていますが、私はperlで自前スクリプトを作って対処しています。
#その方がかゆいところに手が届きますので

具体的な方法は最後に回して、次の手順が難読化/最適化です。
MIDPの場合、手動でやるならProGuardをGUI起動して使うとか、EclipseMeの機能を使うとか、K-Toolbarの機能を使うとかでOKです。

DoJaの場合は、(DoJa3.5程度までなら一発修正してくれるツールがあるのですが最新版では使えないので)ProGuardをコマンドラインから叩いてあれこれやらないとなりません。
やることはこんなにあります…
・javacでのコンパイル
・一旦JARに纏める
・ProGuardをかける
・難読化/最適化されたJARを展開する
・展開したクラスファイルにPreverify(事前検証)をかける
・PreverifyしたクラスファイルをJARに纏める
・JAMファイルの更新日時やJARサイズ情報を書き換える

これを手作業でやるのはかな~り面倒です。
そこで、自動化と言うことになります。
MIDPの場合も、eclipseでのビルドではデバッグ情報を消すためにいちいちプロジェクト設定を変えないといけなかったり、エラーチェックが微妙に甘かったり(本来エラーになるような継承がスルーされたり)しますので、こちらも一緒に自動化します。

自動化に当たっては、バッチファイルでもantビルドでも良いのですが、前者はエラーが起きても止らない(とめることもできますがif文だらけになって厄介)のが最大の欠点、後者は良くわからない^^;ので、馴染み深いmakeファイルで行きます。
ただ、JAVAの場合、C等と違ってクラスファイルはソースファイル毎ではなくクラスごとに作られるのが基本ですし、ディレクトリを跨いだ依存関係はmakeの苦手分野なので、バッチファイル+αといった感じのmakefileです。

・必要な環境(J2ME開発環境以外)
 VC++(使うのはcl.exeとnmake.exeのみなので、MSからフリーでダウンロードできるコンパイラでもOKだと思う&makeファイルを弄ればgcc&gmakeなんかでもOKだと思う)
 perl(cygwinのperl5を利用。ActivePerlなんかでも多分OK)

・ディレクトリ構成
 perlスクリプトはワークスペースのトップにtoolというディレクトリを作ってそこに格納
 ソースファイル(*.java)はプロジェクト内のsrcディレクトリにあることを想定(EclipseMeのデフォルト設定とは違うので注意)
 リソースファイル(画像ファイルなど)はプロジェクト内のresディレクトリにあることを想定(EclipseMeのデフォルト設定とは違うので注意)
 インクルードファイル(必要なら)はincディレクトリ内に*.hとして保存
 最終的な生成物はdeployedディレクトリに出来る
 ビルド中にwkというディレクトリを作るのであったら消しておく

 WorkSpace -+-tool(perlスクリプト)
       +-<Project> -+-src(*.java)
                +-inc(*.h)
                +-res(リソースファイル)
                +-deplpyed(最終生成物が入る)
                +-wk(一時ファイルが入る)


・特殊コメント
 ソースファイルの特定のコメントはプリプロセッシング前に以下のように置換される

 //#  > #  (C使用のプリプロセッサディレクティブに使う)
 /*@*/ > // (デバッグ時のみ有効にしたい機能 ログ出力など)
 //*  > /* (同上 ブロックタイプの開始側)
 //*/  > */ (同上 ブロックタイプの閉じ側)
 //@  >[削除](リリース時のみ有効にしたい機能 #ifdefの中身など)
 /*@  >[削除](同上 ブロックタイプの開始側)
 @*/  >[削除](同上 ブロックタイプの閉じ側)


・各ファイル
 http://heavybommer.web.fc2.com/download/java_maketool.zip からダウンロードしてください。(リンクだと弾かれちゃうので)
 toolにperlスクリプト、DoJa/MIDPにそれぞれのmakefileが入っています。
 なお、タブカラムサイズは4にすると見やすいと思います。

・注意
 makefileのパラメータ設定は基本的に変える必要の高そうなものから順に並べてあります
 インクルードファイルを使わない場合はINCを空にしてください
 
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。