2011年3月16日水曜日

Galaxy S SCH-i909 China Telecom version libjavacore hack.

Droid Xも日本じゃレアだけど、これほどじゃないよって端末のSCH-i909、中身はGalaxyS。
Google関連には一切アクセス不可!!な、CDMA2000端末。
しかもdalvikのlibcoreに仕掛けがあって、IPv6なhostnameのresolvができない。AF_INET固定になっとる。
これは確実に故意に修正されているので、kernelはv6喋れても、名前解決はv4しかできない。

まずSamsungのOpensourceサイトからi909のGPLコードを全部ダウンロードする。zipで1つにまとまって
いるので楽。
#生のエクレアのライブラリと入れ替えるので、おとさなくてもいいけど、kernelビルドしたいとか
#必ずそうなるw。
http://opensource.samsung.com/
SCH-I909_CN_OpenSource.zip
ダウンロード後、libjavacore構成要素である
./dalvik/libcore/luni/src/main/native/java_net_InetAddress.cpp
を見てみる。
static jobjectArray getAllByNameUsingDns(JNIEnv* env, const char* name,
                                         jboolean preferIPv4Stack)
{
    struct addrinfo hints, *addressList = NULL, *addrInfo;
    jobjectArray addressArray = NULL;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_flags = AI_ADDRCONFIG;

モロに、AF_INET指定しとります。Eclairの素のコードではちゃんとAF_UNSPECが指定されている。
これではlibjavacoreを利用するjavaのネットコードからはipv6にアクセスできない。
Eclairのソースをダウンロードして、普通にビルドしたlibjavacoreと入れ替えることにする。
#実際はlibnativehelper.soの入れ替えとなる。
Android 2.1 Eclair
build with jdk1.5
build env  Ubuntu 10.04

repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair

sudo vi /etc/apt/sources.list
以下を追加する

deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

sudo apt-get update
sudo apt-get install sun-java5-jdk

jdk1.6をつかっているのなら、下記のコマンドでjdk1.5へ変更しておく。

sudo update-alternatives --config java
sudo update-alternatives --config javac
ほしいのは下記のスタティックライブラリだが
out/target/product/generic/obj/STATIC_LIBRARIES/libjavacore_intermediates/libjavacore.a
これをつかってビルドされている、shared-libをさがす。
find . -name Android.mk | xargs grep libjavacore
find: `./lost+found': Permission denied
./dalvik/libcore/Android.mk:LOCAL_MODULE := libjavacore
./dalvik/libnativehelper/Android.mk:# Any shared/static libs required by libjavacore
./dalvik/libnativehelper/Android.mk: libjavacore \
というわけで、libnativehelper.so があやしいw.これを単独でビルドできればして
入れ替えてみることにする。といってもjavaにちゃんとパスが通っていれば、Eclairの
ディレクトリでmakeするだけです。

入れ替え手順。
はじめにrootありき。/systemパーティションのなかを入れ替えるので、/systemパーティションを
Read/Writeでマウントしなおす。それからコピー、再起動という感じ。
adb shell
su
mount -o remount,rw /dev/block/stl9 /system
exit
exit

adb push libnativehelper.so /sdcard/
adb shell
su
cd /system/lib
cp /sdcard/libnativehelper.so .
reboot
再起動後にはブラウザでアクセスチェックを行う。pre-installのemaliアプリもサーバアドレスの部分
にIPv6を直接指定してアクセスが可能だった。単純な入れ替えでうまくいったようにみえるが、テストは
ほとんどやってないので、この方法をやって見る人は自己責任でよろしく。

ipv6の環境は、たとえば、feel6等で自宅でトンネル掘ってGlobl V6に接続している人じゃないと
なかなか他にいい方法がない。NTTの光NEXTのv6は外に出れないしね。

次回はkernelビルドと入れ替えまで。

0 コメント:

コメントを投稿