|
現: 2020-12-26 (土) 15:07:35 yuji |
| + | *odex拡張子って? [#pb5ce700] |
| + | 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をコピーした場合は動かない可能性がある気がする。~ |
| + | |
| + | *.odexを.dexに変換して.apkに入れる手順 [#g6d6eb53] |
| + | 必要なのは,.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に署名が追加される。~ |