sohatach's blog

http://github.com/soha

公式Factory ImageのAndroid 4.1.2のGALAXY NEXUSのセルスタンバイ問題対策

・アンテナピクト問題・セルスタンバイ問題とは何か
http://techlog.iij.ad.jp/archives/487
何が問題かについて、こちらで詳しく解説していただいています。
要するにデータ通信専用のSIMでは、常時圏外扱いとなり基地局を探すためバッテリがすぐ無くなってしまうようです。
そのためAndroidOS側を少しいじり圏外扱いにならないようにします。

手順については以下のサイトを参考にさせていただきました。
Android + b-mobile データ専用 SIM で電界強度を表示する
http://bl.oov.ch/2012/01/b-mobile-sim.html

Googleが提供している公式Factory Image
https://developers.google.com/android/nexus/images
は、odex化という端末に最適化した形式になっているため、今回はこちらの手順が該当します。
・ICS for S51SEセルスタンバイ対策(処理モード1)
http://430fx.cocolog-nifty.com/blog/2012/07/ics-for-s51se-b.html

・キャリア提供アプリのdeodex化とodex化
http://blog.livedoor.jp/yasuhide_t/archives/5506120.html



事前準備

  • clockworkリカバリ(recovery-clockwork-5.5.0.2-maguro.img)が端末で起動可能なこと。
  • 端末にbusyboxがインストールされていること。(端末側で事前にGoogle Playからインストールしておく)

busyboxインストールのためroot化が(多分)必要。

clockworkリカバリで端末を起動する。
clockworkを使い、端末側で/systemをmountする。/dataもmountする。
adbで接続できること。

baksmaliでframework.odexの中身をoutフォルダに展開する。

mkdir framework
adb pull /system/framework framework
cd framework
java -jar ..\baksmali-1.4.0.jar --api-level 16 -x framework.odex

outフォルダが作られる。

/framework/out/com/android/internal/telephony/gsm/GsmServiceStateTracker.smaliをエディタで編集する。
圏外でも圏内と認識させるようになるようです。

> :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_1c
> :pswitch_1d ←ここ
> :pswitch_1c
> :pswitch_1f
> :pswitch_5
> :pswitch_5
> :pswitch_5
> :pswitch_5
> :pswitch_1c
> :pswitch_5
> :pswitch_1c
> :pswitch_1d ←ここ
> :pswitch_1c
> .end packed-switch
と書き換える。

smaliでclasses.dexにまとめる。

java -jar ..\smali-1.4.0.jar --api-level 16 -o classes.dex out

cleasses.dexができる。odex化していないカスタムOSなどであればこれがそのまま使えるはず。

odex化したframework.odexを生成する。
framework下のframework.jarを展開し、生成したclasses.dexを入れて再度zip圧縮しframework.jarを作り直す。

mkdir work
cp framework.jar work
cp classes.dex work
cd work
unzip framework.jar
古いファイル削除しておく。
rm framework.jar
work下のファイルをまとめてzip化し、framework.jarというファイル名にする。

生成したframework.jarを端末にコピーする。まずは/data/local/tmpにでも入れる。

adb push framework.jar /data/local/tmp

dexopt-wrapperも端末にコピーする。

cd ..\..
adb push dexopt-wrapper /data/local/tmp
adb shell
chmod +x /data/local/tmp/dexopt-wrapper

adb shellで端末に繋ぎ、framework.jarをodex化する。

adb shell
cd /data/local/tmp
export BOOTCLASSPATH=/system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar
./dexopt-wrapper framework.jar framework.odex ←これがうまくいかないっぽい。コマンドが古い?

結局生成した/system/framework/framework.jarにコピーし、端末側でodexファイルを生成させる。

/system/framework/framework.odexを削除した状態で端末を起動し、しばらく待つとフリーズしたままだが、
/data/dalvik-cache/にsystem@framework@framework.jar@classes.dexが生成される。
このファイルをリネームし、framework.odexとして使う。
cp framework.odex framework.odex.new

framework.odexができる。successとなっているのを確認すること。

動作させるには署名を書き換える必要があるとのことなので、既存のframework.odexの書名部分をコピーする。

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

cd /system/framework
cp framework.odex framework.odex.bak
cp /data/local/tmp/framework.odex.new framework.odex
sync
reboot

clockworkからDalvik Cacheをwipeする。
端末を再起動後、IIJmioのSIMで、アンテナ表示及び「設定」->「電池」から圏外となっていないことを確認しました。