素直にビルドしてSD起動してみる
これの続き。
http://d.hatena.ne.jp/kinneko/20120614/p7
ビルド済みのSD用環境からの起動はうまくいったので、こんどは素直に自前ビルドする環境で試す。
基本は、"How_to_build.txt"の通り。
ビルド済みをoutにコピーしたのは消しておく。
toolchainの準備
toolchainは、android_20110930.tar.bz2の中のを使えと書かれている。
$ tar jxvf android_20110930.tar.bz2
mydroidというディレクトリが展開された。
toolchainはこのへん。
ubootのビルド
アーカイブを展開する。
$ tar jxvf u-boot_20110930.tar.bz2 $ cd u-boot/
u-bootのビルドスクリプトは、"build_all.sh"が用意されている。
$ cat build_all.sh #!/bin/sh set -x -e OUT_DIR=../out export LANG=C export ARCH=arm #export CROSS_COMPILE=${PWD}/../cross/arm-2009q3/bin/arm-none-linux-gnueabi- export CROSS_COMPILE=${PWD}/../mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- mkdir -p ${OUT_DIR} || true make distclean make emev_kzm9d_config make mv u-boot.bin ${OUT_DIR} make distclean make emev_kzm9d_emmc_config make mv u-boot-emmc.bin ${OUT_DIR} make distclean make emev_kzm9d_sd_config make mv uboot-sd.bin ${OUT_DIR} mv sdboot.bin ${OUT_DIR}
元は、arm-2009q3でビルドされてたのね。
環境変数をセットし、emev_kzm9d_config, emev_kzm9d_emmc_config, emev_kzm9d_sd_configで順に3回ビルドして、成果物をoutディレクトリに入れている。
このままやる。
u-boot$ ./build_all.sh
なんか、ワーニングがいくつか出ていますが、気にしなくてよさそう。
u-boot$ ls -l ../out/ total 376 -rwxr-xr-x 1 kinneko kinneko 8192 Jun 18 16:48 sdboot.bin -rw-r--r-- 1 kinneko kinneko 131692 Jun 18 16:48 u-boot-emmc.bin -rwxr-xr-x 1 kinneko kinneko 114040 Jun 18 16:47 u-boot.bin -rw-r--r-- 1 kinneko kinneko 123232 Jun 18 16:48 uboot-sd.bin u-boot$ cd ..
できた。
kernelのビルド
mkimageはビルド環境に導入済みなので新たに入れない。
あれ?でも、これってAndroidのprebuildに入ってなかったっけ?
$ find mydroid/ | grep mkimage
なかった。残念。
アーカイブを展開する。
$ tar -jxvf kernel_20111018.tar.bz2 $ cd kernel/
kernelのビルドスクリプトも用意されている。
特に変更点はないので、そのまま使う。
kernel$ cat build.sh #!/bin/sh set -x -e OUT_DIR=../out export LANG=C export ARCH=arm #export CROSS_COMPILE=${PWD}/../cross/arm-2009q3/bin/arm-none-linux-gnueabi- export CROSS_COMPILE=${PWD}/../mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- mkdir -p ${OUT_DIR} || true make distclean make kzm9d_defconfig make -j8 cp arch/arm/boot/uImage ${OUT_DIR}
kzm9d_defconfigでビルドして、outにコピーしている。
ビルドは8並列が指定されている。
ビルドマシンは12並列くらいは楽にできるのだが、これもこのままやる。
実行する。
kernel$ time ./build.sh (snip) Image arch/arm/boot/uImage is ready + cp arch/arm/boot/uImage ../out real 0m48.889s user 4m0.730s sys 0m18.130s
はや!
kernel$ ls -l ../out/uImage -rw-r--r-- 1 kinneko kinneko 4128768 Jun 18 17:00 ../out/uImage kernel$ cd ..
4Mくらい。
PARTNER-Jetを使うときには、別に入っている"patch-linux-2.6.35-kzma9d-20110930"を適用しておく。
Android userlandのビルド
ビルド環境には、Gingerbreadがビルドできる環境は揃っている。
JDK6が指定されているけど、大丈夫かな?
Gingerbreadって、JDKどっちが標準だったっけ... 忘れたわ。
$ javac -version javac 1.6.0_26
とりあえず、いまは1.6入っているから問題なさそう。
androidのアーカイブの展開は、toolchainに必要だったから、最初にやってしまった。
$ cd mydroid/
まずは、kernel headerといくつかのオブジェクトファイルをコピーするスクリプトを実行する。
mydroid$ cat cp_kernel_files.sh #!/bin/sh set -x -e WORK_DIR=.. ANDROID_DIR=. mkdir -p ${ANDROID_DIR}/device/kmc/kzm9d/modules/ cp -p ${WORK_DIR}/kernel/arch/arm/mach-emxx/inter_dsp.ko ${ANDROID_DIR}/device/kmc/kzm9d/modules/ cp -p ${WORK_DIR}/kernel/arch/arm/mach-emxx/pwm.ko ${ANDROID_DIR}/device/kmc/kzm9d/modules/ cp -p ${WORK_DIR}/kernel/drivers/ave/em_ave.ko ${ANDROID_DIR}/device/kmc/kzm9d/modules/ cp -p ${WORK_DIR}/kernel/arch/arm/mach-emxx/include/mach/inter_dsp_ioctl.h ${ANDROID_DIR}/bionic/libc/kernel/common/linux/ cp -p ${WORK_DIR}/kernel/include/linux/ave_common_info.h ${ANDROID_DIR}/bionic/libc/kernel/common/linux/ cp -p ${WORK_DIR}/kernel/arch/arm/mach-emxx/include/mach/fbcommon.h ${ANDROID_DIR}/bionic/libc/kernel/common/linux/ cp -p ${WORK_DIR}/kernel/include/linux/videodev2.h ${ANDROID_DIR}/bionic/libc/kernel/common/linux/ cp -p ${WORK_DIR}/kernel/arch/arm/mach-emxx/include/mach/buslim.h ${ANDROID_DIR}/bionic/libc/kernel/common/linux/
ドライバ類は、内蔵DSP、パワーマネジメント、av、そしてそれらようのヘッダをkernelツリーからコピーしている。
あとは、makeしてアーカイブをまとめるだけか。
環境設定とかはやらなくていいのか?
まぁ、いいか。
このままやってみる。
mydroid$ make -j12 2>&1 |tee make.log
あ、時間はかるの忘れた。
んー、思ったより時間かかっているな。
普通、ICSに比べたら、Gingerbreadなど一瞬だろうに。
Created filesystem with 532/8192 inodes and 19855/32768 blocks Install system fs image: out/target/product/kzm9d/system.img Installed file list: out/target/product/kzm9d/installed-files.txt DroidDoc took 84 sec. to write docs to out/target/common/docs/doc-comment-check
終わった。
あれ、system.imgって普通にできているのね。
mydroid$ ls -l out/target/product/kzm9d/*.img -rw-r--r-- 1 kinneko kinneko 399403 Jun 18 17:19 out/target/product/kzm9d/ramdisk.img -rw-r--r-- 1 kinneko kinneko 81331844 Jun 18 17:22 out/target/product/kzm9d/system.img -rw-r--r-- 1 kinneko kinneko 7786860 Jun 18 17:18 out/target/product/kzm9d/userdata.img
つーことはビルドスクリプトはいじってないってことか。
これ、このまま動かせたらいいなぁ。
SDに生でパーティション切って、ext3で展開しているので、そこに置くアーカイブを作る。
スクリプトも用意されているので実行する。
mydroid$ cat make_root_tar.sh #!/bin/sh set -x -e OUT_DIR=$PWD/../out ROOT=$PWD/tmp-root [ -e $ROOT ] && sudo rm -rf $ROOT mkdir -p $ROOT cd out/target/product/kzm9d/ #zcat ramdisk.img | (cd $ROOT; cpio -i) cp -a root/* $ROOT cp -a system $ROOT chmod +r $ROOT/system/usr/keychars/* sudo chown -R 1000:1000 $ROOT cd $ROOT mkdir -p $OUT_DIR || true sudo tar cvjf $OUT_DIR/android-root.tar.bz2 .
ビルドに使った、rootとsystemディレクトリの中身をまるコピーして、keycharsをrを設定している。
そしてtar.bz2でアーカイブ。
途中、chownをかけるのにsudoしている。
パスワードを聞かれるってことね。
実行する。
mydroid$ ./make_root_tar.sh + OUT_DIR=/home/kinneko/KZM9D/20111018/mydroid/../out + ROOT=/home/kinneko/KZM9D/20111018/mydroid/tmp-root + [ -e /home/kinneko/KZM9D/20111018/mydroid/tmp-root ] + mkdir -p /home/kinneko/KZM9D/20111018/mydroid/tmp-root + cd out/target/product/kzm9d/ + cp -a root/data root/default.prop root/dev root/init root/init.goldfish.rc root/init.kzm9d.rc root/init.rc root/initlogo.rle root/kzm9d_ts0.rle root/lib root/proc root/sbin root/sys root/system root/ueventd.goldfish.rc root/ueventd.kzm9d.rc root/ueventd.rc /home/kinneko/KZM9D/20111018/mydroid/tmp-root + cp -a system /home/kinneko/KZM9D/20111018/mydroid/tmp-root + chmod +r /home/kinneko/KZM9D/20111018/mydroid/tmp-root/system/usr/keychars/qwerty.kcm.bin /home/kinneko/KZM9D/20111018/mydroid/tmp-root/system/usr/keychars/qwerty2.kcm.bin + sudo chown -R 1000:1000 /home/kinneko/KZM9D/20111018/mydroid/tmp-root [sudo] password for kinneko: + cd /home/kinneko/KZM9D/20111018/mydroid/tmp-root + mkdir -p /home/kinneko/KZM9D/20111018/mydroid/../out + sudo tar cvjf /home/kinneko/KZM9D/20111018/mydroid/../out/android-root.tar.bz2 . ./ ./ueventd.kzm9d.rc (snip) ./ueventd.rc ./init.rc ./dev/
終わり。
mydroid$ ls -lh ../out/android-root.tar.bz2 -rw-r--r-- 1 root root 50M Jun 18 17:40 ../out/android-root.tar.bz2 mydroid$ cd ..
50MBほど。
あれ?こんなに小さかったっけ?
最近でかいの扱いすぎか(^^;。
起動テスト
SDに書き込んで起動テストする。
$ sudo ./write_sd.sh /dev/sdb (snip) + umount /tmp/mnt + sync + sync + sync + echo *** OK *** *** OK ***
お、こんどはumountがうまくいった。
前は失敗してたのに。
そのかわり、umountはじまってから、えらく時間かかったな。
ターゲットにSD入れて起動。
キャリブレーションをやって起動してきた。
やっぱり、初回はロックスクリーンが出ない。
なんか反応鈍いような気が。
ん?LiveWallPaperないぞ。
これって、3Dなし?
そーいえば、ビルドスクリプトで、3Dまわりのバイナリはコピーしてなかったな... orz
そーいうことか...
mjd...
やっぱり落とし穴あったな(^^;。