Androidのkernelをソースからコンパイルしてみる。
mkdir -p ~/bin
curl http://android.git.kernel.org/repo > ~/bin/repo chmod a+x ~/bin/repo
cd ~/android/system
repo init -u git://github.com/CyanogenMod/android.git -b gingerbread repo sync
export CCOMPILER=${HOME}/android/system/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
mkdir -p ~/android/kernel cd ~/android/kernel
git clone git://github.com/CyanogenMod/cm-kernel.git
cd cm-kernel adb pull /proc/config.gz /home/user_name/androkern/cm-kernel/config.gz gunzip config.gz && mv config .config
scripts/extract-ikconfig boot.img > .config
make ARCH=arm CROSS_COMPILE=$CCOMPILER oldconfig もしくは, make ARCH=arm CROSS_COMPILE=$CCOMPILER menuconfig
make ARCH=arm CROSS_COMPILE=$CCOMPILER -j`grep 'processor' /proc/cpuinfo | wc -l`
なぜかこの状態だとwifiが不安定になるらしい。
wifiドライバーをモジュールとしてコンパイルして,それをリンクするようにする。
adb shell mount -o remount,rw /system~ adb shell cp /system/lib/modules/wlan.ko /system/lib/modules/wlan.ko.backup~ adb push wlan.ko /system/lib/modules/wlan.ko~
HT-03AにはFlash ROM上に,以下のようなROMパーテーションが作られている。
cat /proc/mtd dev: size erasesize name mtd0: 00040000 00020000 "misc" mtd1: 00500000 00020000 "recovery" mtd2: 00280000 00020000 "boot" mtd3: 05a00000 00020000 "system" mtd4: 05000000 00020000 "cache" mtd5: 127c0000 00020000 "userdata"
mtd3=/system,mtd4=cache,mtd5=/dataにそれぞれmountされる。
mtd2はboot時使われるファイルで,mtd1はリカバリーモードで使われる。
一応,"recovery"と"boot"をバックアップしておく
#cat /dev/mtd/mtd1 > /sdcard/mtd1.img #cat /dev/mtd/mtd2 > /sdcard/mtd2.img
端末の/system/recovery.imgは,毎回シャットダウンする時にmtd1(recoveryパーテーション)に,自動的に焼かれる。この理由は,
bootイメージは,linuxのブート時に使用されていて,
kernelをコンパイルした後,kernelファイルとこれらのファイルをマージしてboot.imgを作成する。
これをmtd2にflashすると,bootloaderがkernelを起動してくれる。
boot.img用のアンパックとマージには,unpack-bootimg.ziprepack-bootimg.zipを使うことが出来る。
とりあえず今あるboot.imgを分解して,kernelとramdiskにわける。
最初の2kbyteを飛ばして0x1F8B(gzipのヘッダー)を見つける,次の0x1F8Bまでがkernelになる。
その次の0x1F8Bまでがramdiskになる。バイナリエディター等やddなんかで書き出せば取り出せる。ファイルはgzip圧縮されているんで解凍すれば,ramdiskに中にあるファイルを編集できるようになる。
gunzip -c ../your-ramdisk-file | cpio -i
上の,unpack-bootimgを使うほうが簡単だけど・・・
ramdiskを編集したら,コンパイルしたkernelと共に再度パッキングする。
まず,ramdiskをgzipで圧縮する。
find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
新しいkernelとマージする。
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel 新しいkernel --ramdisk newramdisk.cpio.gz -o myboot.img
上の,repack-bootimgを使うほうが簡単だけど・・・
もしくは,split_bootimg.zipも使える。 分解するときは,
% ./split_bootimg.pl boot.img % mkdir ramdisk % cd ramdisk % gzip -dc ../boot.img-ramdisk.gz | cpio -i % cd ..
とやって,作業後マージするには,
% mkbootfs ./ramdisk | gzip > ramdisk-new.gz % mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o myboot.img
でマージする。
新しくコメントをつける