Android编译环镜的搭建和编译
第一部分:Android开发环镜的硬件和软件平台
一、开发服务器配置
我用的是自己家里的电脑搭建的编译环镜,主机配置为 i5-3230,4g DDR3 和 500g 硬盘。
二、软件硬件平台选取
选取全志 A20 的硬件方案,作为最基本的硬件平台。使用全志提供的Android 4.4 SDK开发包。
第二部分:构建Android编译环镜
一、开始构建Linux编译环镜
1. 我安装的是Ubuntu Kylin 14.04 AMD64版本(官网上是说要用64位的系统编译)。
2. 编译Gingerbread(2.3.x)以上android版本(包含主流版本),应使用64位系统环境。
3. 在虚拟机上是可以编译android的,但是至少要保证16G的RAM或SWAP和不少于30G的磁盘空间。
4. 安装以下工具:Python 2.6-2.7,GNU Make 3.81-3.82,JDK 6(sun-java6-jdk),Git 1.7 or newer。
备注:1)Python的下载路径:http://www.python.org/download/ ,官网上是推荐安装 2.x 的版本,说 3.x 的版本与repo不兼容,如下官网的截图所示:
但是在Ubuntu Kylin 14.04 的系统中已经自带有 Python 3.4的版本,我就没有安装了,但在后面的使用和编译过程中并没有发现不兼容的情况,所以如果有朋友若遇到不兼容的情况的话可以把它换成 2.x 版本的。如果没有问题就不用换了。Python的安装方法可以使用 sudo apt-get install python 安装,或者在上面的下载网页上下载 .tgz 的包,下载 .tgz 包后的安装方法如下:
例如安装在opt下:
tar -zxvf Python-2.7.6.tgz
cd Python-2.7.6
./configure --prefix=/opt/python2.7.6
make && sudo make install
由于Ubuntu默认就安装了PYTHON,需要设置PATH,使得刚安装的PYTHON先被搜索到:(可以编辑到~/.bashrc)
export PATH=/opt/python2.7.6/bin:$PATH
2)make的下载路径:http://ftp.gnu.org/gnu/make/,也可以直接使用 sudo apt-get install make 进行安装。
二、安装JDK
我是按官网上的步骤安装的,后来发现Android 4.4的编译需要在JDK6的基础上,所以后来又换成JDK6了:
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
由于Ubuntu默认就安装了openjdk,所以通过下面的指令来修改默认的JDK:
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
备注:官方的推荐JDK版本:
Java 6: for Gingerbread through KitKat
Java 5: for Cupcake through Froyo
三、安装依赖包
在Ubuntu Kylin 14.04 上我安装好官方上所提到的12.04的依赖包后,在编译lichee时报下面的错误:
"mkimage" command not found - U-Boot images will not be built
然后我使用 sudo apt-get install uboot-mkimage去安装uboot-mkimage包,但发现在该系统上没有这个包,安装失败,然后提示安装u-boot-tools:i386 和 u-boot-tools这两个包,我把这两个包都安装好之后,lichee编译就可以通过了。所以在14.04的系统比12.04需要多安装这两个包,如下所示:
$ 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 u-boot-tools:i386 u-boot-tools
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
根据官方文档 Ubuntu 12.04需要的安装包为:
$ 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
Ubuntu 10.04 -- 11.10 需要安装的依赖包为:
$ 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 xsltproc
On Ubuntu 10.10:
$ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so
On Ubuntu 11.10
$ sudo apt-get install libx11-dev:i386
四、配置USB设置:
The recommended approach is to create a file /etc/udev/rules.d/51-android.rules
(as
the root user) and to copy the following lines in it. <username>
must
be replaced by the actual username of the user who is authorized to access the phones over USB.
# 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>"
五、配置ccache
在你的.bashrc文件中增加下面的语句:
export USE_CCACHE=1
这时默认的缓存路径是在~/.ccache,当然你也可以保存你自己定义的路径中,自己可以设置你想要存放的路径,在你的.bashrc文件中加入你需要存放的路径:
export CCACHE_DIR=<path-to-your-cache-directory>
我是就存放在我的根目录下的,即:CCACHE_DIR=~/.ccache
建议的ccache大小是50~100G,在你把源代码下下来之后在编译之前需要在android的目录下执行下面的这句代码,这样才能做缓存:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
如果编译的是Ice Cream Sandwich (4.0.x) 或者更旧的版本的话,那么执行下面的这句:
prebuilt/linux-x86/ccache/ccache -M 50G
这个缓存的部分的话你可以设也可以不设,设了的话就可以起到缓存的作用,如果你在执行make clean后再重新编译的话就会为你节省大量的时间,我有做过实验,我在没有设缓存的时候编译和打包花了58分钟的时候,但设了这个缓存后,发现只需要28分钟,确实大大节省了时间。我是在我们的服务器上做的实验。
六、配置输出路径:
可以在你的 .bashrc文件中配置编译的输出路径:
export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>
如果没有配置输出路径的话,那么默认的输出文件是在android/out/target/ 对应的产品下面,贴上这部分官方的文档:
The output directory for each separate source tree will be named after the directory holding the source tree.
For instance, if you have source trees as /source/master1
and /source/master2
and OUT_DIR_COMMON_BASE
is
set to /output
, the output directories will be /output/master1
and /output/master2
.
It‘s important in that case to not have multiple source trees stored in directories that have the same name, as those would end up sharing an output directory, with unpredictable results.
This is only supported on Jelly Bean (4.1) and newer, including the master branch.
第三部分:安装repo,下载源代码
一、安装repo
在你的根目录下创建bin文件夹:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
下载repo,并增加可执行权限:
$ curl http://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo二、下载源代码,全志的源代码分成两部分,分别为lichee和android部分: