ブローヴちゃん: Nexus5 と Android 4.4 でのセルスタンバイ問題についてが気になったのでやってみた。
前提条件
ダウンロード
- ClockworkMod Recovery(例:recovery-clockwork-6.0.4.5-hammerhead.img)
- smali(例:smali-2.0.5.jar)
- baksmali(例:baksmali-2.0.5.jar)
- 7-Zip Extra(コマンドラインバージョンに含まれる7za.exeが必要)
AndroidのSDK Toolsをインストールしたフォルダのplatform-toolsフォルダにあるadb.exe、AdbWinApi.dll、AdbWinUsbApi.dll、fastboot.exeと、build-toolsフォルダ内にあるzipalign.exeを上記ファイルと同じフォルダに用意しておく。
変更手順
- Nexus 5の電源を切ってから、音量(下)を押しながら電源を押し続けてStartが出たら手を離してPCとUSB接続する
- ダウンロードで準備したファイル群のあるフォルダでコマンドプロンプトを開いて「fastboot boot recovery-clockwork-6.0.4.5-hammerhead.img」でCWMリカバリを焼かずに起動する
- CWMが起動したら「mounts and storage」→「mount /system」→「+++++Go Back+++++」で/systemをマウントする
- 「adb pull /system/framework/telephony-common.jar」でtelephony-common.jarをバックアップする
- 「adb pull /system/framework/telephony-common.odex」でtelephony-common.odexをバックアップする
- 「adb shell rm /system/framework/telephony-common.odex」でtelephony-common.odexを削除する*1
- 「7za x -otmp telephony-common.jar」でtelephony-common.jarをtmpフォルダに解凍する*2
- 「java -jar baksmali-2.0.5.jar -x telephony-common.jar」でtelephony-common.jarを逆アセンブルしてソースをoutフォルダに作成する*3
- outフォルダのcom→android→internal→telephony→ServiceStateTracker.smaliをメモ帳など適当なエディタで開き、「useDataRegStateForDataOnlyDevices()」で検索して、さらに「if-nez」で検索した箇所の「if-nez」を「if-eqz」に書き換えて保存する
- 「java -jar smali-2.0.5.jar out -o tmp\classes.dex」でoutフォルダのソースをアセンブルしてtmpフォルダのclasses.dexを上書きする*4
- 「7za a -tzip telephony-common_tmp.jar .\tmp\* -mx9」でtmpフォルダをzip形式の圧縮レベル9(超圧縮)で圧縮してjarファイルを作成する*5
- 「zipalign -f 4 telephony-common_tmp.jar telephony-common_new.jar」でjarファイル内を32ビット(4バイト)単位となるように位置合わせを行う*6
- 「adb push telephony-common_new.jar /system/framework/telephony-common.jar」で位置合わせを行ったjarファイルをtelephony-common.jarに上書きする
- 「adb shell chmod 644 /system/framework/telephony-common.jar」でtelephony-common.jarのパーミッションを644に設定する*7
- CWMから「reboot system now」→「No」で再起動する
復旧手順
- Nexus 5の電源を切ってから、音量(下)を押しながら電源を押し続けてStartが出たら手を離してPCとUSB接続する
- ダウンロードで準備したファイル群のあるフォルダでコマンドプロンプトを開いて「fastboot boot recovery-clockwork-6.0.4.5-hammerhead.img」でCWMリカバリを焼かずに起動する
- CWMが起動したら「mounts and storage」→「mount /system」→「+++++Go Back+++++」で/systemをマウントする
- 「adb push telephony-common.jar /system/framework/telephony-common.jar」でtelephony-common.jarを元に戻す
- 「adb push telephony-common.odex /system/framework/telephony-common.odex」でtelephony-common.odexを元に戻す
- 「adb shell chmod 644 /system/framework/telephony-common.jar」でtelephony-common.jarのパーミッションを644に設定する
- 「adb shell chmod 644 /system/framework/telephony-common.odex」でtelephony-common.odexのパーミッションを644に設定する
- CWMから「reboot system now」→「No」で再起動する
*1:削除することで今回書き換えるtelephony-common.jarからodexがキャッシュに作成されて使用される
*2:上手く行かない場合は予めtmpフォルダを作成したり、末尾に-rオプションを追加する、尚-oオプションの後ろはスペースを空けてはいけない
*3:上手く行かない場合は-xオプションに続けて-lオプションも指定する
*4:上手く行かない場合は-jarオプションの前に-Xmx512Mオプションを付加する
*5:上手く行かない場合は末尾に-rオプションを付ける、圧縮レベルは任意で良いかも知れない
*6:もしかしたら、この処理は無くても大丈夫かも知れない
*7:これを忘れるとブートアニメーションのままループしてしまう可能性が大