ブログネタ
Android に参加中!
あるのか気になったので調べてみた。
linux
調べたのは、Emulator 環境。

Emulator 環境を選んだ理由は、
以前からずっと linux-2.6.29 ベースなため。
もし Ice Cream Sandwich を動かすために必要なものがあれば、
何か変更が入っているだろうと考えた。

Emulator 環境の作成(ソースからビルドして作る)
$ mkdir -p /home/sola/work
$ cd /home/sola/work
$ export MY_WORK=$PWD
$ mkdir android-4.0.1_r1
$ cd android-4.0.1_r1
$ export ANDROID_ROOT=$PWD
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
$ repo sync -j8
$ source build/envsetup.sh
$ lunch full-eng
$ make -j8

kernel のビルド
$ git clone http://android.googlesource.com/kernel/goldfish.git
$ cd goldfish
$ export KERNEL_DIR=$PWD
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ export ARCH=arm
$ export CROSS_COMPILE=$ANDROID_ROOT/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-
$ make goldfish_armv7_defconfig
$ make -j8

Emulator で Ice Cream Sandwich の動作確認
$ cd $ANDROID_ROOT
$ emulator -kernel $KERNEL_DIR/arch/arm/boot/zImage -show-kernel &

これは当然だが、起動する。
001

一応自分でビルドした kernel/Android になっている事を確認。
002


次に、Gingerbread で使用していた時のバージョンの
Linux Kernel で動作させてみる。
以前のバージョンを取得し、再度ビルド。
$ cd $KERNEL_DIR
$ make distclean
$ git checkout b0d93fb0426911d0329f861f22c59f1c72cff815
$ make goldfish_armv7_defconfig
$ make -j8

再び Emulator で Ice Cream Sandwich の動作確認
$ cd $ANDROID_ROOT
$ emulator -kernel $KERNEL_DIR/arch/arm/boot/zImage -show-kernel &

結果を先に書くと、起動するけど使い物にならない。
写真では見難い&説明し難いので、動画を。


右下は logcat のログ。
W/SurfaceFlinger( 33): ANDROID_WAIT_FOR_FB_WAKE failed (Bad file number)
W/SurfaceFlinger( 33): ANDROID_WAIT_FOR_FB_SLEEP failed (Bad file number)
が出続ける。

最新では動くので、
commit b0d93fb0426911d0329f861f22c59f1c72cff815 から最新の間で、
この現象を回避するための修正が入っている事になる。

変更履歴を確認すると、15回の修正が入っていた。
0001-x86-Headers-and-config-for-goldfish.-Headers-and-Kco.patch
0002-x86-Add-x86-mach-goldfish-with-the-pdev_bus-driver.-.patch
0003-x86-Adding-goldfish-tty-events-mmc-nand-and-battery-.patch
0004-x86-Add-x86-support-to-the-golfish-framebuffer-drive.patch
0005-Move-the-goldfish-audio-driver-to-the-generic-direct.patch
0006-kbuild-Fix-modpost-segfault.patch
0007-x86-VirtualBox-kernel-config.patch
0008-x86-Fix-SD-card-driver.patch
0009-goldfish-Initial-implementation-of-QEMU-pipes.patch
0010-x86-goldfish-Add-missing-power-management-definition.patch
0011-goldfish-Enable-CONFIG_FB_EARLYSUSPEND.patch
0012-goldfish-Enable-IPv6-FB-early-suspend.patch
0013-goldfish-Fix-multi-touch-event-handling.patch
0014-goldfish-Update-networking-options.patch
0015-goldfish-Enable-CONFIG_TUN.patch

1個ずつ確認した結果、0011 を適用したところで正常起動。

0011 では、以下2点を変更している
  • CONFIG_FB_EARLYSUSPEND を有効にする
  • SurfaceFlinger から Warning が出続ける現象への対策。
  • CONFIG_FRAMEBUFFER_CONSOLE を無効にする
  • 画面点滅(動画を参照)への対策。
コメントを見ると、Honeycomb から必要らしい。
0012 以降は ネットワーク(IPv6等)、マルチタッチ対応のための変更。

これから Ice Cream Sandwich を動かそうとする場合、
事前にこの辺(特に 0011 の変更)の確認をしておくと良いかもしれない。