2016年4月2日土曜日

[Android] Xperia mini ST15iのセルスタンバイ問題を解決する方法 on Ubuntu



スマホで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
smali-2.1.1.jar は smali.jar に、 baksmali-2.1.1.jar は baksmali.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 件のコメント:

コメントを投稿