Apktoolを使う際、odex化されている場合はまずdeodex化します。
odex化とは
XXXX.apkと一緒にXXXX.odexというファイルがある場合があります。この状態はodex化されている状態でメーカー製のシステムアプリ等でされていることが多いです。
通常、apkファイルはアプリを実行する前に内部のclasses.dexファイルを自動でodex化して実行しています。
あらかじめodex化しておくことで実行速度の高速化や使用するメモリやデータ領域を削減できるメリットがあるそうです。
また、メーカー製アプリの場合はapkファイルを他端末にコピーしても動かないようにするためにodex化を行うこともあるようです。
今回はodex化されているアプリを通常のapkファイルのみの状態に戻し(deodex化)再度odex化を行う方法です。
準備するもの
- Apktool等 ↑前記事で準備したファイル
- smali-XXX.jar, baksmali-XXX.jar
- oat2dex.jar
- dexopt-wrapper
apktool━━━7za.exe
┣━apktool.bat
┣━apktool.jar
┣━framework
┣━baksmali.jar
┣━dexopt-wrapper
┣━smali.jar
┣━XXXX.apk ←展開、再構築したいファイル
┗━XXXX.odex
使い方 (Android4.4以下の場合)
deodex化
C:\apktool>java -jar baksmali.jar -x -d framework XXXX.odex
コマンド実行後、XXXX.odexが展開されたファイルがoutフォルダ内に作成されます。このままclasses.dexに変換します。
C:\apktool>java -jar smali.jar out -o classes.dex
classes.dexが出力されたらapkファイルに追加する。C:\apktool>7za.exe u -tzip -mx=0 XXXX.apk classes.dex
以上でdeodex化は完了です。通常のapkファイルとして扱えます。必要であればapktoolで展開、再構築を行います。再odex化
スマートホン内での作成になります。
adb push dexopt-wrapper /data/local/tmp/
C:\apktool>adb push XXXX.apk /data/local/tmp/
C:\apktool>adb shell
$ cd /data/local/tmp
$ chmod 755 dexopt-wrapper
$ ./dexopt-wrapper XXXX.apk XXXX.odex
$ dd if=/system/app/<元々あるXXXX.odex> of=XXXX.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
ddコマンドでファイルの署名部分を移植しているらしい。これで/data/local/tmp/にXXXX.odexが作成されます。
$ su
# mount -o rw,remount /system
# cp -p XXXX.odex /system/app/XXXX.odex
使い方 (Android5 Lollipopの場合)
前準備
C:\apktool>java -jar oat2dex.jar boot framework/arm/boot.oat
deodex化
C:\apktool>java -jar oat2dex.jar XXXX.odex framework/arm/dex
コマンド実行後、XXXX.dexが出力されるのでclasses.dexにリネームする。C:\apktool>7za.exe u -tzip -mx=0 XXXX.apk classes.dex
以上でdeodex化は完了です。通常のapkファイルとして扱えます。必要であればapktoolで展開、再構築を行います。再odex化(できない?)
Lollipopの場合、再odex化の方法は調べても分からなかった。
そのため、編集を行ったapkファイルは今のところdeodexの状態で使うしか方法がないようです。
使い方(Android6以上の場合)
baksmali_v2.1.0以上を使用します。
実際に試す環境がないため省略
Lollipop以上の場合は再度odex化できない(?)やり方があれば教えて欲しいです。
nice blog.
返信削除