突然消失するかもしれないブログ

”とつきえブログ”

Androidの.odexを.dexに変換する方法

わかる人にしかわからないシリーズ第3弾。

Androidの.odexファイルを.dexファイルに変換する方法についてです。

image

以下、長文となります。

まずはこちらのサイトをご覧下さい。

Installeer YouTube Op Je Proximus HTC Magic

Android端末にプリインされているGoogle謹製のYouTubeアプリをある方法により、他の端末にアドインすることができるようになることが示されています。

ベルギー語?で書かれているので何が書かれているのかは詳しくはよくわかりませんが、気になる肝心の”ある方法”についてはふれられていません。でも、実はこれ、結構すごいことだと思います。

Android端末にプリインされているYouTubeアプリは、YouTube.apkとYouTube.odexの二つのファイルからなっていて、YouTube.apk内にはclasses.dexは含まれていません。実体はYouTube.odexファイルです。

Androidのエミュレータだと.odexファイルは実行できない? « 突然消失するかもしれないブログ

私が試した範囲では、HT-03Aから抜き出したYouTube.apkとYouTube.odexをAndroid1.5r3, 1.6r1のエミュレータに単にコピーして実行しただけでは、エミュレータのリセットがかかってしまい実行することができませんでした。

そこで、気になる肝心の”ある方法”について調べたところ、要は、.odexファイルを.dex形式に変換することで実現できることがわかりました。

具体的には、smaliというAndroidのdex形式のアセンブラ/ディスアセンブラを使用します。

smali – Project Hosting on Google Code

・smali(.smali → .dex形式のアセンブラ)
・bksmali(.odex → .smali形式の逆アセンブラ)
・deodexerant(bksmaliと連携して動作するDalvikのライブラリと静的リンクされているARM用の実行プログラム)

YouTubeアプリを例に手順の概略を説明すると以下のようになります。

1.Android端末からYouTube.apk, YouTube.odexをPCにコピーする。Androidのエミュレータにもコピーする。

2.DeodexInstructions – smali – Instructions on using baksmali and deodexerant to deodex an .odex fileの手順に従って、YouTube.odexを.smali形式に変換する。

3.上記で生成された.smali形式から.dex形式に変換する。

4.Android端末から抜き出したYouTube.apkを解凍して、Googleの署名を削除したあと、上記で生成された.dexファイルをYouTube.apkに再パックして、独自の証明書で再署名する。

5.エミュレータ、あるいは、Android端末にインストールする。

6.インストールしたYouTube.apkが正常に実行できるか確認する。

ということで、具体的な手順です。

検証環境は、Mac OS X Leopard、Android SDK 1.5r3、HT-03A(Android 1.5)です。ちなみに、Android 1.6r1ではうまくいきませんでした。

1.Android端末からYouTube.apk, YouTube.odexをPCにコピーする。Androidのエミュレータにもコピーする。

HT-03AをPCとUSB接続して、adb pullするなり、DDMSで抜き出すなりお好きに。

# HT-03AからYouTube.apk, YouTube.odexを抜き出す
$ adb pull /system/app/YouTube.apk .
$ adb pull /system/app/YouTube.odex .

Androidのエミュレータに上記のファイルをコピーします。

# HT-03Aから抜き出してきたYouTube.apk, YouTube.odexをAndroidのエミュレータにコピーする。
$ adb remount
$ adb put YouTube.apk /system/app
$ adb put YouTube.odex /sytem/app

2.DeodexInstructions – smali – Instructions on using baksmali and deodexerant to deodex an .odex fileの手順に従って、YouTube.odexを.smali形式に変換する。

http://code.google.com/p/smali/downloads/listからdeodexerant(Dalvikのライブラリと静的リンクされているARM用の実行プログラム)をダウンロードしAndroidのエミュレータにコピーして実行属性をつけます。

また、ホストPC上にbaksmaliをダウンロードします。

尚、smali公式のドキュメントではdeodexerantをAndroid端末実機で実行することになっていますがAndroidのエミュレータで問題ありません。

# Androidエミュレータ上での実行
$ adb put deodexerant /data/local
$ adb shell chmod 755 /data/local/deodexerant
$ adb forward tcp:1234 tcp:1234
$ adb shell /data/local/deodexerant /system/app/YouTube.odex 1234 &

# ホストPC上での実行(.odex → .smali形式に変換)
$ java -Xms256m –Xmx256m -jar baksmali.jar -x :1234 YouTube.odex

baksmali.jarを実行するときにヒープサイズを変更しないと「java.lang.OutOfMemoryError」が出るかもしれません。

FAQ – 「java.lang.OutOfMemoryError」が出力される

.odexから変換された.smali形式のファイルは、outという名前のディレクトリに出力されます。

3.上記で生成された.smali形式から.dex形式に変換する。

# ホストPC上での実行(.smali → .dex形式に変換)
$ java -Xms256m -Xmx256m -jar smali.jar out

上記を実行することによりoutディレクトリの.smali形式のファイルが変換されてout.dexというファイルに出力されます。

