使用docker快速架构Android系统源码编译环境

Posted 阿迷创客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用docker快速架构Android系统源码编译环境相关的知识,希望对你有一定的参考价值。

1. 篇首语

对于采用了多家芯片方案的公司,在android rom(安卓系统的固件)开发的过程中,因各方案的编译环境经常各不相同,难以兼容,切换起来,费时费力费钱,非常不便!正巧,有了docker,一切变得简单!

docker仓库中也有许多可直接使用的镜像,然而很多人可能希望自己搭一遍
喜欢的多多收藏哦~
已在 android-11-r39 测试通过。估计android-S-beta2应该也没问题,待后续测试

有需要此aosp-build-environment docker image镜像的同学,可以私信我。

2. 多环境的实现方案

  • 方案1:不差钱的公司,多买几台服务器,各用各的,真爽!
  • 方案2:刚毕业的公司,买1台服务器,多建几个虚拟机(操作虽简单,可需要独占资源)。例如8核CPU,32G内存,如果平均分给4台虚拟机,则各拥有2核CPU+8G内存。这立马就是跑车变三轮车的感觉。
  • 方案3:IT牛的公司,通过脚本适配不同的编译环境,但需要一连串手动切换配置,对于动手差的小公司,很有挑战性。
  • 方案4:使用docker的公司,类似vmware,也是虚拟机,只不过100㎡的居室,是大家共享,各自都拥有100㎡,虚拟机开销比起vmware小很多,不会独占硬件资源,所以资源得到充分的利用,且操作简单,也不需要复杂的脚本

3. docker 部署的基本步骤

  1. 安装docker引擎
  2. 将用户添加到docker group,给予docker操作权限
  3. 从docker联网远程仓库下载所需的基础OS镜像
  4. 从基础OS镜像,启动一个容器实例
  5. 在容器中安装基础的工具软件,并进行配置
  6. 在容器中安装aosp android所需必要编译工具和组件
  7. 将容器的修改,转存到镜像中
  8. 退出旧容器,从新镜像启动容器实例,并挂载aosp源码目录
  9. 在新镜像容器中测试aosp源码是否能编译通过,如果不行则继续修改
  10. 编译通过后,将新容器的修改,转存到之前的镜像中
  11. 将配置到的镜像,转存为镜像文件,供日后、其他人部署时使用

4. docker 基础安装

下文基于 ubuntu 14.04。
.

4.1 前置知识

  • docker 引擎:类似vmawre虚拟机软件,虚拟的是OS,而不是具体的PC硬件,省资源
  • docker 镜像:把编译服务器里的操作系统、软件全部提取出来,做成二进制文件,就是镜像文件
  • docker 容器:把镜像实例化,运行起来,这个实例化的进程,就是一个容器;同一个镜像,可以运行N个容器,互不干扰。
  • docker 仓库:做好的镜像,可以上传到docker远程仓库,其他人下载后,即可直接运行使用,正所谓一次安装,随意部署,不用每次都从头开始,做好后存一份镜像,就好像以前的ghost 安装windows。
  • 容器的注意事项:容器退出后,数据即丢失,所以一般挂载host数据目录来使用,例如把自己的源代码目录,作为一个volume挂载到容器中,则对自己源代码目录的修改,都会存到host对应目录下。而如果需要修改容器里的配置,并且不希望配置丢失,则需要将容器的修改,转存到原镜像中,类似git commit。

关于docker 容器、镜像的各种详细说明,请自行百度。

.

4.2 docker 引擎安装

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg |
sudo apt-key add -
sudo add-apt-repository \\
"deb [arch=amd64] https://mirrors.aliyun.com/docker-
ce/linux/ubuntu \\
$(lsb_release -cs) \\
stable"
sudo apt-get update || exit 1
sudo apt-get install -y --allow-unauthenticated docker-ce
sudo service docker restart

4.3 添加用户到docker Group

docker安装完后,将普通用户添加到docker的Group中,则普通用户才能使用docker的命令及功能。添加完后,重新登录后,即可使用id命令确认

szhou@server_01:~$ sudo docker -a szhou -G docker
szhou@server_01:~$ id  
uid=1007(szhou) gid=1007(szhou)=1007(szhou),999(docker),1008(public)
szhou@server_01:~$ 

4.4 docker pull 基础镜像

  • 因为android的aosp源码是基于14.04搭建的,所以我们首先需要再docker上,搭建ubuntu 14.04的系统
  • 而docker的仓库中,已有做好的ubuntu 14.04的基础镜像,可以拉取,直接使用,这是首选方法。
szhou@server_01:~$docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete 
0551a797c01d: Pull complete 
512123a864da: Pull complete 
Digest: sha256:5c01e896fa6eeaa41f3509c64af668d71d06e318cfe373dabab9d61b9eaf6441
Status: Downloaded newer image for ubuntu:14.04
docker.io/library/ubuntu:14.04
szhou@server_01:~$

4.5 查看系统中的镜像

如下,使用$docker images命令,查看系统中的镜像列表,其中TAG列指示了ubuntu的版本。

szhou@server_01:~$docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
ubuntu                14.04               13b66b487594        2 months ago        197MB
szhou@server_01:~$

到这里,我们的docker "虚拟机"已经准备好了,下面将开始配置aosp android的编译环境。


5. 配置Android编译环境

5.1 启动ubuntu 14.04容器

下面命令指示了所使用的镜像的名称和版本,并指定了所使用的shell为bash。因未指定user,所以容器将以root权限运行。

szhou@server_01:~$docker run -it ubuntu:14.04 /bin/bash

