odex拡張子って? anchor.png

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をコピーした場合は動かない可能性がある気がする。

Page Top

.odexを.dexに変換して.apkに入れる手順 anchor.png

必要なのは,.apkと.odex,それとsmali(odexをsmaliにディスアセンブルするbaksmaliと,smali をdexにアセンブルするsmaliのツール。java実行環境も必要)。 それと,baksmaliを実行する時に.odexの含まれるAndroid環境の/system/framework以下のjarファイルなどが必要になる場合があるようだ。

  • odexをsmali形式にディスアセンブル
    aaa.apk,aaa.odex,baksmali.jarとsmali.jarを同じディレクトリに入れて,以下のコマンドを実行する。
    java -jar baksmali.jar -x aaa.odex
    もしエラーが出たら,/system/frameworkのファイルが必要になると思う。必要なファイルを baksmali.jarなどと同じディレクトリにコピーするか,ディレクトリ位置を指示する-dオプションを追加する。
    java -jar baksmali.jar -d ../system/framework -x aaa.odex
    うまく行けば,「out」というディレクトリが作成され,その中に.smaliファイルが出来る。
  • smali形式からdexファイルを作成
    smaliコマンドを使ってdexに変換する
    java -jar smali.jar -o aaa.dex out
    うまく行けば,「aaa.dex」というファイルが作成されます。
  • dexファイルをapkに入れる
    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
  • apkに署名をする
    • 鍵を作る
      まず署名するための鍵を作成します。鍵は一度作れば使いまわせる。
      keytool -genkey -dname "c=j" -keypass [password] -keystore test.keystore -storepass [password] -validity 10000 -alias test -keyalg RSA
    • apkに署名を追加
      jarsigner -keystore test.keystore -verbose aaa.apk test
      「test.keystore」は鍵を作成したときの「-keystore」オプションに指定した値を,test」は「-alias」オプションに指定した値を使う。実行するとパスワードを聞かれるので,「-storepass」で指定した値を入力すると,apkに署名が追加される。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 548, today: 1, yesterday: 2
最終更新: 2020-12-26 (土) 16:07:35 (JST) (1188d) by yuji