4.Android端末から抜き出したYouTube.apkを解凍して、Googleの署名を削除したあと、上記で生成された.dexファイルをYouTube.apkに再パックして、独自の証明書で再署名する。

# ホストPC上での実行
# YouTube.apkを解凍する。
$ mkdir t
$ cd t
$ unzip ../YouTube.apk

# Googleの署名を削除する。
$ cd META-INF
$ rm *

# out.dexをコピーする。
# cd ..
# cp ../out.dex classes.dex
# ls
AndroidManifest.xml
META-INF
classes.dex
res
resources.arsc

# YouTube.apkに再パックする。
# jar cvf /tmp/YouTube.apk .
# cd ..

# YouTube.apkを再署名する。
# 証明書を適当に作成する。(適当にパスワードを指定する)
$ keytool \
-genkey \
-dname “c=JP” \
-keypass パスワード \
-keystore test.keystore \
-storepass パスワード \
-validity 10000 \
-alias test \
-keyalg RSA

# YouTube.apkに署名する。
# jarsigner -keystore test.keystore -verbose /tmp/YouTube.apk test

.apkファイルへの署名の仕方は以下を参考にしました。

Androidアプリケーションを公開するために:署名と配置の方法 – DevX – japan.internet.com コラム

Blog MRC HT-03A その7

throw Life – Androidアプリに証明書を入れてちゃんとデジタル署名する方法

5.エミュレータ、あるいは、Android端末にインストールする。

# エミュレータにYouTube.apkをインストールする。
$ adb install /tmp/YouTube.apk

Android 1.5r3では成功しましたが、Android 1.6r1ではうまくいきませんでした。HT-03AはAndroid 1.5なので、APIレベルの関係でAndroid 1.6r1では動かないのかもしれません。

# Android 1.5r3のエミュレータの場合

$ adb install YouTube.apk
1719 KB/s (188961 bytes in 0.107s)
pkg: /data/local/tmp/YouTube.apk
Success

# Android 1.6r1のエミュレータの場合

$ adb install YouTube.apk
1337 KB/s (188961 bytes in 0.137s)
pkg: /data/local/tmp/YouTube.apk
Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]

Android端末にインストールするときは、/system/app/YouTube.*を削除する必要がありますので、削除するときは自己責任でお願いします。

image

Android 1.5r3のエミュエータでは、ばっちりインストール出来ました!

6.インストールしたYouTube.apkが正常に実行できるか確認する。

早速、YouTube.apkを実行してみましょう。

image

うぉ~、ばっちり実行できました!

Android端末実機よりもスムーズに動きますね。

image

キーワード検索をしてみます。

image

検索結果が表示されました。適当に動画を選択して再生してみます。

image

お~、標準画質ですけどスムーズに再生されますね。QEMUでARMエミュレーションしているのにスムーズですね。

image

AndroidのエミュレータはCTRL+F12で画面の縦、横の回転が行えます。

Androidエミュレータで画面回転 – Android Zaurusの日記

image

高画質で再生できるか試してみましたが、ハードウェアアクセラレーションがサポートされていないせいか、音声は正常に再生されるようですが、動画の再生は途中で止まってしまい静止画状態になってしまいました。

広告

Androidの.odexを.dexに変換する方法」への6件のフィードバック

  1. 通りすがり 9月 20, 2009 10:44 am

    技術的には面白いですが、こんな手順を踏まなくても、簡単にYouTube.apkが
    入手でき、そのままインストールできます。

  2. typex20 9月 20, 2009 1:01 pm

    コメントありがとうございました。

    もしよろしければ「簡単にYouTube.apkが入手でき、そのままインストールできます。」という方法を教えて頂けないでしょうか?

    今回は、.odex→.dexに変換する技術的な方法を説明するために、一例としてYouTube.apk,YouTube.odexを取り上げてみました。

    ちょっとコメントが長くなりそうなので続きは別エントリで書かせて頂きます。

  3. 通りすがり 9月 20, 2009 10:14 pm

    野良ROMと呼ばれるものが多数存在しており、入手方法もあるblogに記載されています。

    いくつか野良ROMを取得してみると、system/appの中にYouTubeやMapsなど
    含まれているものもありますので、エミュレータ等にadb install YouTube.apk
    コマンドでインストールできます。

    ただしMapsなどは依存関係があるので、YouTubeほど簡単ではないです

  4. typex20 9月 24, 2009 11:49 pm

    情報どうもありがとうございました。やはり野良ROMとか、Android Devphone 1経由でしたか。

    私のターゲットは、あくまで、Vending.apk, Vending.odex、つまり、Android Marketだったりしますので、これをきっかけにAndroid Market秘密に迫っていきたいと思います。(^^;

  5. 通りすがり 9月 26, 2009 9:05 am

    野良ROMを取得して、展開すればそのままsystem/appにアクセスできます

    vending.apkも同様に入手できますが、依存関係があり、単体では動作しません。

    1つの条件としてgmailのアカウント登録がありますので、gmail.apkが動作して
    いないといけませんが、こちらの動作条件が分かっていません。

  6. ピンバック:Android Marketのハック事情(3):種割れ « 突然消失するかもしれないブログ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。