ICS-x86(android-x86 project版)をビルドしてみた

Android Advent Calendar
http://androidadvent.blogspot.com/2011/11/welcome-to-android-advent-calendar-2011.html
用のネタです。

なんか、次の項目のような記事の妙なネタになっちゃってるので、ビルドしてみる話。


AOSPのx86対応は、JBQ氏によると、

full_x86 runs in the x86 emulator, which emulates an atom.

これは、Intelの入れたAtomパッチが生きてて、それ以外ではうまく動かないってのの裏。
サポートしているのは、Atomだけってこと。
android-x86プロジェクトでは、ここにifdef入れて対応している。


現在の動作状態はこんなところというのがリリース文に。
動くもの:

まだ動かないもの:

動いても、大したことはできない。
Honeycombでは、GMA950上のmesaで十分なスピードが出ていたので、ちょっと期待したいのだけどまだ無理かな。


やり方は、ここに書いてあるよね。
http://groups.google.com/group/android-x86/browse_thread/thread/27148b6840e06010?hl=en


基本は、横浜Androidプラットフォーム部第15回勉強会「ICSをビルドしてみた」と同じ。
これの資料はここ。
http://www.android-group.jp/index.php?plugin=attach&refer=%A4%AD%A4%F3%A4%CD%A4%B3&openfile=ICS%A4%F2%A5%D3%A5%EB%A5%C9%A4%B7%A4%C6%A4%DF%A4%BF_PF20111119.pdf


落としてビルドするだけ。

kinneko@BuildSV:~$ mkdir ICSx86
kinneko@BuildSV:~$ cd ICSx86/
kinneko@BuildSV:~/ICSx86$ ../repo init -u git://git.android-x86.org/manifest.git -b ics-x86
kinneko@BuildSV:~/ICSx86$ ../repo sync -j8 

取得するリポジトリは217。案外少ない。

error: Exited sync due to fetch errors

とか出てきたら再実行する。
EMobileからのダウンロードでも、3時間くらい。
と、思ったら、落ちてこないじゃん... orz

error: Cannot fetch kernel/common

こういうエラーになることもある。
再実行して、以下のように出てくれば成功。

kinneko@BuildSV:~/ICSx86$ ../repo sync -j4
Fetching projects: 100% (217/217), done.  
Syncing work tree: 100% (217/217), done. 

とりあえず、バックアップをとっておく。

kinneko@BuildSV:~/ICSx86$ tar zcvf ../ICSx86_20111201.tgz .repo/projects/


ビルドにかかる。

kinneko@BuildSV:~/ICSx86$ source build/envsetup.sh
including device/amd/common/vendorsetup.sh
including device/asus/common/vendorsetup.sh
including device/tegatech/tegav2/vendorsetup.sh
including sdk/bash_completion/adb.bash

AMD用、ASUS用、Tegav2用の設定が追加されている。
手元には、tegav2と同じ構成のタブレットがあるので、それにしてみる。

kinneko@BuildSV:~/ICSx86$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. generic_x86-eng
     3. vbox_x86-eng
     4. amd_brazos-eng
     5. eeepc-eng
     6. asus_laptop-eng
     7. tegav2-eng

Which would you like? [full-eng] 7

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=tegav2
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================

ビルドする。

kinneko@BuildSV:~/ICSx86$ make -j12

止まった。

make: *** No rule to make target `device/common/firmware/ath3k-2.fw', needed by `out/target/product/tegav2/obj/FIRMWARE/ath3k-2.fw_intermediates/ath3k-2.fw'.  Stop.
make: *** Waiting for unfinished jobs....

をーい。
ath3kって、bluetoothのドライバだったかな。
たしか、こいつは、OSSドライバで完全に動くようになっていたのじゃなかったか。

kinneko@BuildSV:~/ICSx86$ grep LOCAL_FIRMWARES device/tegatech/tegav2/AndroidBoard.mk 
LOCAL_FIRMWARES := ath3k-2.fw

居るな。


なんと!
MLの発言をチェックしていると、tegav2は、まだサポートしてないだと?


しょうがない、eeecpターゲットに変更する。

kinneko@BuildSV:~/ICSx86$ make clean
kinneko@BuildSV:~/ICSx86$ make installclean
kinneko@BuildSV:~/ICSx86$ lunch eeepc-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=eeepc
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================

