1)apk の実行可能コードには二種類ある。
- odex: 端末最適化済
- deodex: 汎用コード (de-odex?)
- 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 のファイルとか全部抜き出しておくのが吉。
- 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を実行してやる。具体的にはこんな具合。
これだけでは端末できちんと動かんらしいので、必要に応じて編集前の framework.jar から署名部分をバイナリで抜き出し、新しい framework.jar に付加してやるとよいらしい。詳しい手順はddとかbusyboxで調べて。
今回は odex のまま編集することが目的だったので、署名は行っていない。
deodex の odex 化
要は、deodex 化した .jar/.apk を端末に転送してやり、そっちで最適化すればよいとのこと。
おそらく端末標準で dexopt コマンドが入っている(?)が、署名なしでは動かんらしいので、dexopt-wrapper なるスクリプトのご紹介。
# cd /data/local/tmp# dexopt-wrapper framework.jar framework.odex
こんな具合にして署名を追加。
実行後、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
没有评论:
发表评论