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でタッチパネルが使えるようにする

Android4.0(Ice Cream Sandwich)のソースのダウンロードとビルド

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



トラックバックURL

コメントする

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

QRコード
QRコード