国際版イメージを導入したSamsung Galaxy Nexus SC-04D で、
ドコモオリジナル機能を有効にした記録。
(要、事前バックアップ)
Android のアプリはDalvik VM という、
低メモリ環境に最適化された仮装マシンで動作する。
Dalvik VM で動くアプリはdex(Dalvik Executable)形式になっていて、
dex を端末に最適化したキャッシュファイルをodex(Optimized -) と言う。
アプリパッケージのapkにdex を含めると、
アプリ動作時にodex ファイルが生成され、odex ファイルが実行される仕組みのようだ。
プリインストールアプリは想定された環境でのみ動作すれば良いので、
apk にdex を含めず、apk+odex 形式で提供される場合が多い。
ところが、ユーザーが端末に手を入れてしまうと、こうしたアプリは途端に動作しなくなる。
そこで、odex からdex を再生成してapk に含めることで、
メーカーが想定した環境以外にもアプリを移植し易くする。(deodex)
事前に準備するもの
前述の通り、odex は環境に合わせて最適化されたファイルなので、
deodex したいアプリのodex とフレームワークのバージョンが異なると、
baksmali がエラーを出して展開できない。
deodex した場合、しない場合を比較すると、以下の特徴がある。
- アプリの移植性が向上する
- 正しくインストールする場合には再署名が必要
- /data/dalvik-cache にodex が生成されるため容量を多く使う
以下は、国際版イメージを適用してドコモオリジナル機能が消えた後で、
バックアップからエリアメールとプッシュ通知マネージャをインストールした際の例。
CWM で/system をマウントして、以下の処理を行う。
まずはプッシュ通知ヘルパーの導入。
adb push MiniDcmWapPushHelper.apk /system/app/
adb shell chmod 0644 /system/app/MiniDcmWapPushHelper.apk
続いて、アプリのdeodex 化と導入。
for app_name in CellBroadcastReceiver WAPPushManager
do
mkdir ${app_name} && cd ${app_name}
cp -p ../../backup-ICL53F/system/app/${app_name}.{odex,apk} .
if [ -f ${app_name}.odex ]; then
java -jar ../../baksmali-1.3.2.jar -a 15 -o out -d ../../backup-ICL53F/system/framework -x ${app_name}.odex
../../smali -a 15 classes.dex out
cp -p ${app_name}.apk ${app_name}.apk.orig
jar uvf ${app_name}.apk classes.dex
rm -f classes.dex ${app_name}.odex
fi
adb push ${app_name}.apk /system/app/
adb shell chmod 0644 /system/app/${app_name}.apk
cd -
done
純正状態と同様にapk+odex で使う場合は、通常起動した後で、
再度CWM を起動し、/system,/data をマウントして以下の処理を行う。
for app_name in CellBroadcastReceiver WAPPushManager
do
cd ${app_name}
adb shell mv /data/dalvik-cache/system@app@${app_name}.apk@classes.dex /system/app/${app_name}.odex
adb shell chown root:root /system/app/${app_name}.odex
adb push ${app_name}.apk.orig /system/app/${app_name}.apk
cd -
done
ゴミ掃除をしたら完了。
という夢を見ました。おわり。
Android Hacks ―プロが教えるテクニック & ツール 株式会社ブリリアントサービス オライリージャパン 2010-09-04 売り上げランキング : 163636 Amazonで詳しく見る by G-Tools |
コメント