日経ITproサイトの記事があんまりなので追試してみた

Android 4.0をx86パソコンで動かしてみよう
http://itpro.nikkeibp.co.jp/article/COLUMN/20120227/383202/?ST=android-dev&mkjt&P=1


読んだ限りでは、これでは、たぶん再現できない。

  • Lucidのsun-java6って消えた。
  • repo コマンドの取得先は変わっている。(ここは通るかも)
  • sync先は普通落ちてる。sfを使うべき。
  • lunchしてないので、ビルドターゲットが明確になっていない。これでも通るのかな?
  • isohybridではgrub細工は余計のような(未確認)。

日経は、いつから編集者が追試しない記事を書くようになったのか...
天野さんも、ちょっと手を抜かないで確認してほしい。
それとも、編集部で「前のをベースにやってみたら出来たので、そのまま加筆修正して転用掲載します」だったのだろうか。


ちょっとあんまりなので、追試をやってみる。
わたしの環境はnattyなので、まだsun-java6はあるようだ。
Partnerからsun-javaを消すよという予告はもう出ている。
http://d.hatena.ne.jp/kinneko/20120113/p31
Important notice regarding Java packages in Partner archive
https://lists.ubuntu.com/archives/ubuntu-security-announce/2011-December/001528.html
アーカイブを見る。
http://archive.canonical.com/pool/partner/s/sun-java6/
lucid 10.04用のパッケージはまだあるな。


リアルに入らないかどうか自信がないので、virtualbox環境で記事と同じlucidを再現してみることにした。
10.04.4のisoを落とす。
ダウンロードページからだと、ukのサーバーを指定された。
遅すぎるので、KDDI研究所から直で取る。
インストールを終え、順次追試。

JDKのインストール

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package sun-java6-jdk is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package sun-java6-jdk has no installation candidate

やっぱり。
10.04.4では提供が止まっている。
古いのを手で入れる。

$ wget http://archive.canonical.com/pool/partner/s/sun-java6/ia32-sun-java6-bin_6.26-2lucid1_amd64.deb
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-bin_6.26-2lucid1_amd64.deb 
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-fonts_6.26-2lucid1_all.deb
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-javadb_6.26-2lucid1_all.deb
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-jdk_6.26-2lucid1_amd64.deb
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-jre_6.26-2lucid1_all.deb
$ wget http://archive.canonical.com/pool/partner/s/sun-java6/sun-java6-plugin_6.26-2lucid1_amd64.deb

bin, jre, jdkのみが必要だったと思う。

kinneko@kinneko-desktop:~$ sudo dpkg -i sun-java6-bin_6.26-2lucid1_amd64.deb sun-java6-jre_6.26-2lucid1_all.deb sun-java6-jdk_6.26-2lucid1_amd64.deb 
[sudo] password for kinneko: 
Selecting previously deselected package sun-java6-bin.
(Reading database ... 124906 files and directories currently installed.)
Unpacking sun-java6-bin (from sun-java6-bin_6.26-2lucid1_amd64.deb) ...
Selecting previously deselected package sun-java6-jre.
Unpacking sun-java6-jre (from sun-java6-jre_6.26-2lucid1_all.deb) ...
sun-dlj-v1-1 license has already been accepted
Selecting previously deselected package sun-java6-jdk.
Unpacking sun-java6-jdk (from sun-java6-jdk_6.26-2lucid1_amd64.deb) ...
sun-dlj-v1-1 license has already been accepted
dpkg: dependency problems prevent configuration of sun-java6-bin:
 sun-java6-bin depends on unixodbc; however:
  Package unixodbc is not installed.
dpkg: error processing sun-java6-bin (--install):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of sun-java6-jre:
 sun-java6-jre depends on java-common (>= 0.24); however:
  Package java-common is not installed.
 sun-java6-jre depends on sun-java6-bin (>= 6.26-2lucid1) | ia32-sun-java6-bin (>= 6.26-2lucid1); however:
  Package sun-java6-bin is not configured yet.
  Package ia32-sun-java6-bin is not installed.
