docker 构建Android编译环境
由于电脑升级了Ubuntu20.04,而Android推荐的编译环境为Ubuntu14.04(Android 5.0 ~ 8.0),Ubuntu18.04(Android 9.0 ~ 11.0);所以考虑使用docker来构建Android编译环境(rockchip 平台,其他平台所需的软件包应该有所差异).
ubuntu:14.04镜像
基于Ubuntu14.04基础镜像,适用于AOSP Android 5.0 版(Lollipop 或 L)到 Android 8.0 版(Oreo 或 O)编译.
- 创建Docker镜像:
Dockerfile:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y 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 python python-crypto liblz4-tool bc openjdk-7-jdk
#COPY repo /usr/local/bin/repo
#RUN chmod a+x /usr/local/bin/repo
ADD java-8-openjdk-amd64.tgz /usr/lib/jvm
#ADD jdk1.6.0_45.tar.gz /usr/lib/jvm
RUN useradd -m -s /bin/bash builder
# && echo builder >/root/username
#COPY gitconfig /home/builder/.gitconfig
#RUN chown 1000:1000 /home/builder/.gitconfig
#ENV HOME=/home/builder
#ENV USER=builder
#ENTRYPOINT chroot --userspec=$(cat /root/username):$(cat /root/username) / /bin/bash -i
执行以下命令创建镜像:
$ docker build -t ubuntu/builder:14.04 .
- 启动一个Docker容器,并编译android源码:
$ docker run --privileged -it --rm --hostname android -u builder:builder -e USER="builder" -v /mnt:/src ubuntu/builder:14.04 /bin/bash
builder@android:~$cd /src
builder@android:~$source build/envsetup.sh
builder@android:~$lunch
builder@android:~$make -j8
FAQs
- 编译android6报错:out/host/linux-x86/bin/jack-admin: line 27: USER: unbound variable
解决方法:
docker run 加参数-e USER=“builder” 设置USER环境变量
或者
$ export USER=builder
ubuntu:18.04镜像
基于Ubuntu18.04基础镜像,适用于AOSP Android 9.0 版以及以上版本编译.
AOSP 中的 Android master 分支带有预构建版本的 OpenJDK;因此无需另行安装。
- 创建Docker镜像:
Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python python2.7 python-crypto liblz4-tool bc rsync
#COPY repo /usr/local/bin/repo
#RUN chmod a+x /usr/local/bin/repo
RUN useradd -m -s /bin/bash builder
# && echo builder >/root/username
#COPY gitconfig /home/builder/.gitconfig
#RUN chown 1000:1000 /home/builder/.gitconfig
#ENV HOME=/home/builder
#ENV USER=builder
#ENTRYPOINT chroot --userspec=$(cat /root/username):$(cat /root/username) / /bin/bash -i
执行以下命令创建镜像:
$ docker build -t ubuntu/builder:18.04 .
- 启动一个Docker容器:
$ docker run --privileged -it --rm --hostname android -u builder:builder -e USER="builder" -v /mnt:/src ubuntu/builder:18.04 /bin/bash
builder@android:~$cd /src
builder@android:~$source build/envsetup.sh
builder@android:~$lunch
builder@android:~$make -j8
各个参数解析:
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
-rm: 退出时删除容器
FAQs
- 编译android11 出现:build sandboxing disabled due to nsjail error.
解决方法:docker run 添加 --privileged 参数 为该容器赋予扩展权限
$ docker run --privileged -it --rm --hostname android -u builder:builder -e USER="builder" -v /mnt:/src ubuntu/builder:18.04 /bin/bash
–privileged标志为容器提供了所有功能。当执行docker run --privileged时,docker将允许访问主机上的所有设备,并在AppArmor或SELinux中设置一些配置,允许容器几乎与主机上运行在容器之外的进程一样访问主机。

本文介绍了如何使用Docker在Ubuntu 20.04上构建适用于Android 5.0到11.0的编译环境,分别基于ubuntu:14.04和ubuntu:18.04镜像。对于14.04镜像,编译Android 6时可能出现USER未定义的问题,解决方案是在运行Docker时设置USER环境变量。而在18.04镜像中,编译Android 11时可能遇到nsjail错误,需通过--privileged参数赋予容器扩展权限。
3250

被折叠的 条评论
为什么被折叠?



