2011年05月02日

KZM-A9-DualでAndoridのGingerbreadを動かす最短の手順

Androidもくもく勉強会 #0x10 もくびーに参加して、その前日にリリースされたAndroid 2.3.4のソースをビルドして動かしてみました。

今日はそれを自分の開発マシンで復習したので、それをここで紹介します。

(English version of this page)



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画面に正しく表示された。

ただし、アイコンや文字が想定より小さい。

DSC00340

DSC00341


設定の調整

ブラウザで外のページを表示するには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

コメント一覧

1. Posted by 質問です。   2011年05月10日 13:18
SDカードでのブートできないでしょうか?
ext4からの変換でうまくいかないようで
2. Posted by koba   2011年05月10日 17:32
SDカードからでもできると思いますよ。

ext4はカーネル側のコンフィグもそれを有効にする必要があります。
ext3ならいけるでしょう。

KZM-A9-Dualのブート可能なSDを作る方法
http://blog.kmckk.com/archives/3713469.html
3. Posted by 回答、ありがとうございます   2011年05月10日 18:15

>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では、それが実行されないのかと。
4. Posted by koba   2011年05月10日 18:48
ここに長々と質問を書くのはご遠慮ください。

例えば、Android-Embedded-Japan のメーリングリストに投稿したらどうでしょうか。私もチェックしています。
あるいは、ブログに書いてトラックバックするのもよいと思います。
5. Posted by 失礼いたしました。   2011年05月10日 19:02
大変失礼しました。以後、気をつけます。
>Android-Embedded-Japan のメーリングリストに投稿したらどうでしょうか
試みてみます。
見識がなく、失礼な対応、申し訳ありません。

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード