这篇文章用于介绍基于dockerfile文件创建一个docker的编译环境,用于编译Android的源代码。
通常我们搭建环境用于编译的时候遇到的是需要解决编译中的各种依赖环境的问题,如python的版本,Android编译依赖的一些库,使用docker编译的好处就是将这些东西都稳定的集成到了一个系统里面,接下来只需要执行编译就可以了,不会有出错的顾虑。下面介绍一下步骤。

1. dockerfile

对于dockerfile这个文件可以理解它的作用是在docker hub上拉取一个你需要的镜像,并且在这个镜像中加入你在文件中配置的内容,这里的配置在这篇文章就是编译Android需要的一些环境,下面是我使用的dockerfile文件

FROM ubuntu:20.04
MAINTAINER schutz

# Replace APT sources
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y dist-upgrade
RUN apt-get -y install apt-transport-https ca-certificates gnupg2 software-properties-common
# RUN apt-add-repository -y ppa:kelleyk/emacs
RUN apt-get update

# Install tzdata
RUN bash -c 'DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata'
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata

# set locale
RUN apt-get -y install locales
RUN locale-gen zh_CN.UTF-8
RUN locale-gen en_US.UTF-8
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh:en_US:en
ENV LC_ALL=zh_CN.UTF-8
ENV LC_ADDRESS=zh_CN.UTF-8
ENV LC_NAME=zh_CN.UTF-8
ENV LC_MONETARY=zh_CN.UTF-8
ENV LC_PAPER=zh_CN.UTF-8
ENV LC_IDENTIFICATION=zh_CN.UTF-8
ENV LC_TELEPHONE=zh_CN.UTF-8
ENV LC_MEASUREMENT=zh_CN.UTF-8
ENV LC_TIME=zh_CN.UTF-8
ENV LC_NUMERIC=zh_CN.UTF-8
ENV LC_MESSAGES=zh_CN.UTF-8
ENV LC_COLLATE=zh_CN.UTF-8
ENV LC_CTYPE=zh_CN.UTF-8

# Create User & Install sudo
RUN echo "root:root" | chpasswd
RUN apt-get install sudo
RUN useradd --create-home --user-group --comment 'Worker Account' --shell '/bin/bash' worker
RUN adduser worker sudo
ADD sudoers /etc/sudoers
RUN chmod 0440 /etc/sudoers
RUN chown root:root /etc/sudoers

# Install user softwares
RUN apt-get -y install gawk wget git-core git diffstat texinfo flex bison curl
RUN apt-get -y install zip unzip zlib1g-dev lib32z1-dev cpio xz-utils
RUN apt-get -y install build-essential gcc-multilib g++-multilib libc6-dev-i386
RUN apt-get -y install lib32ncurses5-dev libncurses5 x11proto-core-dev libx11-dev
RUN apt-get -y install libgl1-mesa-dev libxml2-utils libssl-dev xsltproc fontconfig
RUN apt-get -y install python3-dev python3-distutils python2-dev python-is-python2
RUN apt-get -y install chrpath socat bc kmod rsync
RUN apt-get -y install iputils-ping net-tools
RUN apt-get -y install nano
RUN apt-get -y install emacs-nox nano


# Install Python module
RUN sudo -u worker -g worker mkdir /home/worker/.pip
ADD .pip/pip.conf /home/worker/.pip/
ADD get-pip2.py /home/worker/
ADD get-pip.py /home/worker/
RUN chown worker:worker /home/worker/.pip
RUN chown worker:worker /home/worker/get-pip2.py
RUN chown worker:worker /home/worker/get-pip.py
RUN sudo -u worker -g worker python2 /home/worker/get-pip2.py
RUN sudo -u worker -g worker python3 /home/worker/get-pip.py
RUN sudo -u worker -g worker python3 -m pip install launchpadlib
RUN sudo -u worker -g worker python3 -m pip install --upgrade pip
RUN sudo -u worker -g worker /home/worker/.local/bin/pip2 install pycrypto
RUN rm /home/worker/get-pip2.py
RUN rm /home/worker/get-pip.py

# Install repo
ADD repo /home/worker/.local/bin/

# End
RUN apt-get clean
USER worker
ENTRYPOINT ["/bin/bash", "--rcfile", "/home/worker/.profile"]

第一行是我需要的镜像,这里选用的是ubuntu20.04,第二行是作者,再往后的内容就是需要加到这个镜像中的配置了,需要注意的是这里的sudo权限配置、Python module以及repo的安装。需要提供我们提供额外的文件,否则dockerfile创建镜像的时候应该会报错。

  1. sudo权限的安装
    在dockerfile同级目录下提供sudoers文件,对应上面命令中的ADD sudoers /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/octagram/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) NOPASSWD:ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
  1. python module安装
    编译Android的时候是需要python环境的,编译过的应该都被这个问题困扰过,因此我们在dockerfile同级目录下提供给一个get-pip2.py,这个文件有点大,两万多行,代码就不贴这里了,可以网上找一下资源。
  2. repo工具的安装
    这个是用于在docker镜像内部进行代码同步用的,通常不会用到,我一般都是直接使用原生机器进行代码同步,docker环境只是用来编译。因此这句可以注释掉。
2. 编译镜像

准备好上面的环境后执行如下命令编译生成一个基于ubuntu20.04的可编译Android的镜像

# 这里的名字自己根据需要来,后面的1.0.0是通过docker images命令看到的TAG,.表示dockerfile文件所在的路径
# 注意一台机器上只有初次创建镜像的时候需要执行这个命令
# 机器没有docker命令可以安装一下,ubuntu环境下使用apt-get安装即可
docker build -t name:1.0.0 .
3. 创建容器
# docker run命令包含了创建容器并将镜像放到容器中启动,执行成功会进入docker 镜像的bash界面
# pwd表示的是本地需要映射到docker中的文件夹位置,/aaos表示映射到镜像中之后的路径
docker run -it -h name -v `pwd`:/aaos name:1.0.0

通常的做法是将Android的系统源码放在当前路径下,比如在当前路径下的wkspc下,这个时候映射到镜像中就会在/aaos/wkspc中看到Android源码

4. 便捷操作

前面镜像创建和容器创建都已经完成了,此时通过docker container ls命令可以看到刚刚创建的容器,名字是随机地,此时我们可以重命名,方便以后直接启动容器。

# 查看当前容器信息
docker container ls
# 如果前面docker run的界面已经被关闭表示容器已经关了,可以通过以下命令查看到创建过的容器
docker ps -a

# 上面两条命令都可以看到CONTAINER ID属性,我们可以根据这个属性对容器重命名
docker container rename container_ID newname

# 再次通过docker ps -a查看可以发现容器名字已经改过来了
5. 总结

有了镜像和容器之后以后每次使用的流程就可以简化为如下:

# 启动容器,如果不记得name,可以通过docker ps -a查看
# 这里启动之后饼没有进入bash界面,可以通过docker container ls看到容器已经在运行
# 使用docker start -i name会启动并直接进入bash界面
docker start name
# 进入容器的bash界面,使用exec的好处是在bash界面执行exit命令,并不会终止容器的运行
docker exec -it name
# 停止容器运行
docker stop name
6. 保存镜像

如果这一套环境放在一个硬盘中,需要在另外一台电脑中进行使用的时候还需要执行一次docker build 创建镜像,为了节省这个时间,可以将本地的镜像保存下来,在另外一台电脑上直接导入,方法如下:

# 保存
docker save images-ID -o name.tar
# 导入
docker load < name.tar
# 查看导入的镜像
docker images
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。