Xperia arc (SO-01C)をセットアップ - アンテナピクト表示改善(セルスタンバイ問題)

Screenshot_2013-03-17-02-f23-20

前回まででarcのICS化+Root化+中華フォント置き換えまではやりました。

これで完了・・・と思いきや、まだやることがあります。アンテナピクト表示改善です。

セルスタンバイ問題とは何か?

MVNOのSIMカードのような、データ通信のみが許可されたSIMカードを挿すと、アンテナピクト(上記画像のような、電波受信状態を表示するアイコン)がずっと圏外状態のままになってしまう端末がある。

ちなみに、Xperia ray、arcはどちらもdocomo提供のファームウェア(ROM)だとアンテナピクトが正常に表示されているが、海外ROMを適用するとアンテナピクトが常に圏外になってしまった。ただし、データ通信ピクト(Hと矢印のマーク)は表示された。

別にいいよ、どうせdocomo電波なら日本にいる限り大体圏内っしょ、使わないよ・・・と思いきや、そうも言っていられない問題があって。それがセルスタンバイ問題(バッテリードレイン)である。

セルスタンバイとはなんぞや?というと・・・。Androidの設定→電池と進むとセルスタンバイというのが出てくる。

Screenshot_2013-03-17-17-50-19

CellphoneがStandbyしてるときに消費してる電力、すなわち、セルスタンバイだと思う。セルってCellphoneのCellだと思うけどな。間違ってたらごめん。

こいつが何なのかというと、スタンバイ時に放出している3G回線向けの電波に費やされた電力の消費量を表しているらしい。スタンバイ中に放出する電波とはなんぞや?と言うと・・・。

これはガラケーでもそうだが、圏外だと異常に早く電波が減る。これは、圏外のときに頻繁に電波を放出しているからである。携帯電話は持ち歩くものなので、キャリアはある携帯電話がどの基地局の圏内にいるのかを常に把握している必要がある。でないと、電話回線をつなぎに行くことが出来ない。だから携帯電話端末は、自分の位置を基地局に伝える(=自端末を最寄りの基地局にひもづける)ために定期的に電波を放出している。

で、圏外になるとどうなるか?電波を頻繁に放出して自分が居る基地局に自分の存在を伝えようとがんばり始める。結果として電波が頻繁に放出されるので、電池が急速に減る(バッテリードレイン)、と、こういう訳ですね。

電波状態の表示くらいなら我慢できますが、電池がすぐに無くなってしまうのは困りますよね。ただでさえ、スマホの電池は持たないと言われているのに、です。

なぜデータ通信のみのSIMカードだとアンテナピクト表示が異常になるのか?

と言う問題は、(ほぼ)本職であるIIJの中の人のブログ「アンテナピクト問題・セルスタンバイ問題とは何か」に詳しい。とても分かりやすい文章で、かつ、興味深い内容が綴られているので是非ご一読いただきたい。

かいつまんで話すと、現在の3G回線網(W-CDMA)には電話用の回線交換ドメイン(CS)と、その他データ通信用のパケット交換ドメイン(PS)が規定されているそうです。

で、問題が起きるSIMカードはパケット交換用のドメインへの登録(僕はここにいるよ宣言)は許可されているが、回線交換用のドメインへの登録は許可されていないそうです。ドコモのCS網に対して「僕はここにいるよ!」と叫んでも、ドコモは「ああ?何か幻聴がきこえるなあ」とか言ってる。みたいな感じ。

しかもこれ、ムカつくのはドコモの1500円データ通信SIMだと許可されているそうなのです。意味わかんねえなあ。ちなみに、この、許可・非許可はパソコンにUSB接続のデータ通信端末を刺して、仮想シリアルポートに接続して特定のATコマンドを打つと分かるそうです。

それで、なぜ現象が発生する端末とそうでない端末があるのか?言い換えれば、なぜdocomo謹製ファームウェアだとアンテナピクトが正常表示されるのに海外ROMだと表示されないのか?というと、前述のブログでは国内ベンダーがそういう風に作っているとしか思えない、という結論に達している。以下、引用。

さて、Androidのソースコードから「なにか怪しい」雰囲気までは感じられました。しかし、市販のAndroidスマートフォンでは前述の通り、問題が起こらない端末もあります。いったいどういうことでしょうか。

これはもう、端末を開発したメーカーがAndroidのソースに手を加えているとしか考えられません。実際、市販の端末で国内のサービスに対応するためにメーカー毎にあちこち手が入っていますので、無線部分についても何らかの修正が行われているのでしょう。

ということは、言い換えればソースコード(もしくはソースコードに準じた設定ファイル)をいじれば改善可能ということです。まあ、そんなの当たり前ですが。で、さらに重要なのは、これはそれなりに簡単にできてしまうということですね。

やってみる

やってみましょう。繰り返しますと、ここで述べる操作をするとアンテナピクト問題が改善されます。Xperia arc向けではなく、おそらくどの端末でも通用する方法だと思います。rayも同様の方法で動作したのは確認しました。

用意するもの

  • smali
  • baksmali
  • dexopt-wrapper.zip
  • 7-zip圧縮・解凍環境
  • Android SDKとデバッグ環境
  • Java (JRE)

smaliとbaksmaliは公式のツールです。こちらからダウンロードできます。

smali - An assembler/disassembler for Android's dex format

