使用Docker编译Android系统源码

引言:

最近公司业务转型,开始倒腾起安卓系统,做了几个月的安卓APP开发,最近又需要做系统定制,所以撸起袖子搞起…
首先干嘛?部署开发环境,开发环境一直是让人头疼的问题,何况我们不只需要一套环境,这样整来整去很容易就把系统玩废了,一旦出了问题就等着崩溃吧。所以借着这几年火起来的docker布置一个我们的开发环境。
其实环境配置大同小异,我们只是需要把编译环境配置在docker中就可以了,在这里只做记录,过程仅供参考。

我的系统环境: Ubuntu 16.04 LTS - x64
需要编译的系统: Android 5.1 Lollipop

安装Docker

首先进入docker官网(https://www.docker.com/products/overview),按照里面的提示进行安装即可,我直接下载的.deb包进行安装的,下载地址(https://apt.dockerproject.org/repo/pool/main/d/docker-engine/)。
安装完成后执行以下命令检查docker版本:


$ dpkg -i docker-engine_17.05.0~ce-0~ubuntu-trusty_amd64.deb
$ sudo docker --version    
 
 
  • 1

配置Docker

< 此步骤可以跳过 >

使用Docker加速器

DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。

使用前请先确保您的 Docker 版本在 1.8 或更高版本,否则无法使用加速。

linux

自动配置 Docker 加速器(推荐)

适用于 Ubuntu14.04以上、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1

登陆后运行 配置命令 此命令会帮助您配置 registry-mirror 。

在配置完成后,请根据终端中的提示重启 docker,以使配置生效。

手动配置 Docker 加速器

适用于各种 Linux 发行版

Docker 版本在 1.12 或更高

创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 (请将 加速地址 替换为在加速器页面获取的专属地址)

{
    "registry-mirrors": [
        "加速地址"
    ],
    "insecure-registries": []
}

Docker 版本在 1.8 与 1.11 之间

您可以找到 Docker 配置文件,不同的 Linux 发行版的配置路径不同,具体路径请参考 Docker官方文档,在配置文件中的 DOCKER_OPTS 加入

--registry-mirror=加速地址 
重启Docker,不同的 Linux 发行版的重启命令不一定相同,一般为
service docker restart

注意!

以上对应于两个不同 docker 版本的配置方式不能同时配置,否则在 docker 启动的时候将报错无法启动,解决方式是将后者配置文件里面的 registry-mirror 参数去掉并保存,只留前面的 daemon.json 的配置方式(这也是官方推荐的配置方式)。之后再重启 docker 即可解决。

避免输入sudo

用过docker的人知道,我们再执行docker命令的时候需要使用sudo权限,命令输的多了还是挺麻烦的,因此避免输入sudo的方法如下:

$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service  docker restart
# 若提示 /var/run/docker.sock 无权限,执行以下命令:
$ sudo chmod a+rw /var/run/docker.sock
 
 
  • 1
  • 2

说明:为了统一,下面的命令都会带 sudo 执行。

安装基础镜像

由于我们编译的是Android 5.1系统,推荐使用Ubuntu 14.04 x64系统去编译,可以省去很多麻烦(比如:编译器版本、构建套件版本、依赖库版本等不兼容的问题),这也是我们使用docker的原因。
执行以下命令获取镜像:

$ sudo docker pull ubuntu:14.04    # docker默认都是64位系统
 
 
  • 1

镜像系统基础配置

< 此步骤可以跳过 >
在安装完基础镜像之后,我们可以对镜像系统做一些基础性的修改,可以方便我们进一步的使用。

简单的docker操作

在配置之前有必要说以下docker的简单命令:

# 查询本地已有的镜像(注意 镜像编号-IMAGE ID)
$ sudo docker images   
# 输出如下:
REPOSITORY  TAG       IMAGE ID       CREATED       SIZE
ubuntu      14.04     b969ab9f929b   5 weeks ago   188 MB
 
 
  • 1
# 查看本地所有的容器(注意 容器编号-CONTAINER ID)
$ sudo docker ps -a    
# 输出如下:
CONTAINER ID   IMAGE         COMMAND      CREATED       STATUS                  PORTS   NAMES
820fe6f58817   ubuntu:14.04  "/bin/bash"  42 hours ago  Exited (0) 25 hours ago         epic_bell
 
 
  • 1
  • 2
# 启动镜像,并获取一个伪终端
# 注意:实际启动的是容器,启动镜像时会自动创建新容器并启动。
$ sudo docker run -it <REPOSITORY:TAG> /bin/bash   # 使用  仓库名+标签 启动
$ sudo docker run -it <IMAGE ID> /bin/bash     # 使用 IMAGE ID 启动
# 退出镜像
>> $ exit   # 或使用快捷键 Ctrl + D
 
 
  • 1
  • 6

说明:
1> 这里使用 >> 符号,表示命令在docker的伪终端中执行。
2> 在docker的伪终端中使用 # 符号,我们使用 $ 替代。

# 启动容器
$ sudo docker start <CONTAINER ID> # 使用 CONTAINER ID 启动
# 链接到容器,并获取一个伪终端:
$ sudo docker exec -it <CONTAINER ID> 
# 退出容器
$ sudo docker stop <CONTAINER ID>  # 停止
$ sudo docker kill <CONTAINER ID>  # 杀死运行的容器
 
 
  • 7

其他有关docker的更多命令以及用法就需要大家自己去学习了。

添加中文语言支持

启动指定容器后执行操作:

>> $ locale       #查询当前语言
>> $ locale -a    #查询支持的语言
# 若不支持UTF-8,则添加UTF-8语言支持
>> $ apt-get install language-pack-zh-hant language-pack-zh-hans # 中文
>> $ language-pack-en # 英文
# 修改 /etc/profile 文件,添加:
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh
# 重新加载资源
>> $ source /etc/profile
 
 
  • 1

更正时区时间

启动指定容器后执行操作:

>> $ date  # 查看当前时间
>> $ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
>> $ echo 'Asia/Shanghai' >/etc/timezone
 
 
  • 1

更换系统源

使用Ubuntu系统的童鞋就轻车熟路了,这里我使用的是阿里的源。
启动指定容器后执行操作:

>> # cp /etc/apt/sources.list /etc/apt/sources.list.bak
>> # echo "xxx" > /etc/apt/sources.list  // 使用源替换 xxx
>> # apt-get update
>> # exit
 
 
  • 1

Ubuntu 14.04 阿里云的源如下:

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
 
 
  • 4

配置编译专用镜像

准备容器

使用以下命令创建一个容器,并挂载 ~/share 目录到容器中的 /home/share 目录:

$ docker run -it -v ~/share:/home/share ubuntu:14.04 /bin/bash
 
 
  • 1

说明:此处挂载一个目录到容器中方便以后操作。

添加64位系统对32位的支持

1> 检查是否已经支持

>> $ dpkg --print-architecture     # 若支持,输出 amd64
>> $ dpkg --print-foreign-architectures    # 若支持,输出 i386
 
 
  • 1
  • 2

2> 手动开启支持

>> $ sudo dpkg --add-architecture i386
>> $ sudo apt-get update
 
 
  • 1
  • 2

3> 安装支持库

# 更新所有的软件(没必要)
>> $ sudo apt-get dist-upgrade
# 只安装支持库(原来需要安装 ia32-libs,目前被以下三个库取代)
>> $ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

添加编译Android源码需要的依赖

1> 安装编译工具以及构建套件:

>> $ sudo apt-get install gcc-multilib g++-multilib build-essential
 
 
  • 1

2> 安装必要的工具软件

>> $ sudo apt-get install git-core gnupg bison flex gperf pngcrush bc zip curl lzop 
>> $ sudo apt-get install schedtool libxml2 libxml2-utils xsltproc squashfs-tools 
 
 
  • 1
  • 2

3> 安装其他需要的库

>> $ sudo apt-get install libesd0-dev libsdl1.2-dev libwxgtk2.8-dev libswitch-perl 
>> $ sudo apt-get install libssl1.0.0 libssl-dev lib32readline-gplv2-dev libncurses5-dev
 
 
  • 1
  • 2

附:命令说明:

bc           命令行计算器
lzop             快速压缩工具
flex             词法分析器生成器
curl             基于URL的文件传输工具
gperf            哈希函数生成器
bison            语法分析器生成器
xsltproc         快速XSLT引擎,可以通过XSL文件把XML转为HTML,XHTML,PDF...
schedtool        查询或设置CPU状态
squashfs-tools       linux内核压缩工具,只读式压缩文件系统Image
pngcrush         批量压缩PNG图片
libxml2 libxml2-utils    操作XML文档工具
 
 

我们可以输入以下命令检查 JDK 环境是否安装成功:

>> $ java --version
 
 
  • 1

提交容器保存为镜像

配置好环境之后,保存此容器为一个镜像:

$ sudo docker commit -m "xxx" <CONTAINER ID> <TEPO:TAG>
 
 
  • 1

例如,使用$ docker ps -a指令查询刚才的容器编号为1a61adfb1953,我们保存为一个本地镜像,则可执行:

$ sudo docker commit -m "android-build" 1a61adfb1953 local:v1.0
 
 

使用$ docker images可以查看刚生成的镜像:

# 输出
REPOSITORY       TAG      IMAGE ID      CREATED         SIZE
build-android    v1.0     49df00985bd1  2 hours ago      971 MB
ubuntu           14.04    b969ab9f929b  5 weeks ago      188 MB

使用镜像编译Android系统源码

1> 准备系统源码
在宿主机上,创建源码目录,如 /home/android 目录,并放入Android系统源码。

2> 挂载源码目录到docker容器中

$ docker run -it -v /home/android:/home/android 49df00985bd1 /bin/bash

3> 开始编译源码

>> $ cd /home/android
>> $ ./build.sh
>> $ make -j8

转载地址:http://blog.csdn.net/godiors_163/article/details/59069108

docker官方文档:https://yeasy.gitbooks.io/docker_practice/content/appendix/repo/ubuntu.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值