2012年01月13日
KZM-A9-DualボードでAndroid 4.0.3(Ice Cream Sandwich)を動かす
先日の"KZM-A9-DualボードでAndroid 4.0.1(Ice Cream Sandwich)を動かす "の記事のとおりにAndroid 4.0.3を試したら、いくつか追加の修正が必要だったので、整理しつつ再度メモを載せます。
ソースのダウンロード
Android Open Source Projectのサイトに書いてありますので見てください。
ここでは、はまりやすい点だけ書きます。
ビルド環境
Android 2.3(Gingerbread)のときと同じ環境でビルドできます。私のビルド環境は Ubuntu 10.04 (x86_64), CPU: Intel Core i7 950 @3.07GHz, メモリ 24GB です。
JavaはSUNのJDKを入れてください。OpenJDKではバージョンチェックで引っかかります。
repoコマンドの取得
すでにrepoコマンドを持っていても、最新版でやりましょう。
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo
ソースリポジトリの初期化
$ mkdir android-ics $ cd andorid-ics $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
ソースコードの取得
$ repo sync
KZM-A9-Dual向けにビルド
本来ならば、deviceディレクトリの下にデバイス固有のファイルを置くのですが、今回はemulator用のものから最小限の変更だけで動かします。
まず環境変数をセットしてビルドします。使用したスクリプトは以下の通り。
$ cat build.sh export ARCH_ARM_HAVE_TLS_REGISTER=true export TARGET_ARCH_VARIANT=armv7-a-neon export TARGET_CPU_SMP=true export USE_CCACHE=1 time make -j8 showcommands > make.log 2>&1
ビルドの実行。
$ ./build.sh
これができたら、NFS用のルートファイルシステムを作ります。使用したスクリプトは以下。必要に応じて ROOT= の行を変更してください。
$ cat make_nfsroot.sh ROOT=/export/android/root-kzm-ics [ -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 $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
NFS用のルートファイルシステムの作成。
$ ./make_nfsroot.sh
起動のときのカーネルパラメータは、NFSサーバのIPアドレスを192.168.1.126とすると
root=/dev/nfs nfsroot=192.168.1.126:/export/android/root-kzm-ics ip=dhcp noinitrd init=/init \ mem=167M@0x40000000 mem=256M@0x50000000 debug no_console_suspend=1 \ console=ttyS1,115200n8n androidboot.console=ttyS1 video=qfb rootwait rw
eglをソフトレンダリングのライブラリを使うように設定する。
このままで動かすと、emulator専用のegl, openglのライブラリがロードされてしまって、そこでSEGVで落ちます。
これの簡単な回避方法は、ターゲットの/system/lib/egl/egl.cfg を削除することです。または、/system/lib/egl/egl.cfgの内容を以下のように変更します。
0 0 android
grallocを持ってくる
フレームバッファに関連するHALのモジュールをKZM-A9-DualのAndroid2.3のソースツリーから持ってきます。
$ cp $GINGERBREAD/bionic/libc/kernel/common/linux/fbcommon.h bionic/libc/kernel/common/linux/ $ cd hardware/libhardware/modules/ $ mv gralloc /tmp $ cp -a $GINGERBREAD/hardware/renesas/emxx/libgralloc gralloc
Android.mkのLOCAL_MODULEは以下のようにgralloc.defaultに書き換えます。
LOCAL_MODULE := gralloc.default #LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS := optionalの行はコメントアウトします。これをしないとビルドされた gralloc.default..soが/system/lib/hw にコピーされません。
gralloc.default.soの中でゼロ除算で落ちるところがあったので、以下のように回避します。(info.pixclockが0になっているため。とりあえずrefreshRateは正確でなくてもよい。)
hardware/libhardware/modules/gralloc/framebuffer.cpp
if (ioctl(fd, FBIOGET_VSCREENINFO, &info) == -1) return -errno; #if 1 /*koba*/ int refreshRate = 0; #else int refreshRate = 1000000000000000LLU / ( uint64_t( info.upper_margin + info.lower_margin + info.yres ) * ( info.left_margin + info.right_margin + info.xres ) * info.pixclock ); #endif if (refreshRate == 0) { // bleagh, bad info from the driver refreshRate = 60*1000; // 60 Hz }
ハードウェアレンダリングを無効にする
4.0.1では不要でしたが、4.0.3だと以下のようにしないと、"eglConfig not initialized" というエラーで起動できません。
frameworks/base/core/java/android/view/HardwareRenderer.java
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/vi index ccb6489..eccc401 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -103,14 +103,16 @@ public abstract class HardwareRenderer { * * @hide */ - public static boolean sRendererDisabled = false; + //public static boolean sRendererDisabled = false; + public static boolean sRendererDisabled = true; /** * Further hardware renderer disabling for the system process. * * @hide */ - public static boolean sSystemRendererDisabled = false; + //public static boolean sSystemRendererDisabled = false; + public static boolean sSystemRendererDisabled = true; private boolean mEnabled; private boolean mRequested = true;
initlogoを表示する
試行錯誤の結果、最初にinitlogoを表示するとその後もうまく表示できることがわかりました。おそらくPowerManagementか何かが関連しているのでしょう。これを行わないと内部的には起動しているのに画面は真っ暗なままです。
今までのinitlogo.rleを持ってきてターゲットのルートディレクトリに置きます。
また、元のコードではルートディレクトリはRAMディスクを想定して表示が終わったらこのファイルを消すようになっています。それでは困るのでそこをコメントアウトします。
system/core/init/logo.c: load_565rle_image
diff --git a/init/logo.c b/init/logo.c index 614224c..0626cbe 100644 --- a/init/logo.c +++ b/init/logo.c @@ -149,7 +149,9 @@ int load_565rle_image(char *fn) fb_update(&fb); fb_close(&fb); close(fd); +#if 0 /*koba*/ unlink(fn); +#endif return 0;
タッチパネルのコンフィグファイル
ターゲットに以下のファイルを作成します。
/system/usr/idc/kzm9d_touch.idc
touch.deviceType = touchScreen
DalvikVMのヒープサイズを増やす
4.0.1では問題がなかったのに、4.0.3では起動してすぐにホームアプリでOutOfMemoryが発生していました。
emulatorのシステムプロパティと比較すると、ヒープサイズの指定が必要なようです。
ターゲットの/default.prop に以下を追加しました。
dalvik.vm.heapsize=48m
サスペンドしないように設定する
サスペンドしてしまうとまだ復帰できないので、起動したらSettingsのアプリから以下を選択してサスペンドしないようにします。
{} Developer options > Stay awake
KZM-A9-Dualの固有の設定を持ってくる。
KZM-A9-DualのAndroid2.3のソースツリーから以下のファイルを持ってきます。
- /init.kzm9d.rc
- /ueventd.kzm9d.rc
- /system/etc/init.kzm9d.sh
- /system/etc/vold.fstab
init.kzm9d.rcの先頭に以下を追加します。
on early-init export EXTERNAL_STORAGE /mnt/sdcard mkdir /mnt/sdcard 0000 system system # for backwards compatibility symlink /mnt/sdcard /sdcard
これでSDカードが読み書きできるようになり、ネットワークも使えるようになります。
Gallery2の代わりにGalleryを使う
GPUが使えないとGallery2のアプリがエラーになるようになってしまいました。しかたがないので代わりにGalleryを使います。
build/target/product/generic_no_telephony.mk のGallery2をGalleryに変更して再ビルドします。
関連するページ
KZM-A9-DualボードでAndroid 4.0.1(Ice Cream Sandwich)を動かす
KZM-A9-DualボードのAndroid4.0でタッチパネルが使えるようにする