首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Docker编译Android系统源码

使用Docker编译Android系统源码

作者头像
望天
发布2019-05-26 15:37:32
1.9K0
发布2019-05-26 15:37:32
举报
文章被收录于专栏:along的开发之旅along的开发之旅

引言:

最近公司业务转型,开始倒腾起安卓系统,做了几个月的安卓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版本:

$ sudo docker --version    

配置Docker

< 此步骤可以跳过 >

使用Docker加速器

由于官网在国外,速度不是很理想,因此国内有推出加速服务,使用加速器真的快很多。在这里我使用的是阿里云的加速,其他家的执行搜索。阿里云容器HUB地址(https://dev.aliyun.com/search.html),登录阿里平台之后进入“管理中心”,之后在左侧会有一个“加速器”选项,点击之后按照提示进行操作即可。 由于我的docker版本大于1.10,所以可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,执行以下命令:

$ sudo mkdir -p /etc/docker
# 请根据阿里云中的提示,修改下面的 xxxxxx 部分。
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

避免输入sudo

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

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

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

安装基础镜像

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

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

镜像系统基础配置

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

简单的docker操作

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

# 查询本地已有的镜像(注意 镜像编号-IMAGE ID)
$ sudo docker images   
# 输出如下:
REPOSITORY  TAG       IMAGE ID       CREATED       SIZE
ubuntu      14.04     b969ab9f929b   5 weeks ago   188 MB
# 查看本地所有的容器(注意 容器编号-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
# 启动镜像,并获取一个伪终端
# 注意:实际启动的是容器,启动镜像时会自动创建新容器并启动。
$ sudo docker run -it <REPOSITORY:TAG> /bin/bash   # 使用  仓库名+标签 启动
$ sudo docker run -it <IMAGE ID> /bin/bash     # 使用 IMAGE ID 启动
# 退出镜像
>> $ exit   # 或使用快捷键 Ctrl + D

说明: 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>  # 杀死运行的容器

其他有关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

更正时区时间

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

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

更换系统源

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

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

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

配置编译专用镜像

准备容器

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

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

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

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

1> 检查是否已经支持

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

2> 手动开启支持

>> $ sudo dpkg --add-architecture i386
>> $ sudo apt-get update

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

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 

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

附:命令说明:

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

编译Android 5.1需要安装Java开发环境,我们使用Jdk-7的版本。这里我们使用oracle jdk 1.7,我们使用手动安装的方式,可以从官网下载对应版本的安装包(http://www.oracle.com/technetwork/java/javase/archive-139210.html)。 我们下载的是 jdk-7u79-linux-x64.tar.gz 的版本,把下载下来的安装包拷贝到~/share目录下,由于之前做了目录挂载,我们可以在容器的 /home/share 目录下找到此安装包,接下来进行安装:

# 解压到当前目录下
>> $ tar -xvf ./jdk-7u79-linux-x64.tar.gz 
# 创建目标目录
>> $ sudo mkdir -p /usr/lib/jvm/jdk1.7.0/ 
# 移动文件到目标目录
>> $ sudo mv jdk1.7.0_79/* /usr/lib/jvm/jdk1.7.0/
# 添加环境变量
修改 /etc/profile 文件,添加如下内容:
------------------------------------------------
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
export PATH=$JAVA_BIN:$PATH
------------------------------------------------
# 配置完成后,执行如下命令使其立即生效:
>> $ source /etc/profile

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

>> $ java --version

提交容器保存为镜像

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

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

例如,使用$ 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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言:
  • 安装Docker
  • 配置Docker
    • 使用Docker加速器
      • 避免输入sudo
      • 安装基础镜像
      • 镜像系统基础配置
        • 简单的docker操作
          • 添加中文语言支持
            • 更正时区时间
              • 更换系统源
              • 配置编译专用镜像
                • 准备容器
                  • 添加64位系统对32位的支持
                    • 添加编译Android源码需要的依赖
                      • 安装JDK
                        • 提交容器保存为镜像
                        • 使用镜像编译Android系统源码
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档