スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Date: --.--.-- Category: スポンサー広告   

de-odexing

かなり用途の限定される内容です。ですが、今回はとても役に立ったのでメモしておきます。

android のファームウェアには .odex という拡張子のついたファイルが存在します (しない場合もあると思いますが)。それも、だいたい .apk とセットで存在します。aaaa.apk と aaaa.odex のような感じです。
.apk はアプリケーションパッケージですが、.odex はというと「Optimized dex」とのことです。では dex はというと、「Dalvik Excecutable」のことです。つまり、android の Dalvik VM で実行可能なファイルの .dex を最適化したのが .odex ファイルです。

通常、.dex ファイルは .apk に含まれた形で配布されます。.apk は単なる zip アーカイブなので、適当な .apk を展開してみると、「classes.dex」というファイルが含まれていると思います。
そして、実際にアプリが実行される時は、この classes.dex を元に odex を作り、実行するようです。この時の .odex ファイルは /data/dalvik-cache ディレクトリに保管されるようです (Desire ではプロテクトがかかって見れませんが)。

では、/system/app ディレクトリに最初から存在している .odex の役割はというと、上記のように /data/dalvik-cache に置いてしまうと、当然 /data 以下の容量が減ってしまいます。
/system は (通常) 読み込み専用で、稼働中にデータなどが追加されることはありません。そうすることで、プリインストールされたアプリに関しては、/data 以下を無駄にすること無くアプリを実行できるようにしている、ということらしいです。

ですが、.odex ファイルがあれば .apk 内の .dex ファイルが不要になるので、classes.dex ファイルが削除されます。こうなると実行ファイルが存在しないので、.apk だけではインストールすることができません。また、.odex ファイルも Dalvik ごとにことなる (と思う) ので、単純に .apk と .odex を移植しただけではアプリが動作しない場合もあります。


ということで、(やたらと前置きが長くなりましたが) .odex ファイルを .dex に変換し、.apk にまとめる手順です。

用意するのは、元の .apk と .odex (それぞれ aaa.apk と aaa.odex とします)、smali (odex を smali にディスアセンブルする baksmali と、smali を dex にアセンブルする smali)。また、baksmali と smali は java の実行環境が必要です (android SDK が動作する環境があれば OK)。さらに、baksmali を実行する際に .odex の含まれる android 環境の /system/framework 以下の jar ファイルなどが必要になる場合があります。
baksmali の詳しい使い方は、Instructions を参照してください。

まず、baksmali を使い 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 を使い smali 形式から dex ファイルを作成します。
java -jar smali.jar -o aaa.dex out

正常に実行されれば、「aaa.dex」というファイルが作成されます。(-o オプションの引数でファイル名を指定できます)

この 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 に署名が追加されます。

これで、aaa.apk を端末にインストールすることができます。(そのアプリが動作するかどうかは、他に必要なパッケージなどがないかによっても変わります)
スポンサーサイト
Date: 2010.05.12 Category: android  Comments (2) Trackbacks (0)

この記事へのコメント:

seabraves

Date2012.08.22 (水) 14:45:18

初めまして。android機のプリインストールアプリをdeodexしようとご参考に拝見させていただいておりました。smaliファイルの生成まで行きapk managerにて再コンパイル後署名のところで躓いてしまっております。御助言いただけると幸いなのですが

SC3WO06A

Date2012.09.01 (土) 21:53:15

コメントありがとうございます。
しかし、apk manager は使用したことがないので、どんなことに気をつけるか正直わかりません。
エラーメッセージなどは表示されるのでしょうか?それで調べてみると、同じ問題で躓いている方の解決方法が見つかるかもしれません。

管理人のみ通知 :

トラックバック:


最新記事
最新コメント
ウィジェット
月別アーカイブ
カテゴリ
プロフィール

SC3WO06A

Author:SC3WO06A
FC2ブログへようこそ!


検索フォーム
RSSリンクの表示
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。