攻撃は最大の防御なり

50代おやじの適当なブログです。

[Android] boot.imgを入れ換えたらwifiが繋がらなくなったんだけど

2011-12-09 09:06:21 | Android
一応、前回で予定していた内容が終わりましたので、これからは好き勝手に書いて行きます。
役に立つかもしれないし、立たないかも知れないw

良くboot.imgを入れ替えたらwifi接続が出来なくなったと言う人がいますが
これは当然と言えば当然です。
wifiモジュールはカーネルビルド時に生成されるもので、必ず対で無ければならないのです。

では、実際に見て行きましょう。
wifiモジュールは/system/lib配下にあります。
HTC Sensationの場合は/system/lib/modulesですね。
adbから下記のコマンドで探す事が出来ます。

find /system/lib -name *ko

こいつのファイル名は端末が使っているwifiチップによって違います。
入っている場所も違うんじゃないでしょうか?

カーネルが実際にどのモジュールを使用しているのか調べるには

lsmod

です。
wifiモジュールはwifi接続を有効にした時だけ動的に読み込まれます。

ここで注意したいのはカーネルがboot.imgに入っているのに対し
モジュールがsystem.imgに入っている嫌らしい構成になっている事です。
仕組みを理解していない人は関連性に気付かず、はまるポイントとなります。
配布する側としても複数のリソースを同時にcommitしなければいけない状態で
悩ましい所となります。

でも、ちょっと待って下さい。
同じ機種でもリージョンが違ったりすると使えなくなる場合がありますよね。
例えばHTC Sensationの欧州版とアジア版の中身なんてそう大した違いは無いはずです。
それでも使えなくなるのは何故なんでしょうか?

Linux version 2.6.35.14-gc0ac669 (alex@alex-linuz) (gcc version 4.4.0 (GCC) ) #24 SMP PREEMPT Sat Sep 10 12:32:05 JST 2011

これは、俺のSensationから

cat /proc/version

を使って取得したカーネルのバージョンです。

これはwifiモジュール/system/lib/modules/bcm4329.koの中身をバイナリエディタで開いてみた所です。



カーネルバージョンの文字列が入っていますよね。
ここの「gc0ac669」の所はマジックナンバーでビルドする度に変ります。
カーネルはこのモジュールに含まれるマジックナンバーを含むカーネルバージョンが合致しているかを確認し
自分用か判別しています。

ちょっとした裏技ですがここのマジックナンバーを書き換えてしまえば正常に動く場合もあります。