=> 执行后,出现下面的提示符,当前终端,已经切换到容器内运行(使用exit可以退出到之前的ssh界面)
root@53c7697d6fdd:/# 

5.2 完成基础配置

root@53c7697d6fdd:/# apt-get update
root@53c7697d6fdd:/# apt-get install vim
root@53c7697d6fdd:/# mv /etc/apt/sources.list /etc/apt/sources.list_bak
root@53c7697d6fdd:/# vim /etc/apt/sources.list

替换源

“/etc/apt/sources.list” [New File]
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

安装open-jdk-8

root@53c7697d6fdd:/# apt-get update
root@53c7697d6fdd:/# apt-get install python-software-properties
root@53c7697d6fdd:/# apt-get install software-properties-common
root@53c7697d6fdd:/# add-apt-repository ppa:openjdk-r/ppa
root@53c7697d6fdd:/# apt-get update
root@53c7697d6fdd:/# apt-get install openjdk-8-jdk

5.3 安装android编译所需工具

官方文档:https://source.android.google.cn/source/initializing
安装所需的程序包 (Ubuntu 14.04)
您将需要 64 位版本的 Ubuntu。建议您使用 Ubuntu 14.04。
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g+±multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

root@53c7697d6fdd:/#
root@53c7697d6fdd:/# apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
root@53c7697d6fdd:/#

6. 转存对容器的修改

6.1 基本步骤

  1. 在host上开启一个新的SSH终端
  2. 在新的SSH终端上,查看之前修改的容器的ID号码
  3. 在新的SSH终端上,提交对应容器的修改by ID

6.2 查看容器ID

如下,获知容器ID: 53c7697d6fdd


szhou@server_01:~$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
53c7697d6fdd        ubuntu:14.04          "/bin/bash"              37 minutes ago      Up 37 minutes                                goofy_ellis

6.3 提交修改

  • 将容器里的修改,存储到一个新的镜像中(不要破坏ubuntu14.04原镜像,若你需要其他编译环境,则需要从原镜像制作,将其作为base,不要修改)
  • 下面aosp_build_server即为我们转存的aosp编译环境镜像
szhou@server_01:~$ docker commit -a szhou -m "added aosp basic tools, not test yet." 53c7697d6fdd aosp_build_server:latest
sha256:a3b2113b54173033ca5f0b4ad127ce32fe328131723dfcbf7185364f14115324
szhou@server_01:~$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
aosp_build_server     latest              a3b2113b5417        8 seconds ago       798MB
android_mm_build      latest              bfd78546fee0        2 months ago        31.2GB

7. 测试编译环境

7.1 从aosp_build_server:latest 启动容器

  • 下面命令将host的user、group等目录挂载到了容器的相应目录下,实现了容器内使用host的用户群、群组、权限的作用
  • 同时,将源代码目录,挂载到了容器的/home/builder/code目录下

下面使用aosp源码,请自行准备一份,下面是我自己使用ustc源下载的源码

szhou@server_01:~/works/android/ustc$ docker run  -it --user $(id -u ${USER}):$(id -g ${USER})   -v $PWD:/home/builder/code  -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v /etc/shadow:/etc/shadow:ro   android_mm_build:latest /bin/bash
szhou@81fe32c25a6f:/home/builder/code$ 

7.2 编译测试

下面编译aosp_x86_64-eng 版本做测试,此版本镜像用于android 模拟器。

szhou@81fe32c25a6f:/home/builder/code/aosp$ source  build/envsetup.sh 
szhou@81fe32c25a6f:/home/builder/code/aosp$ lunch  aosp_x86_64
szhou@516d2985099e:/home/builder/code/aosp$ lunch aosp_x86_64-eng
failed to initialize build cache at /home/disk3/szhou/.cache/go-build: mkdir /home/disk3/szhou/.cache: permission denied
szhou@516d2985099e:/home/builder/code/aosp$ sudo mkdir -p /home/disk3/szhou/.cache
szhou@516d2985099e:/home/builder/code/aosp$ sudo chown szhou:szhou -R /home/disk3/szhou
szhou@516d2985099e:/home/builder/code/aosp$ lunch aosp_x86_64-eng                      
============================================
PLATFORM_VERSION_CODENAME=S
PLATFORM_VERSION=S
TARGET_PRODUCT=aosp_x86_64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=x86_64
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-142-generic-x86_64-Ubuntu-14.04.5-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=AOSP.MASTER
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=device/generic/goldfish device/generic/goldfish-opengl hardware/google/camera hardware/google/camera/devices/EmulatedCamera
============================================
szhou@516d2985099e:/home/builder/code/aosp$ make -j16

7.3 成功的画面

一切都很顺利,除JDK安装比较麻烦外,其余的按AOSP官网说明,把相关工具安装好就可以了。
在这里插入图片描述

8 结束语

学习andorid这样的复杂系统,需要有浓厚兴趣,欢迎交流~
有需要此aosp-build-environment docker image镜像的同学,可以私信我,省去自己搭的时间,直接使用。

以上是关于使用docker快速架构Android系统源码编译环境的主要内容,如果未能解决你的问题,请参考以下文章

Docker环境下编译android源码|编译可运行xposed

想使用docker来进行Android源码编译,对电脑配置要求怎么样?

Docker 源码架构部署篇

Android源码解析RPC系列(一)---Binder原理

Android编译篇

Linux - 快速搭建服务器以及JdkTomCatMySql等组件安装并提供各资源下载链接,后续介绍Android系统源码编译开发环境搭建