2011年05月02日
KZM-A9-DualでAndoridのGingerbreadを動かす最短の手順
Androidもくもく勉強会 #0x10 もくびーに参加して、その前日にリリースされたAndroid 2.3.4のソースをビルドして動かしてみました。
今日はそれを自分の開発マシンで復習したので、それをここで紹介します。
0. 準備
既存の2.3.3のビルドディレクトリから不要なものを削除
$ cd android-2.3 $ export ANDROID=$PWD $ repo forall -c git checkout -f $ rm -rf out out.*
android-2.3.4_r1のソースを入手
$ repo init -b android-2.3.4_r1 $ repo sync -j4
まっさらなディレクトリに入れる場合はこちら。
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.4_r1 $ repo sync -j4
1. まずはemulatorのビルド
java6を使うようにPATHなどの環境変数を設定する
$ cat ./env.sh export ANDROID_JAVA_HOME=/usr/lib/jvm/java-6-openjdk export JAVA_HOME=/usr/lib/jvm/java-6-openjdk export PATH=$JAVA_HOME/bin:$PATH $ . env.sh $ . build/envsetup.sh $ lunch generic-eng
ビルド
$ time make -j8 2>&1 |tee make.log
ビルドにかかった時間。
real 15m7.034s user 124m28.730s sys 6m51.310s
ビルドマシンは Ubuntu 10.04 CPU: Intel Core i7 950 @3.07GHz, メモリ12GB
emulatorの起動
$ emulator & $ adb logcat
2. KZM-A9-Dual用のビルド
環境変数を以下のようにセットしてビルド
(このページも参考にしてください。Androidのビルドでccacheを使う)
$ cat ./build.sh export ARCH_ARM_HAVE_TLS_REGISTER=true export TARGET_ARCH_VARIANT=armv7-a-neon export TARGET_CPU_SMP=true export WITH_JIT=true export JS_ENGINE=v8 time make -j8 showcommands 2>&1 |tee make.log $ rm -rf out $ ./build.sh
ビルドにかかった時間。ファイルがキャッシュに載ったので前回より速い。
real 13m54.898s user 108m58.990s sys 6m11.980s
NFSサーバにルートファイルシステムをコピー。
$ cat ./make_nfsroot.sh ROOT=/export/android/root [ -e $ROOT ] && sudo rm -rf $ROOT mkdir -p $ROOT cd out/target/product/generic/ #cd out/target/product/kzm9d/ 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/' $ROOT/init.rc.org > $ROOT/init.rc sudo chown -R root:root $ROOT $ ./make_nfsroot.sh
実機で起動する。
カーネルにセットするブートパラメータは以下。NFSサーバのIPアドレスが192.168.1.26の場合。
root=/dev/nfs nfsroot=192.168.1.26:/export/android/root ip=dhcp noinitrd init=/init \ mem=129M@0x40000000 mem=256M@0x50000000 debug no_console_suspend=1 \ console=ttyS1,115200n8n androidboot.console=ttyS1 video=qfb rootwait rw
(SDカードから起動したい場合はここを参照。KZM-A9-DualでAndroid2.3(Gingerbread)をSDカードから起動する)
まだこれだけでは、LCD画面の表示が崩れる。カーネル側はデフォルトで24bitカラーを期待しているのに、Android側で固定的に16bitカラーで画面を作っているため。
実機のシリアルコンソールで
$ ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 264 180 c00aef2c 0000875c S /init root 2 0 0 0 c006291c 00000000 S kthreadd root 3 2 0 0 c004aa68 00000000 S migration/0 root 4 2 0 0 c0053450 00000000 S ksoftirqd/0 root 5 2 0 0 c004aa68 00000000 S migration/1 root 6 2 0 0 c0053450 00000000 S ksoftirqd/1 root 7 2 0 0 c005eaf8 00000000 S events/0 root 8 2 0 0 c005eaf8 00000000 S events/1 root 9 2 0 0 c005eaf8 00000000 S work_on_cpu/0 root 10 2 0 0 c005eaf8 00000000 S work_on_cpu/1 root 11 2 0 0 c005eaf8 00000000 S khelper root 12 2 0 0 c005eaf8 00000000 S suspend root 13 2 0 0 c005eaf8 00000000 S kblockd/0 root 14 2 0 0 c005eaf8 00000000 S kblockd/1 root 15 2 0 0 c005eaf8 00000000 S ksuspend_usbd root 16 2 0 0 c01de9d4 00000000 S khubd root 17 2 0 0 c005eaf8 00000000 S kmmcd root 18 2 0 0 c0085ae0 00000000 S pdflush root 19 2 0 0 c0085ae0 00000000 S pdflush root 20 2 0 0 c0089e44 00000000 S kswapd0 root 21 2 0 0 c005eaf8 00000000 S aio/0 root 22 2 0 0 c005eaf8 00000000 S aio/1 root 23 2 0 0 c005eaf8 00000000 S nfsiod root 24 2 0 0 c005eaf8 00000000 S emxx_fb root 25 2 0 0 c005eaf8 00000000 S emxx_lcd root 26 2 0 0 c01b7c04 00000000 S kv4l2_rot root 27 2 0 0 c01b7c04 00000000 S kv4l2_tmr root 28 2 0 0 c01b7c04 00000000 S kv4l2_lcd root 29 2 0 0 c01d1580 00000000 S mtdblockd root 30 2 0 0 c005eaf8 00000000 S ehci-wq root 31 2 0 0 c005eaf8 00000000 S usb_suspend root 32 2 0 0 c0203f1c 00000000 S usb_mass_storag root 33 2 0 0 c005eaf8 00000000 S rpciod/0 root 34 2 0 0 c005eaf8 00000000 S rpciod/1 root 35 2 0 0 c0218c5c 00000000 S mmcqd root 36 1 248 156 c00aef2c 0000875c S /sbin/ueventd system 41 1 768 260 c022950c afd0b6fc S /system/bin/servicemanager root 42 1 3824 564 ffffffff afd0bdac S /system/bin/vold root 43 1 3796 560 ffffffff afd0bdac S /system/bin/netd root 44 1 628 264 c02588c0 afd0c0cc S /system/bin/debuggerd radio 45 1 4336 672 ffffffff afd0bdac S /system/bin/rild root 46 1 61324 26580 c00aef2c afd0b844 S zygote media 47 1 16804 3692 ffffffff afd0b6fc S /system/bin/mediaserver bluetooth 48 1 1216 572 c00aef2c afd0c59c S /system/bin/dbus-daemon root 49 1 776 316 c02a8424 afd0b45c S /system/bin/installd keystore 50 1 1704 432 c02588c0 afd0c0cc S /system/bin/keystore shell 51 1 696 336 c0050934 afd0c3ac S /system/bin/sh root 52 1 3356 160 ffffffff 00008294 S /sbin/adbd system 66 46 129248 35628 ffffffff afd0b6fc S system_server system 114 46 74028 21096 ffffffff afd0c51c S com.android.systemui app_24 122 46 79320 19184 ffffffff afd0c51c S com.android.inputmethod.latin radio 134 46 87000 19468 ffffffff afd0c51c S com.android.phone app_18 138 46 80080 24552 ffffffff afd0c51c S com.android.launcher app_7 165 46 82172 21832 ffffffff afd0c51c S android.process.acore app_0 196 46 73144 16628 ffffffff afd0c51c S com.android.deskclock app_14 202 46 75192 17628 ffffffff afd0c51c S android.process.media app_3 216 46 72420 16788 ffffffff afd0c51c S com.android.bluetooth app_25 233 46 83452 17004 ffffffff afd0c51c S com.android.mms app_26 251 46 75884 17968 ffffffff afd0c51c S com.android.email app_27 266 46 74056 17156 ffffffff afd0c51c S com.android.providers.calendar app_1 285 46 72836 15444 ffffffff afd0c51c S com.android.protips app_19 295 46 72360 15720 ffffffff afd0c51c S com.android.music app_21 304 46 73872 16348 ffffffff afd0c51c S com.android.quicksearchbox app_28 314 46 72480 17800 ffffffff afd0c51c S com.cooliris.media shell 324 51 856 316 00000000 afd0b45c R ps $
ここまで動いていればOK。
KZM-A9-Dualのビルドツリーから必要なファイルを持ってくる。
KZM-A9-Dualボードに添付されているソースのディレクトリを$FROYOとすると
$ export FROYO=/path/to/KZM-A9-Dual/source/mydroid/
grallocと必要なヘッダファイルをコピーする。
$ cp $FROYO/bionic/libc/kernel/common/linux/fbcommon.h bionic/libc/kernel/common/linux/ $ cd hardware/libhardware/modules/ $ mv gralloc /tmp $ cp -a $FROYO/hardware/renesas/emxx/libgralloc gralloc $ cd gralloc/ $ cp Android.mk Android.mk.org $ vi Android.mk
Android.mkは以下の一行を修正した。
$ diff -u Android.mk.org Android.mk --- Android.mk.org 2011-05-02 14:23:39.357460129 +0900 +++ Android.mk 2011-05-02 14:24:35.807459846 +0900 @@ -28,6 +28,6 @@ framebuffer.cpp \ mapper.cpp -LOCAL_MODULE := gralloc.emxx +LOCAL_MODULE := gralloc.default LOCAL_CFLAGS:= -DLOG_TAG=\"gralloc\" include $(BUILD_SHARED_LIBRARY)
元のディレクトリに戻って、クリーンビルド。(makefile関連を変更しているので、クリーンビルドが必要です。)
$ cd $ANDROID $ rm -rf out $ ./build.sh
ビルドの時間。
real 13m52.893s user 109m16.830s sys 6m10.000s
$ ./make_nfsroot.sh
これで実機を起動すると、今度はLCD画面に正しく表示された。
ただし、アイコンや文字が想定より小さい。
設定の調整
ブラウザで外のページを表示するにはDNSの設定が必要。また、SDカードをマウントするためには/system/etc/vold.fstabの修正が必要。このあたりのファイルを元のKZM-A9-Dualのソースツリーから持ってくる。とりあえずNFSサーバにコピーした。
$ export NFS_ROOT=/export/android/root $ sudo cp $FROYO/device/kmc/kzm9d/init.kzm9d.rc $NFS_ROOT/ $ sudo cp $FROYO/device/kmc/kzm9d/init.kzm9d.sh $NFS_ROOT/system/etc/ $ sudo cp $FROYO/device/kmc/kzm9d/vold.fstab $NFS_ROOT/system/etc/
Gingerbreadからシリアルコンソールのshellがrootではなくなった。しかしこれでは作業するのに面倒なので、init.rcの以下の2行をコメントアウトしておく。これで今まで通り、rootのshellになる。
$ sudo diff -u init.rc.org init.rc --- init.rc.org 2011-05-02 18:07:19.000000000 +0900 +++ init.rc 2011-05-02 18:08:47.000000000 +0900 @@ -283,8 +283,8 @@ service console /system/bin/sh console disabled - user shell - group log +# user shell +# group log on property:ro.secure=0 start console
トラックバックURL
コメント一覧
ext4からの変換でうまくいかないようで
ext4はカーネル側のコンフィグもそれを有効にする必要があります。
ext3ならいけるでしょう。
KZM-A9-Dualのブート可能なSDを作る方法
http://blog.kmckk.com/archives/3713469.html
>ext4はカーネル側のコンフィグもそれを有効にする必要があります。
上記は、具体的にはなにをしたらいいでしょうか?
deviceとkarnelとかは、Froyoの時のをコピーしてきて、
Makeできたんですが
起動すると、以下でおちてしまいます。
b308 7561216 mmcblk1 driver: mmcblk
b309 51832 mmcblk1p1
b30a 7409 mmcblk1p2
b30b 7497908 mmcblk1p3
No filesystem could mount root, tried: ext3
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,11)
Froyoの時は,tune2fsが実行されて、ext3に変換されたんですが
Gingerbreadでは、それが実行されないのかと。
例えば、Android-Embedded-Japan のメーリングリストに投稿したらどうでしょうか。私もチェックしています。
あるいは、ブログに書いてトラックバックするのもよいと思います。
>Android-Embedded-Japan のメーリングリストに投稿したらどうでしょうか
試みてみます。
見識がなく、失礼な対応、申し訳ありません。