Communes

iPhoneのiOS5系の電池がスグ切れる対策

iOS5.0.1なのにスグ減る? アプデはiPhone4や4Sしか効果が出ない?

最近、4S以外にiPhone3GSも4もiOS5.0.1でJBして差分を発見。 いろいろ通説も実証というか分析してみた。 そもそも気になるlocationd(位置測定デーモン)の挙動を見ると、iPhone3GSのベースバンドは06.15.00に対応していない。そこでループがかかるように電池がゲキベリすることは確かのようで、locationdをバイナリでダンプマップで拾っていくと、laoderが見つかるので、ここのバイナリでfixされているplistの中身の onload の値を falseにダンプツールで置き換えると電池が昔のように持つことがiPhone3GSに限りわかった。

ようするにベースバンドが許容外だからダメ。

iPhoneのlocationdの処理パターンは、まず大雑把にA−GPS(アシステッド)によってWifiなどを含めて大まかな位置を探す。なので、iPhone3GSでBBを06.15.00にアップしていても、なぜかGPSアプリを起動した直後は「おおざっぱに合ってる」位置を示してくれる。そして次にサテライト情報にシフトする。自律GPSのこと。ここで重要なのがベースバンドとなる。サテライド自律GPSチップなので、SIMの差込みにはまったく影響しない。

実際に、既に契約が切れていて、SIMを抜いたiPhone3GやBBを06.15.00にしていないG3Sでも、別にSIMの有無に無関係にハンディGPS代わりになる。(自律サテライトGPSが実装されているためである。A−GPSが使われるのは最初のおおざっぱな位置測定までであり、実はここについてはiPhoneはWiFiのAGPSが優先化されているので、AUやドコモのような電波塔のアンテナの3点の距離からの電波強度によるトライアングル測定でケータイのキャリアで位置を出しているわけではない。だからWiFiさえ使える環境なら、機内モードがONでも、iPhoneは問題なく超高速にGPSが使えてしまうわけ。=キャリアからの測定ではない。WiFI測定ができないときはアンテナ塔によるトライアングルに切り替わるが、そこまで数秒の話なので、その前に自律サテライトGPSによる自動測定が処理が終わるので、結局のところSIMキャリアの契約状態に関係なく、iPhoneではいつでもGPSが使えるというわけ。いわゆる自律測定型のハンディGPSを持ち歩いていると思えば良い。)

ところが、BB06.15.00にベースバンドをアップした場合は、サテライトの測定ユニットをコールするところで半永久ループでwaitが連発しているような挙動が起きている。いわゆる無限ループ。つまりCPU負荷も高くなり、電池がどんどん無くなっていく。電源をOFFにしてもクロック割り込みで処理は継続している(バグってる)様子なので、みるみる電池は減るわけだ。

実際に、バイナリでlocationdのplistのローダーのフラグを変えて、サテライトを完全にデーモンレベルでオフにして755パーミッションで再起動させると電池はだんぜん持つようになる。(というか、本来の寿命?)

iOS5がGEOタグ周りやGPSデータベースの周りにテコイレされて電池寿命が改善したというのも、このヘンの挙動の安定化が強化されたものと思われるが、ひとつだけ例外がiPhone3GSのBB06.15.00は逆にローダーで対象に(もともと)なっていないので、電池寿命のバグの対策にはなっていない、ということでいいみたい。(デーモンを書き換えれば電池の寿命が10倍くらいアップするので・・・)

10バイとはとんでもない値だけど、おそらくiPhone3GSをBB06.15.00でiOS5.0.1で使ってらっしゃる人で、もちろんGPSもONでWiFiもON、BlueToothもONで使ってらっしゃる方(すべてGPSに関係する部分)で、かつ位置情報サービスをONにして、まつわるサービス(位置情報によるAd測定・渋滞情報・PING情報)もONにしている「ノーマル利用」の場合は、100%充電から2時間くらいで電池が切れてしまっている人も少なくないと思う。

私がそれ。

よくて3時間・・・・ そしてlocationdのフラグを完全に根で停止させたら、なんと電池の寿命が2日弱もつようになったわけです。正味で36時間くらいですね。

10倍ってこういうこと。(まあ条件とか環境でも違うので、いちがいにこの倍率ではありません。)でも電池交換してもたった+7分くらいしか改善されなかった?というケースは、おそらく電池に問題があったのではなく、こうした問題による「見えない永久ループ」がジワジワとCPU処理を高めて、電池を減らしている、ということでしょう。懐中電灯の電源をOFFにして押入れにいれておいたら、勝手にバグって「ショート」でスイッチが入ってしまい、誰もつかわないときに延々と漏電し続けて、電池がすっからかんに無くなっていた、というようなものと思えば良いでしょう。何度も確認したけど、別に明るくなかったんだけどなぁ・・・ちょっとほんのり暖かかったかも知れないけど・・・みたいな感じ・・・・(例え話ね)

そこで、このままデーモンを書き換えずに対策できないのだろうか?と、電池がもつようにサービスを徹底的に環境設定から不要なものをOFFにしまくってみたわけですが・・・

ダメっぽい・・・

ならば、ロケーションデーモンを普通のデベロッパークラスがバイナリで書き換えるダンプマップまで処理できるとは思えないので(というか、今回の作業も旦那がほとんど作業してたハックの受け売り情報です・・・自分が出来たように書いちゃってますが・・・受け売りです・・・)、JBを使うけど、locationdをフェイクさせてみるという案があるわけです。つまり、iPhone3GSのBB06.15.00のlocationdから、別のGPSドライバーに切り替えてみるわけですね。