これはdexフォーマットと呼ばれるdalvik(AndroidアプリのVM)が読み込むアセンブリを分解したりくっつけたりするツールらしいです。上記のサイトを読むと書いてますが、smaliとbaksmaliはアイスランド語でassembler/disassemblerを意味するらしいです。なぜアイスランド語?というと、dalvikがそもそもアイスランドの村の名前から取ってるかららしいです。へー。そうなんだ。こういうの好き。

バージョンは現時点での最新1.4.2を使いました。

dexopt-wrapper.zipは、jarをodexフォーマットに変換してくれるソフトだそうです。googleでファイル名を検索すればダウンロード先が出てくると思います。

7-zip圧縮・解凍環境は何でも良いです。適当なソフトを入れといて下さい。

Android SDK環境は入れたりパス通したりするのが面倒なので、何かのツールに付属しているadb.exeとAdbWinUsbApi.dllとAdbWinApi.dllを引っ張ってくれば良いと思います。私はRoot化ツールに付属していたものを流用しました。

Javaのバージョンは何でも良いと思います。私は7でした。

ちなみに、以下のサイトで同現象を改善するパッチ(パッチというかバッチのツール)を配布していますが、私の環境では「deodexじゃないから無理」とかいうメッセージが出てきて動きませんでした。どうも、ICSはdeodexでないのでダメらしいです。odexとdeodexがなんなのかはよく分からない・・・。勉強中です。

Android + データ専用 SIM での動作修正パッチ

やりましょう

当然ですが、CWMなどでバックアップを取った後でやって下さい。

まず、適当なフォルダを作って下さい。そんで、コマンドプロンプトを立ち上げ、その適当に作ったフォルダにcdします。ここで、adbのパスは通しておいて下さい。(adb.exeを適当に作ったフォルダに入れておいて下さい)

以下のコマンドを打って、/system/frameworkを丸ごと引っ張ってきます。

adb pull /system/framework framework

次に、smali、baksmaliを解凍して出てきたjarファイルをframeworkフォルダに入れます。frameworkフォルダ内で実行しないとクラスパスが通らないとか怒られるので注意。

で、baksmaliします。

java -jar baksmali.jar -c:core-junit.odex -x framework.odex

すると、framework/outというディレクトリができて、disassembleされたファイルがごろごろと出てきます。その中の、

out\com\android\internal\telephony\gsm\GsmServiceStateTracker.smali

をテキストエディタで編集します。packed-switch 0x0などでキーワード検索すると、以下のような行が出てきます。

    :pswitch_data_22
    .packed-switch 0x0
        :pswitch_1c
        :pswitch_1d
        :pswitch_1c
        :pswitch_1c
        :pswitch_1c
        :pswitch_1f
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_1c
        :pswitch_5
        :pswitch_1c
        :pswitch_1c
        :pswitch_1c
    .end packed-switch

これを次のように編集して保存します。どうも、設定フラグをいじっている・・・ような気がしますが、何やってるのか私もよく分かりません。

    :pswitch_data_22
    .packed-switch 0x0
        :pswitch_1c
        :pswitch_1d
        :pswitch_1d ←ここ
        :pswitch_1c
        :pswitch_1c
        :pswitch_1f
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_1c
        :pswitch_5
        :pswitch_1d ←ここ
        :pswitch_1c
        :pswitch_1c
    .end packed-switch

編集したら、frameworkの下でsmaliして元に戻します。

java -jar smali.jar -a 15 -o classes.dex out

-aオプションはAPIバージョンです。ICS 4.0.3以降なら15、ICSの4.0.3より前なら14らしいです。詳しくは調べて下さい。

で、smaliしてできあがったclasses.dexを、framework/framework.jarの直下に入れます。framework.jarは7-zip形式の圧縮ファイルになっています。また、ここでdexopt-wrapperを解凍します。ELF形式のバイナリが出てきます。

framework.jarとdexopt-wrapperを/data/loca/tmpにコピーします。(どこでも良いと思いますがここが一時ファイルを置くディレクトリのようです)

 adb push framework.jar /data/local/tmp/framework.jar
 adb push dexopt-wrapper /data/local/tmp/

そしたら、adbからshellを開き、dexopt-wrapperに実行権限をつけ、jarをodexに変換します。ここからLinuxなので実行するときは./を付けてね。

 adb shell
 cd /data/local/tmp/
 chmod 755 dexopt-wrapper
 ./dexopt-wrapper framework.jar framework.odex

次に、入れ替えもとのファイルから署名部分をddでコピーします。

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

ddでコピーしてOKとか、それで署名の意味があるのか!?ファイルのダイジェストを取るんじゃないの!?と突っ込みたくなりますが、これで良いみたいです。もしかしたらこのファイル自体の署名じゃなくて、他のファイルを認証する署名なのかも?よく分からない・・・。

で、あとはこれを入れ替えます。

su
mount -o remount,rw /dev/block/mtdblock0 /system
cp /data/local/tmp/framework.odex /system/framework/
sync
reboot

リブートしたら、CWMなどでdalvikキャッシュをクリアして下さい。

これで終わりです。お疲れ様でした!!

Screenshot_2013-03-17-17-50-19

セルスタンバイ7%が多いのか少ないのか分かりませんが、ちゃんと改善されている気がします。アンテナピクトはちゃんと動作しています。

Screenshot_2013-03-17-19-38-44

よく見ると、圏外時間0%なので、まあ、ちゃんと動作しているんでしょう。たぶんね。

1件のコメント

  1. [...] >>Xperia arc (SO-01C)をセットアップ – アンテナピクト表示改善(セルスタンバイ問題) | anopara Author: [...]

ただいまコメントは受け付けていません。