使用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 部署的基本步骤
- 安装docker引擎
- 将用户添加到docker group,给予docker操作权限
- 从docker联网远程仓库下载所需的基础OS镜像
- 从基础OS镜像,启动一个容器实例
- 在容器中安装基础的工具软件,并进行配置
- 在容器中安装aosp android所需必要编译工具和组件
- 将容器的修改,转存到镜像中
- 退出旧容器,从新镜像启动容器实例,并挂载aosp源码目录
- 在新镜像容器中测试aosp源码是否能编译通过,如果不行则继续修改
- 编译通过后,将新容器的修改,转存到之前的镜像中
- 将配置到的镜像,转存为镜像文件,供日后、其他人部署时使用
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 基本步骤
- 在host上开启一个新的SSH终端
- 在新的SSH终端上,查看之前修改的容器的ID号码
- 在新的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源码编译,对电脑配置要求怎么样?
Android源码解析RPC系列(一)---Binder原理
Linux - 快速搭建服务器以及JdkTomCatMySql等组件安装并提供各资源下载链接,后续介绍Android系统源码编译开发环境搭建