Android 4.0.3のソースからターゲット"Nexus S"を生成

去年2011年12月17日にAndroid4.0.3(Android-4.0.3_r1)のソースが公開されました。Galaxy Nexusの他にNexus Sなど多くのデバイスに対応しています。このソースをダウンロードし、ターゲットNexus S(crespo)を生成して実機にインストールしてみました。

以下、android-building@googlegroups.com(https://groups.google.com/group/android-building)へのAndroid4.0.3ソース公開の投稿です。
(抜粋。全文はこのページ末尾の[参考1.]に掲載)
http://groups.google.com/group/android-building/msg/d73844b1c48f07bb?pli...



The source code for Android 4.0.3 is now available
Jean-Baptiste Queru 2011年12月17日, 午前6:53

I'm pushing the source code for Android 4.0.3 to AOSP. This matches build IML74K. Kernel sources will follow as soon as practical.
Over the years, I've released 50 different versions of Android in AOSP, not counting the SDK and CTS, and I think that this is the best release ever.

[ インストール後、起動した時の画面 ] * 言語は英語のままの設定です
1) 起動時のbootanimation画面 2) ホーム画面 3) アプリ画面(アプリが少ない) 4) バージョン情報

以下、Fedora15(64ビット版)で行なったダウンロード、コンパイル、インストールの手順です。
以前に4.0.1のソースからターゲットmaguroを生成した時のホスト環境をそのまま使ったので、今回はスムーズにコンパイルできました。

前回との違いは、
・OpenJDKではなく Java SE 1.6 を使用→ CTS(Compatibility Test Suite)のコンパイルエラーが出なくなりました。
・ソースコードのコンパイルエラーが新たに1箇所あり → ホストのツールなので、取りあえず external/mesa3d/Android.mkをコメントに
・実機Nexus Sに生成イメージをインストール → /system/vendorディレクトリの下にシェアードライブラリを追加

[ダウンロード]

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > repo
$ chmod 755 repo
$ ./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
$ ./repo sync

$ ls -F
Makefile  bionic/    build/  dalvik/       device/  external/    hardware/  ndk/       prebuilt/  sdk/
abi/      bootable/  cts/    development/  docs/    frameworks/  libcore/   packages/  repo*      system/
$ du -sh .
12G	.

[コンパイル]

ソースは外部USBディスクに置いて、インテル Core i5-450M プロセッサー(動作周波数:2.40GHz)、メモリー4GBのノートPCでコンパイルしました。
コンパイルに要した時間は約2時間から2時間半くらいでした。

$ . build/envsetup.sh
including device/moto/stingray/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
including device/samsung/crespo4g/vendorsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/toro/vendorsetup.sh
including device/samsung/tuna/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash

$ lunch
You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_stingray-userdebug
     5. full_wingray-userdebug
     6. full_crespo-userdebug
     7. full_crespo4g-userdebug
     8. full_maguro-userdebug
     9. full_toro-userdebug
     10. full_tuna-userdebug
     11. full_panda-eng

Which would you like? [full-eng] 6

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
TARGET_PRODUCT=full_crespo
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IML74K
============================================

$ make -j4
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
TARGET_PRODUCT=full_crespo
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IML74K
============================================
Checking build tools versions...
.....................................
(コンパイルエラーについては、新たなエラー1箇所があった以外は前回4.0.1の時と同じでした。新たなエラー1箇所については→参考3.)

$ ls -F
Makefile  bootable/  dalvik/       docs/        hardware/  out/       repo*    v8.log
abi/      build/     development/  external/    libcore/   packages/  sdk/
bionic/   cts/       device/       frameworks/  ndk/       prebuilt/  system/
$ du -sh .
25G	.
$ ls -F out/target/product/crespo/
android-info.txt  data/                obj/                      ramdisk.img   root/     system.img
boot.img          installed-files.txt  previous_build_config.mk  recovery/     symbols/  userdata.img
clean_steps.mk    kernel               ramdisk-recovery.img      recovery.img  system/
$ du -sh out
13G	out

[実機へインストール]

$ ANDROID_PRODUCT_OUT=<ソースコードのルート>/out/target/product/crespo
$ export ANDROID_PRODUCT_OUT
$ adb reboot bootloader
$ fastboot devices
313574A56D7B00EC	fastboot
$ fastboot -w flashall
--------------------------------------------
Bootloader Version...: I9020XXKL1
Baseband Version.....: I9020XXKI1
Serial Number........: 313574A56D7B00EC
--------------------------------------------
checking product...
OKAY [  0.001s]
checking version-bootloader...
OKAY [  0.001s]
checking version-baseband...
OKAY [  0.001s]
sending 'boot' (3444 KB)...
OKAY [  0.463s]
writing 'boot'...
OKAY [  0.479s]
sending 'recovery' (3772 KB)...
OKAY [  0.506s]
writing 'recovery'...
OKAY [  0.519s]
sending 'system' (147686 KB)...
OKAY [ 19.706s]
writing 'system'...
OKAY [ 21.032s]
erasing 'userdata'...
OKAY [  0.222s]
erasing 'cache'...
OKAY [  1.670s]
rebooting...

