スマホでSMS無しのデータ通信専用SIMを使っているとバッテリーの持ちが極端に悪くなるセルスタンバイ問題。この問題の解消は私がST15iをroot化した目的の一つでした。
この度、ついにST15iのセルスタンバイ問題の解消に成功したので忘れないようにここにメモしておこうと思います。
解決策:
Android端末のframework.jarの中のclasses.dexを適切に弄れば良い
使用したAndroid端末:
root化済みの Xperia mini ST15i
環境/必要なツール:
OS: Ubuntu 14.04.4 LTS
smali/baksmali: v2.1.1
JDK: v1.6.0_38 (OpenJDK)
その他: adb
準備
smali/baksmaliをダウンロード
smali/baksmaliはdexファイルをアセンブル/逆アセンブルするツール。↓からダウンロードできる。
https://bitbucket.org/JesusFreke/smali/downloads
今回ダウンロードしたのは下の4つのファイル。
- smali
- smali-2.1.1.jar
- baksmali
- baksmali-2.1.1.jar
$ mv baksmali-2.1.1.jar baksmali.jar $ mv smali-2.1.1.jar smali.jar
smaliとbaksmali(どちらもバッチファイル)に実行権限を付与しておく。↓こんなふうに。
$ chmod +x smali $ chmod +x baksmali
JDKをインストール
smali/baksmaliを使うためにはJDKが必要なのでそちらもインストールしておく。$ sudo apt-get install openjdk-6-jdk
セルスタンバイ問題解消の手順
Android端末からframework.jarを抽出
ADBを使ってAndroid端末からframework.jarをpullしてくる。$ sudo adb pull /system/framework/framework.jar ./framework.jar※抽出したframework.jarは念の為バックアップを取っておいたほうがいいかも。
framework.jarからclasses.dexを抽出
# jarの中身を閲覧してみる
$ unzip -l framework.jar
Archive: framework.jar
Length Date Time Name
--------- ---------- ----- ----
0 2012-08-28 17:58 META-INF/
71 2012-08-28 17:58 META-INF/MANIFEST.MF
9581924 2012-08-28 17:58 classes.dex
84385 2012-04-18 08:48 preloaded-classes
--------- -------
9666380 4 files
# jarからclasses.dexを抽出
$ unzip framework.jar classes.dex
Archive: framework.jar
inflating: classes.dex
classes.dexを逆アセンブル
baksmaliでclasses.dexを逆アセンブルする。以下のようにbaksmaliを実行するとclasses.dexが逆コンパイルされてclassesというフォルダが出現する。
$ ./baksmali -o classes classes.dex
GsmServiceStateTracker.smali を書き換える
classes/com/android/internal/telephony/gsm/GsmServiceStateTracker.smali を一部書き換える。書き換えポイントは以下の通り。
...
:pswitch_data_22
.packed-switch 0x0
:pswitch_1c
:pswitch_1d
:pswitch_1d ← 1c だったのを 1d に書き換えた
:pswitch_1c
:pswitch_1c
:pswitch_1f
:pswitch_5
:pswitch_5
:pswitch_5
:pswitch_5
:pswitch_1c
:pswitch_5
:pswitch_1d ← 1c だったのを 1d に書き換えた
:pswitch_1c
:pswitch_1c
.end packed-switch
...
classes.dexに再アセンブル
smaliでclassesをアセンブルし直すとclasses.dexが作り直される。$ ./smali -o classes.dex classes
classes.dexをframework.jarに戻す
$ zip framework.jar classes.dex
# ちゃんと戻ったかどうか確認してみる
$ unzip -l framework.jar
Archive: framework.jar
Length Date Time Name
--------- ---------- ----- ----
0 2012-08-28 17:58 META-INF/
71 2012-08-28 17:58 META-INF/MANIFEST.MF
9587192 2016-04-01 22:48 classes.dex
84385 2012-04-18 08:48 preloaded-classes
--------- -------
9671648 4 files
framework.jarをAndroid端末に戻す
$ sudo adb shell # mount -o rw,remount /dev/block/mtdblock0 /system # exit $ sudo adb push framework.jar /system/framework/framework.jar
Android端末を再起動
framework.jarがpushし終わったらAndroid端末を再起動する。ST15iの場合、再起動するとファイルシステムの読み書き権限は自動的に read only に戻されるので手作業で権限を戻す作業などは特に必要ない。
成功!

立った立った、アンテナピクトが立った!(゚∀゚)
これまでは満充電状態でモバイルデータ通信ONのまま一晩寝ると翌朝にはバッテリー残量が10%ぐらいになっていたのですが、これでバッテリーの消耗は減るでしょうか?
レポートは後日。
0 件のコメント:
コメントを投稿