MotorolaのMilestoneを覗いてみたら,.odexという拡張子のついたファイルが存在していた。だいたい同じファイル名を持つ.apkとセットになっていた。aaaa.apkとaaaa.odexのような状態。
.apkはアプリケーションパッケージですが,じゃあ.odexは何かっていうとどうも「Optimized dex」っていうことらしい。
それじゃ,dexはなんなんだっていうと,「Dalvik Excecutable」のことみたいだ。
つまり,.odexファイルは,AndroidのDalvik VMで実行可能なファイルの.dexを最適化したものということになる。
普通は,.dexファイルは.apkに含まれた形で配布される。.apkはzipアーカイブなんで,覗いてみたりすると「classes.dex」というファイルがある。
端末でアプリが実行される時は,このclasses.dexを元にしてodexを作った後,実行するようになっているみたいだ。この時,.odexファイルは/data/dalvik-cacheディレクトリに保管される。
じゃあこのMilestoneの/system/appディレクトリに最初から存在している.odexはどんなやつかっていうと,/data/dalvik-cacheに置いてしまうと/data以下の容量がどんどこ減ってしまう。
それに比べ,/systemは読み込み専用なわけで,端末が動いているときにファイルなんかが追加されることはない。(通常ね)プリインストールされたアプリでは,/data以下を無駄にすること無くアプリを実行できるようになる,っていうことかなぁ。
ということで,.odexがあれば.apk内の.dexはいらないはずなんでclasses.dexは無いはず。でもこうなると実行ファイルが存在しないので,.apkだけではアプリのインストールが出来なくなっちゃう。.odexファイルもDalvikごとに違うファイルになるはずなんで,単純に.apkと.odexをコピーした場合は動かない可能性がある気がする。
必要なのは,.apkと.odex,それとsmali(odexをsmaliにディスアセンブルするbaksmaliと,smali をdexにアセンブルするsmaliのツール。java実行環境も必要)。
それと,baksmaliを実行する時に.odexの含まれるAndroid環境の/system/framework以下のjarファイルなどが必要になる場合があるようだ。
java -jar baksmali.jar -x aaa.odex
java -jar baksmali.jar -d ../system/framework -x aaa.odex
java -jar smali.jar -o aaa.dex out
mkdir temp cd temp unzip ../aaa.apk rm META-INF/* cp ../aaa.dex classes.dex jar cvf ../aaa_new.apk . cd .. mv aaa.apk aaa_old.apl mv aaa_new.apk aaa.apk
keytool -genkey -dname "c=j" -keypass [password] -keystore test.keystore -storepass [password] -validity 10000 -alias test -keyalg RSA
jarsigner -keystore test.keystore -verbose aaa.apk test
新しくコメントをつける