kinneko@BuildSV:~/ICSx86$ make -j12
(snip)
error: pathspec 'core/tasks/drivers/net/wireless/wl' did not match any file(s) known to git.
make: *** [kernel/drivers/net/wireless/wl/hybrid-portsrc_x86_32-v5_100_82_112.tar.gz] Error 1
make: *** Deleting file `kernel/drivers/net/wireless/wl/hybrid-portsrc_x86_32-v5_100_82_112.tar.gz'
make: *** Waiting for unfinished jobs....

あれ?
バイナリドライバを使うようなやつは、まだ取得ルーチンが入ってなくて、全滅かな?


んで、どんくらいターゲット設定が入っているか確認。

kinneko@BuildSV:~/ICSx86$ cat device/asus/eeepc/eeepc.mk 
$(call inherit-product,$(LOCAL_PATH)/../common/generic_asus.mk)

PRODUCT_NAME := eeepc
PRODUCT_DEVICE := eeepc

kinneko@BuildSV:~/ICSx86$ cat device/asus/eeepc/BoardConfig.mk 
TARGET_HAS_THIRD_PARTY_APPS := true
BOARD_GPU_DRIVERS := i915 r600g
BOARD_USES_KBDSENSOR := true
BOARD_USES_KBDSENSOR_ROTKEY1 := true

include $(GENERIC_X86_CONFIG_MK)

kinneko@BuildSV:~/ICSx86$ cat device/asus/eeepc/AndroidBoard.mk 
LOCAL_PATH := $(call my-dir)
LOCAL_FIRMWARES := rt2860.bin $(subst device/common/firmware/,,$(wildcard device/common/firmware/radeon/*))
TARGET_INITRD_SCRIPTS := $(LOCAL_PATH)/../common/asus_info
TARGET_KERNEL_CONFIG := $(LOCAL_PATH)/eeepc_defconfig

include $(GENERIC_X86_ANDROID_MK

kinneko@BuildSV:~/ICSx86$ cat device/asus/eeepc/init.eeepc.rc 
on boot
    chown system system  /sys/class/backlight/eeepc/brightness

あらー、これだけか。
asus/commonも見る。

kinneko@BuildSV:~/ICSx86$ cat device/asus/common/AndroidProducts.mk 
(snip)
PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/../eeepc/eeepc.mk \
    $(LOCAL_DIR)/../laptop/laptop.mk

kinneko@BuildSV:~/ICSx86$ cat device/asus/common/vendorsetup.sh 
add_lunch_combo eeepc-eng
add_lunch_combo asus_laptop-eng

kinneko@BuildSV:~/ICSx86$ cat device/asus/common/generic_asus.mk 
PRODUCT_PACKAGES := $(THIRD_PARTY_APPS)
PRODUCT_PACKAGES += sensors.$(TARGET_PRODUCT)

PRODUCT_COPY_FILES := \
    device/common/generic_x86/GenericTouch.idc:system/usr/idc/GenericTouch.idc \

$(call inherit-product,$(SRC_TARGET_DIR)/product/generic_x86.mk)

PRODUCT_MANUFACTURER := asus

kinneko@BuildSV:~/ICSx86$ cat device/asus/common/asus_info 
DMIPATH=/sys/class/dmi/id

asus_info()
{
	board=`cat $DMIPATH/product_name`
	case "$board" in
		ET1602*)
			BOARD_USES_TSLIB=true
			;;
		ET2002*)
			UVESA_MODE=${UVESA_MODE:-1600x900}
			BOARD_USES_TSLIB=true
			;;
		T91|T101)
			UVESA_MODE=${UVESA_MODE:-1024x600}
			BOARD_USES_TSLIB=true
			;;
		T91MT|T101MT)
			UVESA_MODE=${UVESA_MODE:-1024x600}
			BOARD_USES_TSLIB=true
			EXTMOD="$EXTMOD hid-multitouch"
			;;
		EP121*)
			EXTMOD="$EXTMOD hid-multitouch"
			;;
		*)
			;;
	esac

	return 1 # auto_detect
}

eeepc_info()
{
	# enable wifi and bluetooth
	modprobe eeepc-laptop
	echo 1 > /sys/class/rfkill/rfkill0/state
	echo 1 > /sys/class/rfkill/rfkill1/state
}

detect_hardware()
{
	case "`cat $DMIPATH/uevent`" in
		*ASUSTeK*)
			grep -q EeePC $DMIPATH/board_serial || grep -q ^ET $DMIPATH/board_name
			if [ $? -eq 0 ]; then
				eeepc_info
			fi
			asus_info
			;;
		*)
			error WARNING: Not an ASUS product
			;;
	esac
}

post_detect()
{
	board=`cat $DMIPATH/product_name`
	case "$board" in
		EP121*)
			echo 3 0eef a001 0 > /sys/module/hid_multitouch/drivers/hid:hid-multitouch/new_id
			;;
		*)
			;;
	esac
}

こちらもまだまだ。


asus_laptop-engもやってみる。

kinneko@BuildSV:~/ICSx86$ make clean
kinneko@BuildSV:~/ICSx86$ make installclean
kinneko@BuildSV:~/ICSx86$ lunch asus_laptop-eng
kinneko@BuildSV:~/ICSx86$ make -j12
(snip)
Created filesystem with 1723/16064 inodes and 60685/64256 blocks
Install system fs image: out/target/product/laptop/system.img

こいつはできた。
ビルド時間は、こんなもん。

real	35m43.496s
user	340m46.090s
sys	16m1.210s

をや?

kinneko@BuildSV:~/ICSx86$ ls -l out/target/product/laptop/
total 268448
-rw-r--r--  1 kinneko kinneko         7 Dec  2 10:50 android-info.txt
-rw-r--r--  1 kinneko kinneko   3164160 Dec  2 11:18 boot.img
-rw-r--r--  1 kinneko kinneko     14955 Dec  2 10:49 clean_steps.mk
drwxr-xr-x  4 kinneko kinneko      4096 Dec  2 11:19 data
drwxr-xr-x  3 kinneko kinneko      4096 Dec  2 11:18 dex_bootjars
drwxr-xr-x  2 kinneko kinneko      4096 Dec  2 11:16 grub
-rw-r--r--  1 kinneko kinneko     93562 Dec  2 11:25 installed-files.txt
-rw-r--r--  1 kinneko kinneko   2883104 Dec  2 11:16 kernel
drwxr-xr-x 17 kinneko kinneko      4096 Dec  2 11:25 obj
-rw-r--r--  1 kinneko kinneko       540 Dec  2 10:49 previous_build_config.mk
-rw-r--r--  1 kinneko kinneko    241307 Dec  2 11:18 ramdisk.img
drwxr-xr-x  8 kinneko kinneko      4096 Dec  2 11:18 root
drwxr-xr-x  7 kinneko kinneko      4096 Dec  2 11:18 symbols
drwxr-xr-x 12 kinneko kinneko      4096 Dec  2 11:18 system
-rw-r--r--  1 kinneko kinneko 263192576 Dec  2 11:25 system.img
-rw-r--r--  1 kinneko kinneko  52428800 Dec  2 11:19 userdata.img
drwxr-xr-x  2 kinneko kinneko      4096 Dec  2 11:18 utilities

isoとか出来ませんやん。
前はデフォルトで、iso_imgオプション適用じゃなかったっけ?
このへんも変わったのね。
やり直し。

kinneko@BuildSV:~/ICSx86$ make -j12 usb_img
kinneko@BuildSV:~/ICSx86$ ls -lh out/target/product/laptop/asus_laptop_usb.img 
-rw-r--r-- 1 kinneko kinneko 278M Dec  2 11:32 out/target/product/laptop/asus_laptop_usb.img

isoも作っておく。

kinneko@BuildSV:~/ICSx86$ make -j12 iso_img
kinneko@BuildSV:~/ICSx86$ ls -lh out/target/product/laptop/asus_laptop.iso
-rw-r--r-- 1 kinneko kinneko 257M Dec  2 11:35 out/target/product/laptop/asus_laptop.iso


USBメモリに焼いて起動してみる。
マシンはideapad S9e。

kinneko@BuildSV:~/ICSx86$ sudo su -
[sudo] password for kinneko: 
root@BuildSV:~# dd if=/home/kinneko/ICSx86/out/target/product/laptop/asus_laptop_usb.img of=/dev/sdb
567352+0 記録始め
567352+0 記録終わり
290484224 バイト (290 MB) コピー終了, 90.218 s, 3.2 MB/s

F12でUSBメモリを選んで起動。
GURBメニューも、背景画像なし、モードも2つで簡素になっている。

  • Android Install to /dev/sda from /dev/sdb
  • Android Startup form /dev/sda

2つ目を選ぶ。

  Booting 'Android Startup from /dev/sda'
  
  cmdline (hd0,2)/cmdline
  
  Error 22: No such partition
  
  Press any key to continu...

あれ?
インストーラーのドライブ指定がハードコードされている問題は残っているのか。
GRUBのメニューに戻るので、Startupを選んでeキーを押して、起動オプションを編集する。

cmdline (hd0,2)/cmdline
kernel --use-cmd-line )hd0,2)/kernel
initrd (hd0,2)/ramdisk

になっている。
2はないわ。
イメージのパーティションがどうなっているか調べる。

root@BuildSV:~# LANG=C fdisk -l /home/kinneko/ICSx86/out/target/product/laptop/asus_laptop_usb.img 
You must set cylinders.
You can do this from the extra functions menu.

Disk /home/kinneko/ICSx86/out/target/product/laptop/asus_laptop_usb.img: 0 MB, 0 bytes
256 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

                                                             Device Boot      Start         End      Blocks   Id  System
/home/kinneko/ICSx86/out/target/product/laptop/asus_laptop_usb.img1   *           1          36      282652   83  Linux
Partition 1 has different physical/logical beginnings (non-Linux?):
     phys=(1023, 255, 63) logical=(0, 32, 33)
Partition 1 has different physical/logical endings:
     phys=(1023, 255, 63) logical=(35, 45, 37)

うーん。
0で良さげ。
(hd0,2)を(hd0,0)に書き換えて、bキーで起動。
見慣れたAndroid-x86GRUBが起動してきた。

  • Live USB - Run Android-x86 without Instration (MDPI)
  • Live USB - VESA Mode
  • Live USB - Debug Mode
  • Installation - Install Android-x86 2011-12-02 to harddisk

MDPIを選ぶ。ダメですねぇ... ブラックアウト。USBドライブへのアクセスもないみたい。
再起動して、VESAを選んでみる。同じ。androidのアニメーションまで行かない。


generic_x86も試してみる。

kinneko@BuildSV:~/ICSx86$ make clean
kinneko@BuildSV:~/ICSx86$ make installclean
kinneko@BuildSV:~/ICSx86$ lunch generic_x86-eng
kinneko@BuildSV:~/ICSx86$ make -j12 usb_img

あちゃ〜。
ここでもwlドライバの問題で詰まってしまう。

kinneko@BuildSV:~/ICSx86$ grep CONFIG_WL= kernel/arch/x86/configs/android-x86_defconfig 
CONFIG_WL=m

確かに指定はされている。
しかし、このあたりは、BoardConfigでドライバ指定して、そのドライバ名にフックして処理するスクリプトを動かしていたような。
そのあたりの動きが妙かな?
そいつを潰してみる。

kinneko@BuildSV:~/ICSx86$ vi device/common/generic_x86/BoardConfig.mk 
#BOARD_WPA_SUPPLICANT_DRIVER ?= NL80211
#BOARD_WPA_SUPPLICANT_PRIVATE_LIB ?= private_lib_driver_cmd
#WPA_SUPPLICANT_VERSION ?= VER_0_8_X
#WIFI_DRIVER_MODULE_PATH ?= auto

makeしたら出来た。

kinneko@BuildSV:~/ICSx86$ ls -lh out/target/product/generic_x86/generic_x86_usb.img
-rw-r--r-- 1 kinneko kinneko 301M Dec  2 13:32 out/target/product/generic_x86/generic_x86_usb.img

ちどデカい。


ついでに、device.mkを見てたら、こんなのがあった。

PRODUCT_CHARACTERISTICS := tablet

ICSから廃止されたのじゃなかったっけ?
残骸かな?


USBメモリに焼いて、起動してみる。
安全牌のVESAモード。androidアニメまでは行く。でも、コンソールのカーソルが残っているな。
おっと、ホーム出た!
と思ったら...
"Unfortunately, System UI has sttoped."
だって。
OK押しても、再度出てくる。何回でも同じ。
StatusBarがちゃんと表示できていない。
この部分だけ、マウスカーソルにゴーストが残る。
https://lh4.googleusercontent.com/-xUNGegZhCnc/TthaYCcH7uI/AAAAAAAABqE/hhmPTsOalEk/s640/01%252520-%2525201.jpg
サスペンドに落ちるといつもながら復帰できない。
まだまだだねぇ...


結論としては、たぶんAMD環境じゃないと、マトモに動くものはないって感じ。

Didn't I say this is an iso for *AMD* platform, not work for Intel's?

と、Chih-Wei Huangも言っているし。


@tao_gakuさんに、表の「ゴンタをいじめるな!」と言われてしまったので、このくらいの面白くないところで終わります。
続きはまた今度に(^^;。


そうそう、こんな発言があった。

Yes. AMD provides great support to us, including devices donation and engineer's support.
On the other hand, Intel still refuses to provide any help to this project. They closed all contact windows I've ever tried.
Therefore, if you plan to ship android-x86 product, I recommend the AMD platform, which is the best platform to run ics-x86 so far.

ということで、itmediaの情報に問題がある裏はとれた。