2013年10月13日星期日

Convert odex file to deodex


1)apk の実行可能コードには二種類ある。
  • odex: 端末最適化済
  • deodex: 汎用コード (de-odex?)

2)odex と deodex の変更
  • odex を deodex 化する場合
odex の展開 ⇒ deodex 化の手順でおk。
  • deodex を odex 化する場合
deodex を端末に転送 ⇒ .odex の生成 ⇒ deodex を分解してスマートな .jar/.apk を生成
  • odex を編集する
odex の展開 ⇒ 書き換え ⇒ deodex化 ⇒ odex化
やべぇ‥odexだかdeodexだか、書いてる本人が何書いてるのか分からなくなってきたぞ。。

odex の展開
カレントディレクトリ上に .odex や .jar 等のファイルが配置してあり、その上に baksmali.jar, smali.jar が配置してあるという想定。たぶん framework のファイルとか全部抜き出しておくのが吉。
java -jar ../baksmali.jar -a 10 -x framework.odex -o ../framework.odex.out/ -c :core-junit.odex
  • a : API-Level を指定する。Android 2.3.4の場合は10。
  • http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
  • x : 展開したい .odex を指定する。
  • o : 展開先を指定する。
  • c : 展開対象の .odex に不足のクラスがあるとかエラーが出た場合にそれっぽいやつを指定する。(通常は必要ない?)
deodex 化
展開したフォルダに対してsmali.jarを実行してやる。具体的にはこんな具合。
java -jar ../smali.jar -o classes.dex ./framework.odex.out/
classes.dex が生成されたら、framework.odex と共に抜き出しておいた framework.jar にZIPで突っ込む。
これだけでは端末できちんと動かんらしいので、必要に応じて編集前の framework.jar から署名部分をバイナリで抜き出し、新しい framework.jar に付加してやるとよいらしい。詳しい手順はddとかbusyboxで調べて。
今回は odex のまま編集することが目的だったので、署名は行っていない。

deodex の odex 化
要は、deodex 化した .jar/.apk を端末に転送してやり、そっちで最適化すればよいとのこと。
おそらく端末標準で dexopt コマンドが入っている(?)が、署名なしでは動かんらしいので、dexopt-wrapper なるスクリプトのご紹介。
解凍して deodex な .jar/.apk と共に端末の /data/local/tmp とかに展開。chmodして実行できるようにしてこんな具合で動かす。
# cd /data/local/tmp
# dexopt-wrapper framework.jar framework.odex
# dexopt-wrapper android.policy.jar android.policy.odex
こんな具合にして署名を追加。
busybox dd if=/system/framework/framework.odex of=framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
実行後、deodex化した .jar/.apk は classes.dex が入っててスペース的に無駄なので、こいつは使わずに素の .jar/.apk (classes.dexを含まない) との組み合わせで動かすと幸せになれるかもしれないとの事。
もちろん、単に deodex から odex 化した場合はそういうわけにはいかないので、きちんと classes.dex を抜いた .jar/.apk を作るとよさげ。(こっちも署名いるのかな?)
置換の際は、owner と permission の変更も忘れずに。




ref:
http://d.hatena.ne.jp/naba_san/20111201/1339446985

没有评论:

发表评论