2010年07月08日
実機用のAndroid2.2(Froyo)のビルド
KZM-CA9-01ボード(Cortex-A9 Quad core)でAndroid2.2(Froyo)を動かしました。
このビルド方法を簡単に紹介します。
他のボードで動かすときにも参考になると思います。
カーネル
カーネルは更新しなくても大丈夫です。Andorid1.5(Cupcake)で使用していたカーネルと同じものを使用できます。
Androidソースのダウンロード
android-2.2_r1.1のタグでソースをダウンロードする。
$ mkdir android-2.2_r1.1 $ cd android-2.2_r1.1/ $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2_r1.1 $ repo sync
ソースにパッチを当てる
本来ならばvendorというディレクトリを作ってボード固有のファイルをそこに置くのですが、今回は最小限の変更だけで動かします。
$ patch -p0 < mountserver.patch $ patch -p0 < dns.patch $ patch -p0 < sdcard.patch
これらのパッチファイルはこのページの最後に貼っておきます。
(patchが失敗したら手で修正してください。それくらい少ない変更量です。)
ビルド
$ cat build.sh export ARCH_ARM_HAVE_TLS_REGISTER=true export TARGET_ARCH_VARIANT=armv7-a-neon export WITH_JIT=true export JS_ENGINE=v8 time make -j4 showcommands 2>&1 |tee make.log
SMPカーネルではTLSレジスタの使用は必須なので、ARCH_ARM_HAVE_TLS_REGISTER=trueを指定します。
$ ./build.sh
NFS用ルートファイルシステムの作成
開発用にはルートファイルシステムをフラッシュメモリに書くよりもNFSにしたほうが便利です。
make_nfsroot.shのROOT=/export/android/root-2.2_r1.1 を必要に応じて変更してください。
$ cat make_nfsroot.sh ROOT=/export/android/root-2.2_r1.1 [ -e $ROOT ] && sudo rm -rf $ROOT mkdir -p $ROOT cd out/target/product/generic/ zcat ramdisk.img | (cd $ROOT; cpio -i) cp -a system $ROOT #cp -a data $ROOT #[ -e $ROOT/data/app ] && chmod 771 $ROOT/data/app cp $ROOT/init.rc $ROOT/init.rc.org sed -e 's/mount rootfs/#mount rootfs/' -e 's/mount yaffs2/#mount yaffs2/' $ROOT/init.rc.org > $ROOT/init.rc sudo chown -R root:root $ROOT
/dataはコピーせずに空のままにすることにしました。
$ ./make_nfsroot.sh
NFSrootで起動するときにカーネルのブートパラメータ
NFSサーバを192.168.xx.xx とすると
root=/dev/nfs nfsroot=192.168.xx.xx:/export/android/root-2.2_r1.1 ip=dhcp \ noinitrd init=/init console=ttyAMA0,115200 rootwait rw
ベンチマークテスト
こちらを参照してください。
=========================================================
パッチファイル
mountserver.patch
起動時に"Waiting too long for mReady! "のログが出続ける問題の対策。
ここから情報を得ました。
--- frameworks/base/services/java/com/android/server/NativeDaemonConnector.java.org 2010-07-05 16:37:27.000000000 +0900 +++ frameworks/base/services/java/com/android/server/NativeDaemonConnector.java2010-07-04 11:10:19.000000000 +0900 @@ -97,11 +97,12 @@ LocalSocketAddress.Namespace.RESERVED); socket.connect(address); - mCallbacks.onDaemonConnected(); InputStream inputStream = socket.getInputStream(); mOutputStream = socket.getOutputStream(); + mCallbacks.onDaemonConnected(); + byte[] buffer = new byte[BUFFER_SIZE]; int start = 0;
dns.patch
DNSサーバを8.8.8.8(Googleが提供するパブリックのDNSサーバ)に設定します。これで有線LANでインターネットのページをブラウザで閲覧できるようになります。
ここから情報を得ました。
--- system/core/rootdir/init.rc.org 2010-07-05 16:56:10.000000000 +0900 +++ system/core/rootdir/init.rc 2010-07-05 16:57:16.000000000 +0900 @@ -255,6 +255,8 @@ setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208 setprop net.tcp.buffersize.edge 4093,26280,35040,4096,16384,35040 setprop net.tcp.buffersize.gprs 4092,8760,11680,4096,8760,11680 +# Set global DNS + setprop net.dns1 8.8.8.8 class_start default
sdcard.patch
SDメモリカードをマウントできるようにします。
ここも参照してください。
--- system/core/rootdir/etc/vold.fstab.org 2010-07-07 13:29:48.000000000 +0900 +++ system/core/rootdir/etc/vold.fstab 2010-07-07 13:30:14.000000000 +0900 @@ -14,7 +14,8 @@ ## Example of a standard sdcard mount for the emulator / Dream # Mounts the first usable partition of the specified device -dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1 +#dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1 +dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/a9tc_mmc.0 ## Example of a dual card setup # dev_mount left_sdcard /sdcard1 auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1