そこでオススメなのが、modmyi.comで配布提供されている「GPS serial」というドライバー切り替えツールです。

本来は、本体内蔵GPSモジュールと、ブルートゥースのGPSモジュール、またWiFiのGPSのドライバーの切り替えですが、本体のGPSモジュールの迂回策として利用するわけです。

これで、locationdに手を入れずに、iPhone3GSのBB06.15.00のサテライト自律GPSクラッシュのiOS5.0.1で、バッテリーの激減り対策が可能になります。もっとも全て対応しているわけではないかも知れません。個人の見解なので、参考までにしてくださいね。

インストールした「GPS Serial」を起動すると、GPSドライバーを選択できるようになりますので、iPhoneGPS(本体標準)以外を選べば、本体のlocationd問題の無限ループのバグから開放されます。ただし、この手法ではひとつ問題もあって、「MapFun for iPhone」ではドライバーが見つからなくなり再起動が頻発するようになります。

→ バッテリーは持つようになったけど、GPSアプリを起動すると再起動が多発する

やはりここがiOS5系における「見えない何か」といわれる不明なバグで、電池消耗に負担をかけているのは明らかでしょうね。そこで、BT(ブルートゥース)のGPSドライバーを入れてフェイクしてみました。おすすめは以下の通りです。

http://cydia.xsellize.com/

「LocationHolic」 フェイクなGPSドライバーです。位置測定データではなく、こちらのアプリで登録した位置情報をGPS関連アプリに読み取らせるフェイク位置情報アプリです。

BB06.15.00でバグってしまっているサテライトGPSで、常時毎秒のごとく位置情報を読もうとミスしてリトライが内部で膨大に繰り返されてループに陥って、電源をオフにしてもまったく電池消耗の対策にならないわけですが、そのサテライト情報をフェイクさせることで、GPSアプリのループバグが抑止されるわけです。

電源ボタンでスリープさせときゃいいんちゃうの?

ダメだめ、だってiCloudにもあるように「iPhoneの現在の位置情報」を探す機能が内蔵されています。これをOFFにすれば、旧モバイルミー(現在:iCloudサーバ)に対して、周期的な位置情報データを「送信しなくなる」だけであって、現在の位置情報の「サテライト自律解析」が停止するわけじゃないんですよね。 位置情報サービスを設定からOFFにすれば止まりますが、それでもLoactiondはバックグラウンドで動いたままになっていますので、永久ループのバグが停止するわけじゃない・・・・ 既に常駐ロードされてるデーモンリストをみればわかりますね・・・・ 

もっとも、触らぬ神にたたりなし、で、GPS系やWIFI系をいっさい触れないようにすれば、なんとかなるもんですが・・・・実はiPhoneのWiFiも位置情報には重要なファクターなのでWifiをいじるだけで(繋がるだけで)Loacationdはコールされて永久ループのバグの渦中へ・・・・やっぱだめじゃん。

そこで、フェイク情報で常にGPSドライバー(locatiod)からサテライト位置が返ってきたようにウソをついてあげることで、GPSアプリとlocationdの間の内部やりとりのバグを解消するというわけです。バグるのはlocationdがBB06.15.00のiPhone3GSというものが存在しないことで、デーモンレベルで公式サポート対象になっていないためですね。つまり、サテライト位置を読み出そうとリトライがかかり、永久に返り値が来ることはないので、タイムアウト、コール、解析処理、タイムアウト、ユニットコール、解析処理の繰り返しになるわけです。

http://cydia.xsellize.com/

「LocationHolic」 

これでとりあえず、様子をみてますが、なかなか良い感じみたいです。もっとも環境設定や条件の違いもあるでしょうから、万人に当てはまる対策方法とはいえないですが、ひとつの解決策としてご参考までに。

ちなみにiPhone3Gにfuzzybandを入れて06.15.00のファームウエアを用意して、ネジ2本はずして3GSを分解して、ベースバンドチップを半田でとりだして、3Gに載せかえて、ここでファームウエアをダウングレードして焼きこみなおし、それを3GSへまた換装する、という技もあるそうですが・・・・それは本当の意味で「腕」が必要になりますね・・・・


ここまでの体験談レポートは、充電時間も早くなりましたね。余計なバグデーモンとのやり取りがOS本体サービスとアプリ間での無限ループが開放されて、電池の消耗が抑えられて、結果的にこぼれる水が食い止り、足される水がしっかり溜まる様になったといった感じですね。


その後のその後、いろいろiFileからiOS5.0.1コアのlaunchDaemonsのplistを変更してみました。locationdの読み込み周り。

/System/Library/LaunchDaemons/
com.apple.locationd.plist ですね。

結論は、デーモンのバイナリ自体がBB06.15.00によって対応していないので、plistでRunAtLoadフラグやオンデマンドやKeepAlive SuccessfulExitなどをいじって再起動しても効果なし。MachServicesも同じ・・・・4つ選択があるけど、あくまでもBB06.15.00ではアウト・・・ むしろ、ここをいじると他の整合性でマイナス要素が多くなり、全体が重くなる。(再起動や終了など)

そういえば、「LocationHolic」 はmodmyi.comで配布されているので、そちらに乗り換えてみる。xsellizeは嫌い、不安定だから嫌だ、という人のための措置みたいな。いや、個人的にはどっちでもいいんですけどね。使えれば。xsellizeのホリックはちょっと不安定な面もあるので・・・・2度目の起動でアプリが再起動になる。

Cydiaで検索で「locationHolic」で見つけましょう。from modmyi.comの方ね。(でも、どっちも同じように堕ちますね・・・)



Copyright (C) 2024 Communes ™ All Rights Reserved.