docker 构建Android编译环境

本文介绍了如何使用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参数赋予容器扩展权限。

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)编译.

  1. 创建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 .
  1. 启动一个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

  1. 编译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;因此无需另行安装。

  1. 创建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 .
  1. 启动一个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

  1. 编译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中设置一些配置,允许容器几乎与主机上运行在容器之外的进程一样访问主机。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值