dpkg: error processing sun-java6-jre (--install):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of sun-java6-jdk:
 sun-java6-jdk depends on sun-java6-bin (>= 6.26-2lucid1); however:
  Package sun-java6-bin is not configured yet.
dpkg: error processing sun-java6-jdk (--install):
 dependency problems - leaving unconfigured
Processing triggers for desktop-file-utils ...
Processing triggers for python-gmenu ...
Rebuilding /usr/share/applications/desktop.POSIX.cache...
Processing triggers for shared-mime-info ...
Processing triggers for doc-base ...
Processing 26 changed 1 added doc-base file(s)...
Registering documents with scrollkeeper...
Processing triggers for python-support ...
Errors were encountered while processing:
 sun-java6-bin
 sun-java6-jre
 sun-java6-jdk

あら、何か足りない。
経験的には以下かな。

gsfonts-x11 java-common odbcinst odbcinst1debian2 unixodbc

まぁ、パッケージ管理システムに調整をまかせる。

kinneko@kinneko-desktop:~$ sudo apt-get install -f
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following extra packages will be installed:
  java-common odbcinst odbcinst1debian1 unixodbc
Suggested packages:
  default-jre equivs libmyodbc odbc-postgresql tdsodbc unixodbc-bin
The following NEW packages will be installed:
  java-common odbcinst odbcinst1debian1 unixodbc
0 upgraded, 4 newly installed, 0 to remove and 24 not upgraded.
3 not fully installed or removed.
Need to get 391kB of archives.
After this operation, 1540kB of additional disk space will be used.
Do you want to continue [Y/n]? 
(snip)

debian2ではなく、debian1ってのが入った。

その他、ビルドに必要なパッケージのインストール

目的は追試なので、書いてあるとおりに入れる。
こんなに書かなくても依存関係で自動処理できるものもあるような気がする。

kinneko@kinneko-desktop:~$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils python-libxml2 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
gnupg is already the newest version.
zip is already the newest version.
libc6-dev is already the newest version.
Note, selecting lib32z1-dev instead of lib32z-dev
The following extra packages will be installed:
  dpkg-dev fakeroot g++ g++-4.4 g++-4.4-multilib gcc-4.4-multilib gcc-multilib
  lib32asound2 lib32bz2-1.0 lib32gcc1 lib32gomp1 lib32ncurses5 lib32readline5
  lib32stdc++6 lib32v4l-0 lib32z1 lib32z1-dev libc6-dev-i386 libc6-i386
  libdigest-sha1-perl libdrm-dev liberror-perl libncurses5-dev
  libpthread-stubs0 libpthread-stubs0-dev libstdc++6-4.4-dev libxau-dev
  libxcb1-dev libxdmcp-dev m4 mesa-common-dev mingw32-binutils mingw32-runtime
  patch x11proto-input-dev x11proto-kb-dev xtrans-dev xz-utils
Suggested packages:
  bison-doc debian-keyring debian-maintainers gcc-4.4-doc libstdc++6-4.4-dbg
  lib32stdc++6-4.4-dbg lib32mudflap0 git-doc git-arch git-cvs git-svn
  git-email git-daemon-run git-gui gitk gitweb lib32asound2-plugins
  libstdc++6-4.4-doc gcc-doc cpp-doc diffutils-doc python-libxml2-dbg
The following NEW packages will be installed:
  bison build-essential curl dpkg-dev fakeroot flex g++ g++-4.4
  g++-4.4-multilib g++-multilib gcc-4.4-multilib gcc-multilib git-core gperf
  ia32-libs lib32asound2 lib32bz2-1.0 lib32gcc1 lib32gomp1 lib32ncurses5
  lib32ncurses5-dev lib32readline5 lib32readline5-dev lib32stdc++6 lib32v4l-0
  lib32z1 lib32z1-dev libc6-dev-i386 libc6-i386 libdigest-sha1-perl libdrm-dev
  liberror-perl libgl1-mesa-dev libncurses5-dev libpthread-stubs0
  libpthread-stubs0-dev libstdc++6-4.4-dev libx11-dev libxau-dev libxcb1-dev
  libxdmcp-dev m4 mesa-common-dev mingw32 mingw32-binutils mingw32-runtime
  patch python-markdown tofrodos x11proto-core-dev x11proto-input-dev
  x11proto-kb-dev xtrans-dev xz-utils zlib1g-dev
