前回の記事ではアプリのdeodex を実施したが、今回はフレームワーク自体のdeodex を行う。
セルスタンバイがバッテリーを消費する問題を解決するのに有用な手段らしく、
自動化スクリプトを公開している人もいるようだ。
Android + データ専用 SIM での動作修正パッチ

Google 純正イメージはフレームワークがodex 提供のため、スクリプトでは設定できない。
スクリプトの処理を参考に、手動で変更する。

  1. 必要なプログラムの準備

    以下のプログラムを準備する。

    ディレクトリ構造は以下のようにした。

    展開 | 折畳
    • ~/androdev/
      • smali-1.3.2.jar
      • baksmali-1.3.2.jar
      • recovery-clockwork-5.5.0.2-maguro.img
      • work
        • busybox
        • MiniDcmWapPushHelper.apk
        • CellBroadcastReceiver.apk
        • WAPPushManager.apk
        • CellBroadcastReceiver/
          • CellBroadcastReceiver.apk
          • CellBroadcastReceiver.odex
          • out/
            • ...
        • WAPPushManager/
          • WAPPushManager.apk
          • WAPPushManager.odex
          • out/
            • ...
        • framework/
          • framework.odex
          • framework.apk
          • classes.dex
        • system/
          • framework/
            • framework.odex
            • framework.apk
            • ...
      • backup/
        • ICL53F_SC-04D/
          • boot.img
          • cache.ext4.tar
          • data.ext4.tar
          • nandroid.md5
          • system.ext4.tar
          • recovery.img
        • IMM76D_SC-04D/
          • boot.img
          • cache.ext4.tar
          • data.ext4.tar
          • nandroid.md5
          • system.ext4.tar
          • recovery.img
        • TitanumBackup_SC-04D/
          • ...
        • radio_SC-04D/
          • SC04DOMKKD.img
          • SC04DOMLA1.img

    以下は、Android SDK にパスが通っており、ブートローダーロック解除済みで、CWM 起動ができる前提の手順。

  2. フレームワークをdeodex 化する

    1. 作業用ディレクトリを作成する

      mkdir ~androdev/work/system
      mkdir ~androdev/work/framework
      
    2. バックアップからapk, odex をコピーする

      tar xf ~androdev/backup/IMM76D_SC-04D/system.ext4.tar system/framework -C ~androdev/work/system/
      cp ~androdev/work/system/framework/framework.{odex,apk} ~androdev/work/framework/
    3. フレームワークのodex を展開する

      cd ~androdev/work/framework/
      java -jar ~/androdev/baksmali-1.3.2.jar -a 15 -d ~/androdev/work/system/framework -c:core-junit.odex -x ~/androdev/work/framework/framework.odex
    4. smali ファイルを書き換える

      cd ~androdev/work/framework/out/
      
      --- com/android/internal/telephony/gsm/GsmServiceStateTracker.smali.orig   2012-04-12 19:46:32.000000000 +0900
      +++ com/android/internal/telephony/gsm/GsmServiceStateTracker.smali        2012-04-12 16:36:44.000000000 +0900
      @@ -3634,7 +3634,7 @@
               :pswitch_1c
               :pswitch_1d
               :pswitch_1c
      -        :pswitch_1c
      +        :pswitch_1d
               :pswitch_1c
               :pswitch_1f
               :pswitch_5
      @@ -3644,7 +3644,7 @@
               :pswitch_1c
               :pswitch_5
               :pswitch_1c
      -        :pswitch_1c
      +        :pswitch_1d
               :pswitch_1c
           .end packed-switch
       .end method
      
    5. framework.jar のdeodex 化

      cd ~androdev/work/framework/
      java -jar ~/androdev/smali-1.3.2.jar -o classes.dex out
      zip framework.jar classes.dex
  3. 作成したファイルを端末に転送する

    1. 端末にbusybox とframework.jar を転送

      adb push ~/androdev/work/busybox /data/
      adb push ~androdev/work/framework/framework.jar /data/
      adb shell mv /system/framework/framework.jar /system/framework/framework.jar.orig
      adb shell mv /system/framework/framework.odex /system/framework/framework.odex.orig
      adb shell mv /data/framework.jar /system/framework/framework.jar
      adb shell chmod 4755 /data/busybox
      adb shell chmod 0644 /system/framework/framework.jar
    2. キャッシュクリア

      "Wipe cache partition"
      "advanced" → "Wipe Dalvik Cache"
    3. 通常起動してdalvik-cache にodex を生成する

      adb reboot

      framework.odex をリネームしているので、/data/dalvik-cache/system@framework@framework.jar@classes.dex が生成される。
      しかし、このodex はフレームワークの署名と異なるため、起動しない。
      この状態で暫く放置するとadb によるコマンド操作を受け付ける。

  4. 元のframework.odex の署名を書き込む

    1. adb が利用可能になったらCWM を起動する

      adb reboot bootloader
      fastboot boot ~/androdev/recovery-clockwork-5.5.0.2-maguro.img
    2. /system,/data をマウントする

      "mounts and storage" →
        "mount /system"
        "mount /data"
    3. dalvik-cache のdex ファイルをframework.odex としてコピーする

      mv /data/dalvik-cache/system@framework@framework.jar@classes.dex /system/framework/framework.odex
    4. framework.odex に、framework.odex.orig 署名を付ける

      /data/busybox dd if=/system/framework/framework.odex.orig of=/system/framework/framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

      busybox のdd で操作すること。システムのdd では、conv=notrunc が通らない

    5. apk を元に戻す

      署名済みodex が生成できたので、dalvik-cache に出力しないようframework.jar を元に戻す。

      mv /system/framework/framework.jar.orig /system/framework/framework.jar
    6. /system,/data をアンマウントする

      "mounts and storage" →
        "unmount /system"
        "unmount /data"
  5. 通常モードで起動を確認する

    adb reboot