iアプリ(Doja)の容量削減 〜ツールでダウンサイジング〜

ドコモ携帯用のiアプリ(Doja)を、ツールで容量削減しよう、という覚え書き。

容量削減に関しての一般的な話題は、以下のページをどうぞ。
@IT > Mobile Connection > iアプリを10Kbytesに収めるテクニック
503時代のページで古いですが、言ってることは今もそのまま通ずるところがあるかと。
クラス数を減らすとか、即値を使うとか、画像の連結とか。
(2006/6/7)


・目次
▼容量削減ツール
▼iアプリにおける容量削減の方法
▼preverify(事前検証)の実行
▼jam(Java Application Manager)ファイルの修正





容量削減が実現できるツールは色々あるわけですが、とりあえず手間をかけずに容量削減したいということであれば、Java Blenderでいいんじゃないでしょうか。
obfuscator、optimizer、preverifyjamの修正を全部やってくれるので、ワンクリックです。

とりあえず列記します。

Java Blenderiアプリ用、preverifyjamファイル修正付き
ProGuard英語GUIでオプション楽ちん設定
jarg日本人作者、preverify対応
JoGa使ったことない
RetroGuard有名
7zip高圧縮zip作成
SophiaCompress高性能らしいが商用




■obfuscator(難読化) & optimizer(最適化)


Java Blender
・iアプリ専用で最も使いやすい。説明不要のワンクリック。更新が止まっている。日本語。
・実行後、preverify(事前検証)jamファイル修正の必要なし



ProGuard
・GUIできめ細かいオプション設定可能。英語。
・実行後、preverify(事前検証)jamファイル修正の必要あり

・ダウンロード後、「/lib/proguardgui.jar」クリックしてを起動
・「input/output」で、「add input」にツールにかけたいjarファイル指定、「add output」で新しく作るjarファイル名を指定
・その下の「Library jars・・・・」で、そのアプリのDojaバージョンの「iαppli Development Kit for DoJa」にある「/iDKDoJa○○/lib/classes.zip」と「/iDKDoJa○○/lib/doja_classes.zip」を追加。(他のものはremoveして解除)
・メインクラス名が変わるので、「Obfuscation」の「Print mapping」で対応表を出力するファイル名を指定、後でそれを使ってjamファイル修正
・もしくは、メインクラス名を「keep names」で指定して、変更しないようにする
・「Process」で「Process」を押すと実行
・うまくいかない場合、「infomaition」で「igonore warnings」にチェックを入れる。もしくは「Shrinking」で「Shrink」のチェックを外してみたり


jarg
・コマンドラインから使用、preverify(事前検証)対応。日本語。
・実行後、jamファイル修正の必要あり


JoGa
・GUIで操作、英語。
・実行後、preverify(事前検証)jamファイル修正の必要あり



■obfuscator(難読化)

RetroGuard
・コマンドラインから使用、obfuscatorのみ。英語。
・実行後、preverify(事前検証)jamファイル修正の必要あり
・下記に使い方記載あり
@IT > Mobile Connection > iアプリを10Kbytesに収めるテクニック


■その他

7zip
・圧縮率の高いzipアーカイバ。
jarファイル(Java ARchive)はzip形式で、iアプリもjava標準の「jar.exe」から作られたzipファイル。
この、「jar.exe」より圧縮率の高いツールでjar(=zip)を作ることで容量削減をはかることができる。
・実行後、preverify(事前検証)jamファイル修正の必要あり


■商用

SophiaCompress
・商用の携帯java専用容量削減ツール。最強らしいが、商用なので使ったことない。


▲TOP





容量削減の方法(ツール)としては、以下の2つが上げられます。

obfuscator(オブファスケータ、難読化ツール)
クラス名やメソッド・メンバ名から有意味性をはぎ取りつつ短くして、「あー、こんなソース読みたくねー」と思わせるようにするリバースエンジニアリング対策ツール。
例)「Http.class」→obfuscator使用後→「a.class」
仮にリバースエンジニアリングされたとして、「a.class」って何だよ!このb()メソッドって何やってるんだ!みたいな?難読化。
また、クラス名や変数名などはビルド後もその名前のままバイトコードに入るので、名前を短くすると結果的に容量削減にもなる。

optimizer(最適化)
使ってないクラスやメソッドを削ってくれたり。
辞書:optimizer


これらのツールはjava全般のjarファイルに適用できるものなのですが、iアプリの場合はこれらを適用した後に、preverify(事前検証)とjamファイル修正を行う必要があります(一部のツール除く)。

通常「iαppli Development Kit for DoJa」でビルドする際は、preverify(事前検証)jamファイル修正も勝手にやってくれるワケですが、そうしてビルドされたjarファイルをobfuscator(難読化)などでいじると、自分でjarファイルに対してpreverify(事前検証)したり、jamのアプリサイズ欄に正しいjarファイルサイズを入れたりする必要があるのです。

▼preverify(事前検証)の実行
▼jam(Java Application Manager)ファイルの修正

個人的に、ごくまれにobfuscator(難読化)はいいんだけど、optimizer(最適化)すると携帯で動かなくなったりします。
多分ソースが悪いんでしょうが、そんな時はオプションでobfuscator(難読化)だけかけて容量削減してます。

▲TOP





preverify(事前検証)とは、標準的なJava仮想マシンで行われるバイトコード検証作業の一部を事前(ビルド時)に済ませておき、アプリ実行時の検証作業実行コストを削減をはかるCLDCの固有ツール。
実行すると追加の属性情報がクラスファイルに書き込まれ、これがないとアプリは携帯で動かない。
iアプリ作成用にドコモが配布している「iαppli Development Kit for DoJa」についてくるツール(/bin/preverify.exe)を使う。
iαppli Development Kit for DoJa」でビルドする際は、これを自動でやってくれているが、obfuscatorなどを使ってビルド後のjarファイルを変更する場合、手動でコマンドラインからpreverifyをかける必要がある。


以下、preverifyを手動(コマンドブロンプト)から使用する一連の流れ。
ProGuardなどでjarファイルをいじった後の流れ)

1.jarファイル解凍し、出てきたクラスファイルを1つのフォルダにまとめておく
jar -xvf ○○○.jar

2.クラスファイルのディレクトリに移動(cdコマンド)し、preverify実行(「iDKDoJa3.5」のトコは、使用するアプリのDojaバージョンで)
C:\iDKDoJa3.5\bin\preverify.exe -classpath .;C:\iDKDoJa3.5\lib\classes.zip;C:\iDKDoJa3.5\lib\doja_classes.zip C:\my_class_files(クラスファイルのあるディレクトリ)

3.preverifyされたクラスファイルがoutputフォルダ内にできているので、それを再びjar化。cdコマンドでクラスファイルのあるディレクトリに移った上で、下記コマンド。
jar -cvMf ○○.jar(新規作成するjarファイル名) *.*

4.jamファイルの修正

▲TOP





obfuscatorなどでjarファイルをいじった場合、これを修正する必要がある。
修正点は2点。

AppSize
iアプリのサイズ。修正する場合は、jarファイルのサイズを目で見て書き込む

AppClass
iアプリのメインクラス名(IApplication、MApplicationを継承して、最初に作るクラス)
obfuscatorを使ってクラス名が変わった場合、変更後のクラス名を入れる。
(obfuscatorは大抵クラス名の変換ログを出力できるので、それをみる)


▲TOP