The following packages will be upgraded:
  libxml2-utils python-libxml2
2 upgraded, 55 newly installed, 0 to remove and 22 not upgraded.
Need to get 109MB of archives.
After this operation, 458MB of additional disk space will be used.
Do you want to continue [Y/n]? 
(snip)

repoの取得

kinneko@kinneko-desktop:~$ cd $HOME 
kinneko@kinneko-desktop:~$ mkdir bin 
kinneko@kinneko-desktop:~$ curl http://android.git.kernel.org/repo >~/bin/repo 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
122   244  122   244    0     0    142      0  0:00:01  0:00:01 --:--:--  1016
kinneko@kinneko-desktop:~$ chmod a+x ~/bin/repo 

リポジトリの初期化と取得

kinneko@kinneko-desktop:~$ mkdir android-x86-4.0 
kinneko@kinneko-desktop:~$ cd android-x86-4.0/
kinneko@kinneko-desktop:~/android-x86-4.0$ repo init -u http://git.android-x86.org/manifest -b ics-x86 
/home/kinneko/bin/repo: line 1: syntax error near unexpected token `newline'
/home/kinneko/bin/repo: line 1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'

ここで引っかかるとは思わなかった..
repoが違うからかな?
repoは、新しい配布元になって、もともとのところで配布しているものとは微妙に違うものになっている。
新しいrepoを入れる。

kinneko@kinneko-desktop:~/android-x86-4.0$ wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
--2012-03-08 13:07:42--  https://dl-ssl.google.com/dl/googlesource/git-repo/repo
Resolving dl-ssl.google.com... 74.125.31.93, 74.125.31.136, 74.125.31.190, ...
Connecting to dl-ssl.google.com|74.125.31.93|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19933 (19K) [application/octet-stream]
Saving to: `repo'

100%[======================================>] 19,933      56.3K/s   in 0.3s    

