Android 4 (Ice Cream Sandwich) をビルドしてみる
Ubuntu 11.10 (64bit) で Android 4.0.1 (Ice Cream Sandwich) を構築してみます。
VMware Fusion 上の、Ubuntu 11.10 で Memory 2G, CPU 2 core, Disk 80G でビルドしてみました。コンパイル後の Disk使用量を調べると 23G ぐらい。ビルド時間は、以下のファイルのリストから何となく想像を〜(ちゃんと計っていなかったので)
$ du -sk 22940084 . $ ls -l build/envsetup.sh -rw-rw-r-- 1 shin user 28590 2011-11-17 22:40 build/envsetup.sh $ ls -l out/target/product/generic/*.img -rw-rw-r-- 1 shin user 162909 2011-11-18 00:43 out/target/product/generic/ramdisk.img -rw------- 1 shin user 170157504 2011-11-18 01:09 out/target/product/generic/system.img -rw------- 1 shin user 20482140 2011-11-18 02:23 out/target/product/generic/userdata-qemu.img -rw------- 1 shin user 80256 2011-11-18 00:46 out/target/product/generic/userdata.img $
必要なパッケージのインストール
JDKやコンパイルに必要なパッケージをインストールします。
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk $ 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 lib32readline-gplv2-dev lib32z-dev \ > libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ > libxml2-utils $ vi /etc/udev/rules.d/51-android.rules
<username>には、有効なアカウントを指定する。
# adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" # adb protocol on maguro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>" # fastboot protocol on maguro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
ソースのダウンロード
リポジトリーからソースをダウンロードします。ユーザー名等は適切なものを入力する。
$ mkdir ~/bin $ PATH=~/bin:$PATH $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo $ mkdir ~/android4 $ cd ~/android4 $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 ... Your Name [Shin]: <cr> Your Email [shin@ubuntu.(none)]: shin@example.com Your identity is: Shin <shin@example.com> is this correct [y/n]? y Enable color display in this user account (y/n)? y ... $ repo sync $ gpg --import
-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.2.2 (GNU/Linux) mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5 jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4 MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9 b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI 2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+ OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM= =Wi5D -----END PGP PUBLIC KEY BLOCK-----
コントロールD(^D)でキーの登録を完了する。ほかに、git の設定とかちゃんとするとよいのかも、でも、ビルドしてみるだけなので省略。
ビルド
Ubuntu 11.10 でビルドする場合、コンパイルエラーになる。そこで、以下のソースを修正します。
◎ build/core/combo/HOST_linux-x86.mk 【56行目】 -HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 +HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 ◎ external/gtest/include/gtest/internal/gtest-param-util.h 【40行目】 #include <vector> +#include <cstddef> #include <gtest/internal/gtest-port.h> ◎ external/oprofile/libpp/format_output.h 【94行目】 - mutable counts_t & counts; + counts_t & counts; ◎ frameworks/compile/slang/Android.mk 【22行目】 -local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror +local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter ◎ external/llvm/lib/Support/Mutex.cpp 【16行目】 #include "llvm/Config/config.h" #include "llvm/Support/Mutex.h" +#undef ENABLE_THREADS +#undef HAVE_PTHREAD_H ◎ external/llvm/lib/Support/Signals.cpp 【28行目】 } +#undef HAVE_DLFCN_H + // Include the platform-specific parts of this class. #ifdef LLVM_ON_UNIX #include "Unix/Signals.inc" ◎ external/llvm/lib/Support/Threading.cpp 【19行目】 #include "llvm/Support/Mutex.h" #include "llvm/Config/config.h" #include <cassert> +#undef LLVM_MULTITHREADED using namespace llvm;
ビルドに必要な環境をロードして、ビルドタイプを指定する(今回は full-eng)。CPUコアの数によって、同時にいくつのスレッドで困憊するか指定する(今回は 2スレッド)。
$ source build/envsetup.sh $ lunch full-eng $ make -j2
テスト
とりあえず、ビルドが完了したのでエミュレータを起動してみる。
$ emulator
デバイスにロードしてテスト。。。
$ adb reboot bootloader $ fastboot flashall -w
参照
http://source.android.com/source/initializing.html http://source.android.com/source/downloading.html http://source.android.com/source/building.html