官方文档:http://source.android.com/source/building.html
1 环境配置:
OS: 64bit Ubuntu 12.04 LTS 这里不建议wubi安装
硬盘空间:google的要求是单个版本需要30GB以上的空间,全部版本的需要100GB以上
我使用的是Android 2.3.6,编译完之后实际所占空间是16GB
sahwn@EP43:~$ du -h --max-depth=1 ~/workdir/
6.2G /home/sahwn/workdir/.repo
27M /home/sahwn/workdir/hardware
359M /home/sahwn/workdir/frameworks
1.5M /home/sahwn/workdir/prebuilts
13M /home/sahwn/workdir/ndk
78M /home/sahwn/workdir/cts
54M /home/sahwn/workdir/libcore
35M /home/sahwn/workdir/dalvik
4.0M /home/sahwn/workdir/build
1.4G /home/sahwn/workdir/prebuilt
65M /home/sahwn/workdir/development
4.2M /home/sahwn/workdir/bootable
16M /home/sahwn/workdir/device
32M /home/sahwn/workdir/system
832M /home/sahwn/workdir/external
14M /home/sahwn/workdir/bionic
14M /home/sahwn/workdir/sdk
118M /home/sahwn/workdir/packages
6.6G /home/sahwn/workdir/out
16G /home/sahwn/workdir/
Python 2.6 -- 2.7
GNU Make 3.81 -- 3.82
这两个是系统已经自带了的
sahwn@EP43:~$ python --version
Python 2.7.3
sahwn@EP43:~$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Git 1.7 or newer
实际上后面步骤安装必须包里有
$ sudo apt-get install git
JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both from java.sun.com.
步骤参考:http://blog.youkuaiyun.com/u012840649/article/details/18143567
安装必需包:
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
实际上这一步是有问题的,会删掉桌面显示相关的一些包,导致重启后无法进入桌面, 初步怀疑有问题的包是libgl1-mesa-glx:i386 \ libgl1-mesa-dev这俩
另外64位系统中,应该添加lib32z1-dev包
如下修复:
$ sudo apt-get install ubuntu-desktop xorg
此处待研究。。
配置USB,下面内容保存为 /etc/udev/rules.d/51-android.rules
这一步可选
# 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 stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
2 下载源码
安装Repo:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
此处需翻墙,确保下载的Repo版本为1.20,不然后面会出错$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
For version 1.20, the SHA-1 checksum for repo is e197cb48ff4ddda4d11f23940d316e323b29671c
sahwn@EP43:~/bin$ sha1sum repo
e197cb48ff4ddda4d11f23940d316e323b29671c repo
初始化Repo:
创建一个工作目录,并进入
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.6_r1
硬盘空间不够的还是老老实实加上-b branch版本$ repo sync
这里可能需要花一些时间
如果无法下载,可在/etc/hosts中加入相应配置:
74.125.128.82 www.googlesource.com
74.125.128.82 android.googlesource.com
203.208.37.7 cache.pack.google.com
203.208.37.1 cache.pack.google.com
IP地址可用ping获得
3 编译
$ source build/envsetup.sh
or
$ . build/envsetup.sh
$ lunch
此处会给出若干可选版本
$ make -jN
N是线程数,根据机器配置选择合适的。我这里N=2的情况下,大概1个小时完成。
过程当中会遇到各种问题,参考:http://blog.youkuaiyun.com/u012840649/article/details/18009057
完成后,会在WORKING_DIRECTORY/out/target/product/下生成相应的目录和文件,如下:
sahwn@EP43:~/workdir/out/target/product/passion$ ls
android-info.txt firmware_error.565 previous_build_config.mk root
bitmap_size.txt firmware_install.565 ramdisk.img symbols
boot.img installed-files.txt ramdisk-recovery.img system
clean_steps.mk kernel recovery system.img
data obj recovery.img userdata.img
4 运行
运行模拟器:
sahwn@EP43:~/workdir$ emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7
5 刷机
这里用的手机是N1
重启进入fastboot模式:
$ adb reboot bootloader
解锁bootloader, 解锁之后启动界面会出现一个打开的锁的图形
$ fastboot oem unlock
刷入
$ fastboot flashall -w
error: neither -p product specified nor ANDROID_PRODUCT_OUT set
$ export ANDROID_PRODUCT_OUT= ..../out/target/product/< version_dir >
$ export PATH= ..../out/host/linux-x86/bin:$PATH