finished. total time: 44.603s

[実機の起動]

上記の手順で生成イメージをインストールして実機を立ち上げたところ、"Unfortunately, Launcher has stopped."のエラーメッセージが表示されてLauncherが起動せず、ホーム画面が表示できませんでした。

adbコマンドで実機のshellに接続し、logcat(/system/bin/logcat)コマンドで確認したところ、/system/lib/egl/libGLES_android.so をロードする時に /system/vendor/lib/eglの下のシェアードライブラリ(まずは/vendor/lib/egl/libEGL_POWERVR_SGX540_120.soを参照する)が無いために、ActivityManager → dalvikvm → Launcher → libGLES_android.so と処理されるところで dalvikvm が exception を検知し、ActivityManager が Launcher を終了させてしまうのが原因でした。
(logcatのメッセージとしては、<ソースのルート>/frameworks/base/core/java/android/view/HardwareRenderer.javaの中の538行目のinitializeEgl()の実行に失敗する)
SurfaceFlingerもエラーを出し、WindowManagerもWarningを出していました。

参考:
1)
LD_LIBRARY_PATH には /vendor/lib(/system/vendor/lib) と /system/lib が設定されています。

$ ./adb shell
shell@android:/ $ PATH=/data/local/bin:$PATH  ← busyboxをインストールして使っています。
shell@android:/ $ su              ← ソースからコンパイルしたイメージをインストールした場合はrootになれます。
shell@android:/ # grep LD_LIBRARY_PATH /init.rc
    export LD_LIBRARY_PATH /vendor/lib:/system/lib
shell@android:/ # ls -l /vendor
lrwxrwxrwx    1 0        0               14 Jan 13 23:23 /vendor -> /system/vendor

2)
WindowManagerについて
http://www.mail-archive.com/android-framework@googlegroups.com/msg01699....

The window manager creates surfaces for the application, and applications draw directly into those surfaces without going through the window manager.

3)
/system/app/Launcher2.apkのソース
<ソースのルート>/packages/apps/Launcher2/src/com/android/launcher2/

/system/lib/egl/libGLES_android.soのソース
<ソースのルート>/frameworks/base/opengl/libagl/

http://ja.wikipedia.org/wiki/OpenGL_ES
OpenGL ES(OpenGL for Embedded Systems)は、3Dコンピューターグラフィックス用 API である OpenGL のサブセットであり、主に携帯電話などの組み込みシステムで広く使用される。OpenGL と同様にクロノス・グループによって管理されている。

そこで公式版4.0.3の/system/vendorの下をtarファイルにとっておき、それを/mnt/sdcardにコピーし、/systemの下にvendor以下を展開しました。
(公式版2.3.6のフルアップデートと公式版4.0.3の差分アップデートから、bspatchコマンドを使用するなどしても作成できると思いますが、再度、公式版4.0.3をインストールし直し、その後にコンパイルしたイメージをまたインストールし直しでも、その方が簡単そうだったので。)
これで再起動したところ、うまく動きました。

shell@android:/ # mount | grep system
/dev/block/platform/s3c-sdhci.0/by-name/system /system ext4 ro,relatime,barrier=1,data=ordered 0 0
shell@android:/ # mount -o remount,rw /dev/block/platform/s3c-sdhci.0/by-name/system /system
shell@android:/ # mount | grep system                                          
/dev/block/platform/s3c-sdhci.0/by-name/system /system ext4 rw,relatime,barrier=1,data=ordered 0 0
shell@android:/ # cd /system
shell@android:/ # mv vendor vendor.orig
shell@android:/ # tar zxvf /mnt/sdcard/official4.0.3-system.vendor.tar.gz
./vendor/
./vendor/bin/
./vendor/bin/gpsd
.....................

* ソースからコンパイルした場合の/system/vendorの下と、公式版4.0.3の/system/vendorの下のファイルの比較はこちらに → 参考5.

ベンダーのプロプライエタリなプログラムはソースコードには含まれておらず、後から追加する必要があるようです。
proprietary binariesについては以下のgoogleのサイトに記述があり、この手順に従うのが本来の方法かも知れません。
近々試してみようと思います。 → 次回のブログ に載せました (追記:1/17/2012)

http://source.android.com/source/building-devices.html
http://code.google.com/intl/ja/android/nexus/drivers.html#crespo

参考:
1. Android4.0.3ソース公開の投稿の全文

The source code for Android 4.0.3 is now available
Jean-Baptiste Queru 2011年12月17日, 午前6:53

I'm pushing the source code for Android 4.0.3 to AOSP. This matches build IML74K. Kernel sources will follow as soon as practical.
Over the years, I've released 50 different versions of Android in AOSP, not counting the SDK and CTS, and I think that this is the best release ever.

Some noteworthy items:
-This version of Android is optimized for a wide range of devices. It works on phones. It works on tablets. It works on devices that don't quite have the horsepower of a Galaxy Nexus.
-From a straight AOSP, it works on Galaxy Nexus (the ones sold with mysid and yakju builds), on Motorola Xoom (US variants), and on Nexus S (all variants). Proprietary binaries will soon be available for those devices at the usual location.
-Out of the box, this is the first time that AOSP works on 3 different device families, the first time that it works on tablets, the first time that it works directly on a device that's neither an ADP nor a Nexus, and the first time that it works on Verizon devices.

JBQ

2. Java SE 1.6は以下からダウンロード

http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u30-downloa...
 ・jdk-6u30-linux-x64-rpm.bin (64ビット版) ← こちらを使用
 ・jdk-6u30-linux-i586-rpm.bin (32ビット版)

3. 新たなコンパイルエラーと対処

ホスト側のツール glsl_compiler を生成する過程でのエラーのようです。ホストの開発環境/コンパイラとソースコードの整合性の問題かも知れません。
とりあえず、ここはAndroid.mkをコメントにして外して進めました。

参考:
GLSL: http://ja.wikipedia.org/wiki/GLSL
GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語をベースとした高レベルシェーディング言語である。

Mesa: http://www.mesa3d.org/
Mesa is an open-source implementation of the OpenGL specification - a system for rendering interactive 3D graphics.

(エラーの抜粋)
external/mesa3d/src/glsl/linker.cpp:1394:49: エラー: expected primary-expression before ‘,’ token
external/mesa3d/src/glsl/linker.cpp:1394:50: エラー: ‘varyings’ was not declared in this scope
external/mesa3d/src/glsl/linker.cpp:1394:58: エラー: ‘offsetof’ was not declared in this scope
...............
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] エラー 1

(対処)
<ソースのルート>/external/mesa3d/Android.mkの全行の行頭に#を付けてコメントにした。

4. 最初からコンパイルをやり直す場合のmakeの擬似ターゲット

参考:<ソースのルート>/build/core/build-system.html

make clean

- make clean deletes all of the output and intermediate files for this configuration. This is the same as rm -rf out/<configuration>/

make clobber

- make clobber deletes all of the output and intermediate files for all configurations. This is the same as rm -rf out/.

5. ソースからコンパイルした場合の/system/vendorの下と、公式版4.0.3の/system/vendorの下のファイルの比較

[ソースからコンパイルした場合の/system/vendorの下]

shell@android:/ $ ls -RF /system/vendor.orig
/system/vendor.orig/:
etc/ firmware/

/system/vendor.orig/etc:
gps.xml

/system/vendor.orig/firmware:
fw_bcm4329.bin hdcp.keys@ samsung_mfc_fw.bin
fw_bcm4329_apsta.bin nvram_net.txt

[公式版4.0.3の/system/vendorの下]

shell@android:/ $ ls -RF /system/vendor
/system/vendor:
bin/ etc/ firmware/ lib/

/system/vendor/bin:
gpsd* pvrsrvinit*

/system/vendor/etc:
gps.xml

/system/vendor/firmware:
bcm4329.hcd fw_bcm4329_apsta.bin nvram_net.txt
cypress-touchkey.bin hdcp.keys@ samsung_mfc_fw.bin
fw_bcm4329.bin libpn544_fw.so

/system/vendor/lib:
drm/ libpvr2d.so
egl/ libpvrANDROID_WSEGL.so
hw/ libsec-ril.so
libIMGegl.so libsrv_init.so
libPVRScopeServices.so libsrv_um.so
libWVStreamControlAPI_L3.so libusc.so
libakm.so libwvdrm_L3.so
libglslcompiler.so libwvm.so

/system/vendor/lib/drm:
libdrmwvmplugin.so

/system/vendor/lib/egl:
libEGL_POWERVR_SGX540_120.so libGLESv2_POWERVR_SGX540_120.so
libGLESv1_CM_POWERVR_SGX540_120.so

/system/vendor/lib/hw:
gps.s5pc110.so gralloc.s5pc110.so

6. 公式版4.0.3をroot化する方法

http://juggly.cn/archives/49072.html
http://forum.xda-developers.com/showthread.php?t=1396959