2012-03-08 13:08:24 (56.3 KB/s) - `repo' saved [19933/19933]

kinneko@kinneko-desktop:~/android-x86-4.0$ chmod a+x repo
kinneko@kinneko-desktop:~/android-x86-4.0$ ./repo init -u http://git.android-x86.org/manifest -b ics-x86
kinneko@kinneko-desktop:~/android-x86-4.0$ ./repo sync
(snip)

通った。
これについては、android-x86.orgは落ちていることが多いので、android-x86.git.sf.netを使う方がいいと思う。
広く読まれる記事に書くならなおさらだろう。

$ ../repo init -u git://android-x86.git.sf.net/gitroot/android-x86/x86/platform/manifest.git -b ics-x86

syncについても、サーバーに負荷をかけるが、sf.netを選んだ時には、-jを指定して並列にやったほうがいい。

grubへのパッチは必要?

記事には、

 続いて、USBイメージのブートローダーを設定する部分を確認します。デフォルトだと起動しないので以下のように変更します。

という部分があるが、これはisohybrid patchが採用されてから不要になった。
これが面倒だけどって開発チームに言ったら、usb_imgは開発では使ってないって言われた。
そして、isohybridを使うことになったの。
そもそも、usb_imgで作らないのに、どうして必要なのだろう?
だから追試でもここはやらないことにする。

ビルドしてみる

HoneycombとICS以降は、generic_x86がなくなって、明確にターゲットを指定してビルドするように変更になった。
普通は以下のような手順をとる。

$ source build/envsetup.sh
$ lunch eeepc
$ time make -j12 iso_img

記事では、いきなりmakeしている。
通る気がしないけど、プリセットで通る可能性もあるのでやってみる。

kinneko@kinneko-desktop:~/android-x86-4.0$ make -j`grep 'processor' /proc/cpuinfo | wc -l` iso_img 
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
TARGET_PRODUCT=generic_x86
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=IML74K
============================================
Checking build tools versions...
(snip)

なんか通ったなぁ...
でも、これ、プロジェクトと関係ないターゲットじゃないか?
これで、eeepc.isoができるはずもないし... orz
できたものは、マウスポインタなしになるかな。
あと、isoはできないだろ。
ターゲットなしで、エラーにならないのが不思議。

/tmp/ccZ9NS7o.s: Assembler messages:
/tmp/ccZ9NS7o.s:182752: Fatal error: can't write out/target/product/generic_x86/obj/STATIC_LIBRARIES/libLLVMTransformUtils_intermediates/PromoteMemoryToRegister.o: No space left on device
/tmp/ccZ9NS7o.s:182752: Fatal error: can't close out/target/product/generic_x86/obj/STATIC_LIBRARIES/libLLVMTransformUtils_intermediates/PromoteMemoryToRegister.o: No space left on device
make: *** [out/target/product/generic_x86/obj/STATIC_LIBRARIES/libLLVMTransformUtils_intermediates/PromoteMemoryToRegister.o] Error 1
make: *** Waiting for unfinished jobs....
external/llvm/lib/Transforms/Utils/SimplifyCFG.cpp:2912: fatal error: error writing to /tmp/ccCoxmcC.s: No space left on device
compilation terminated.
make: *** [out/target/product/generic_x86/obj/STATIC_LIBRARIES/libLLVMTransformUtils_intermediates/SimplifyCFG.o] Error 1
kinneko@kinneko-desktop:~/android-x86-4.0$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             15775132  14969784      4020 100% /

と、思ったら、ディスクがいっぱいになった... orz
16GBじゃ足りなかったか...
拡張してもっかいだな。


イメージの拡張に失敗したので、もう一度最初からやり直した... orz


おお?
ちゃんと、iso image作ってら、どういうことだろう。
前はビルド中にtagetがないっていうエラーで落ちてたのにな。

/bin/bash: isohybrid: command not found
isohybrid not found.
Install syslinux 4.0 or higher if you want to build a usb bootable iso.

ああ、lucidのsyslinuxってば、isohybrid対応じゃないや...
2:3.63+dfsg-2ubuntu3だった。4.0系が必要なのだな。
出来たddでiso書いて動くのか?


出てきたのは、こんなの。

$ ls -lh out/target/product/generic_x86/generic_x86.iso
-rw-r--r-- 1 kinneko kinneko 294M Mar  8 23:11 out/target/product/generic_x86/generic_x86.iso
$ file out/target/product/generic_x86/generic_x86.iso
out/target/product/generic_x86/generic_x86.iso: # ISO 9660 CD-ROM filesystem data 'Android-x86 LiveCD             ' (bootable)

起動してみる

できたisoイメージを仮想マシンの外にhttp転送して、virtualboxで起動してみる。
起動はしてきたけど、マウスポインタはないみたい。
おそらく、AOSPのx86ビルドになっているのじゃないだろうか。
というわけで、初期画面から一歩も先に進めない。
残念な結果。
USBに焼くのはisohybridしていないので、そもそも可能性がなく試していない。


追試の結果は予想外の部分もあったけど、動かないということについては結果は予想とおり。
普通の人には動作するビルドを再現できませんでした。

正しい手順のおさらい

isohybridの件はおいておく。
環境をセットアップするスクリプトを実行する。

$ source build/envsetup.sh
including device/amd/common/vendorsetup.sh
including device/asus/common/vendorsetup.sh
including device/hp/tx2500/vendorsetup.sh
including device/lenovo/s103t/vendorsetup.sh
including device/tegatech/tegav2/vendorsetup.sh
including sdk/bash_completion/adb.bash

ターゲットとして、現在選べるのは以下の8種類。

  • vbox_x86-eng
  • amd_brazos-eng
  • eeepc-eng
  • asus_laptop-eng
  • tx2500-eng
  • s103t-eng
  • tegav2-eng

自分のマシンに近いものを選ぶか、自分でターゲット定義を書く。
それは、そんなに難しくはない。
テストには、汎用的なeeepcを選ぶのが無難。

$ lunch eeepc-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
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=IML74K
============================================

ビルドする。

$ make -j12 iso_img
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
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=IML74K
============================================
(snip)