http://www.longxk.com/posts/2014/03/18/using-docker-to-build-aosp/
一直以来编译Android(AOSP)都是很蛋疼的事情,不仅要下载体积超大的源代码,还要冒着搞坏系统的风险安装一大堆构建工具。另外如果不是使用Google指定的Linux发行版(目前是Ubuntu 12.04 64bit),还要解决不同的工具版本的问题,比如Arch Linux上就会因为make、Python还有Java的版本不对应造成编译出错,虽然有办法解决,但是会打乱当前系统环境,平添不少麻烦。曾经也用过Virtualbox安装Ubuntu 12.04 64bit来编译AOSP,但是因为性能不好、使用非常不方便而放弃了。Docker在理念上类似于虚拟机,但是却与虚拟机有很大不同,它没有虚拟层,而是直接使用宿主机的内核,因此性能上的损耗很小,启动速度飞快,几乎不耗时,跟宿主机之间共享文件也是非常方便,用来编译AOSP再合适不过了。
如何安装Docker就不多说了,参考这里,基本上主流发行版都支持了。
Arch Linux上安装后需要手动启动docker服务,使用命令:
# systemctl start docker
不过,启动这个服务,Docker会默认将数据文件存放在/var/lib/docker
目录,如果该目录所在的分区不是很大,那么建议将这个目录改到其他容量将大的分区下。首先创建一个新的docker服务
# cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker-alt.service
然后编辑docker-alt.service,将ExecStart=/usr/bin/docker -d
改为ExecStart=/usr/bin/docker -d -g /other/dir
。以后如果需要启动docker服务,就改为启动docker-alt服务,当然也可以让它自动启动:
# systemctl enable docker-alt
然后下载ubuntu的image:
# docker pull ubuntu
使用这个命令会下载13.10, 13.04, 12.10, 12.04四个版本,如果只需要某个版本,如12.04,可以将ubuntu改为ubuntu:12.04。
下载完成后,就可以基于这些image来建立自己的image了,创建任意一个目录,再创建一个名为Dockerfile的文件,加入下列内容:
FROM ubuntu:12.04
ADD sources.list /etc/apt/sources.list
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -qq update
RUN apt-get install -y build-essential g++-multilib
RUN apt-get install -y file git gnupg flex bison gperf zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 openjdk-6-jdk openjdk-6-jre
WORKDIR /var/aosp
保存Dockerfile文件,然后在同目录下新建一个sources.list文件,也就是ubuntu的软件源配置文件,里面根据你所使用的镜像填入对应地址。
接下来就可以构建新的image了,在Dockerfile所在目录运行:
# docker build -t aosp-build .
其中aosp-build为image名称,可随意修改。
等构建完成后,我们就可以在得到的image上运行命令,并创建container了,比如运行一个bash shell,并创建一个在宿主机和container之间共享的目录:
# docker run -v /host/aosp-dir:/var/aosp/source -i -t --name aosp aosp-build bash
这里宿主机上的/host/aosp-dir
目录将会和container中的/var/aosp/source
目录共享,并且使用--name
选项指定了container的名字,以后便可以通过下面的命令再次启动这个container:
# docker start -i -a aosp