1.事前準備
Ubuntu10.04をUbuntuのサイトから落としてVMWare Playerあたりをつかって、まずインストール。10.04からはsun-java6-jdkがaptでとれないので
add-apt-repository "deb http://archive.canonical.com/ lucid partner" sudo apt-get updateコンパイルに必要なパッケージを全部aptで導入する
sudo apt-get -y install git-core gnupg \ sun-java6-jdk flex bison gperf libsdl-devlibesd0-dev libwxgtk2.6-dev \ build-essential zip curl libncurses5-dev zlib1g-devvalgrind g++repoの導入
mkdir ~/bin curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo export PATH=$PATH:~/bin (.bashrcなどに追加しておく) javaへパスを通す export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.**.** repoで取得、toolchainとかも降ってくるから必ず取得しておく repo init -u git://android.git.kernel.org/platform/manifest.git repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1 (2.3用) ※初回のみ repo syncしばらくまつ。。
2.Kernelのソースをダウンロード(for Nexus S)
git clone git://android.git.kernel.org/kernel/samsung.gitKernelのconfig cd samsung make ARCH=arm herring_defconfig (*)make menuconfig ARCH=arm (menuconfigもできるのでいじる人はこれやってもいい) makeする(とりあえず) make ARCH=arm CROSS_COMPILE=/home/creams/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-arch/arm/boot/arch/arm/boot/zImageが作成されていればOK。
3.boot.imgの作成
実機からboot.imgを取り出す。
adb shell su cat /dev/mtd/mtd2 > /sdcard/nexussboot.img exit adb pull /sdcard/nexussboot.img .split_bootimg.plをどこからか探して~/binあたりに保存しておく
$ split_bootimg.pl nexussboot.img Page size: 4096 (0x00001000) Kernel size: 2799472 (0x002ab770) Ramdisk size: 142442 (0x00022c6a) Second size: 0 (0x00000000) Board name: Command line: console=ttyFIQ0 no_console_suspend Writing nexussboot.img-kernel ... complete. Writing nexussboot.img-ramdisk.gz ... complete.カレントにboot.imgとkernelが展開される。consoleの部分を記録しておく。
mkbootimgでboot.imgを作成。zImageは自分でビルドしたもの、ramdiskイメージは、展開して取得したものを指定する。
mkbootimg --cmdline 'console=ttyFIQ0 no_console_suspend' \ --kernel zImage --base 0x30000000 --pagesize 4096 \ --ramdisk boot.img-ramdisk.gz -o myboot.img
myboot.imgがオリジナルのbootimageだ。
実機で試すには、Nexus Sをfastbootモードで起動して、kernelをUSB経由でアップして起動してみる。この方法だと、bootパーティションに書き込まずにテストできる。
adb reboot bootloader fastboot boot myboot.imgこれだと、Wifiが使えないはず(kernelが変更されているので)。SIMが刺さっていればそっちは通信できるはずなので、端末情報あたりを眺めてニヤニヤするw。オリジナルのkernelが適用されていれば、「カーネルバージョン」の項目が、変更されているのがわかる。
ちなみに、username@hostname がバージョン情報に挿入されるので、オリジナルを主張したい人w
は、そのへん気をつけてbuildするといいだろう。
kernelが問題なく動作するようなら、焼きこんでみる。この作業を行う前にかならずbackupなどをとっておこう。思いもしない不具合に出くわすことだってある。
fastbootモードにして、、
fastboot flash boot myboot.imgWifiを動作させるためには、Kernelをbuildしたときに出来ているmoduleに入れ替える必要がある。ファイルの場所は、samsung/drivers/net/wireless/bcm4329にあるbcm4329.ko。これを、実機の/system/modules/に転送する。
adb pull /system/modules/bcm4329.ko . adb shell su mount -o remount,rw -t ext4 /dev/block/platform/s3c-sdhci.0/by-name/system /system もしくは adb remount (unsecureなboot.imgのひとだけ) adb push bcm4329.ko /system/modulesかならずadb pullでバックアップとっておこう。
Appendix
ramdiskを展開して中身をいじるには
mkdir ramdisk cd ramdisk gunzip -c ../ramdisk.image.gz | cpio -iカレントディレクトリに展開されるので、いろいろいじる、前回のext4のオプションもinit.herring.rcあたりに設定しておく。
固める
find . | cpio -o -H newc | gzip > ../new.ramdisk.image.gzで、作成完了。あとはmkbootimgでmyboot.imgを作成して、実機bootしてみる。
こうやって作成したkernelでいまは使ってみている。いまのところ不具合などはないけれど、文鎮化する可能性もあるので、同じことやってみようと思う人自己責任でお願いします。
1 コメント:
ここに記載されている方法と同じようにkernelをビルドしたはずなのに,自分で作成したzImageをmkbootimgの引数に渡すとfastbootモードでbootしたときに,Googleのロゴが出るところまでは行きますが,それより先に進みません.ロゴの出た状態でフリーズしているような感じです.何がいけないのでしょうか?考えられる可能性を教えてください.また,Android内で何が起きているかログを確認する方法はありますか?教えて頂けると幸いです><
コメントを投稿