素直にビルドして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はこのへん。

mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/

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...
やっぱり落とし穴あったな(^^;。