Docker中使用Ubuntu编译Android源码
几点说明
- 为什么要使用Docker:
采用docker编译我们可以在本地不配置任何环境,只要安装docker,并下载docker镜像就好了。我在其他机器想编译,那我只需要把镜像pull下来,运行就好了。如果没有我们想要的镜像,我们可以自己配置,然后上传到docker hub,留着以后什么时候需要就下载。这是一劳永逸的过程。 - 为什么用Ubuntu:
首先编译Android源码必须使用 Linux 或 Mac OS。其次在AOSP开源中,master
分支使用Ubuntu长期版本开发和测试的,因此也建议使用Ubuntu进行编译。
环境搭建
- 操作系统要求
Android版本 | 编译要求的Ubuntu最低版本 |
---|---|
Android 6.0至AOSP master | Ubuntu 14.04 |
Android 2.3.x至Android 5.x | Ubuntu 12.04 |
Android 1.5至Android 2.2.x | Ubuntu 10.04 |
- JDK版本要求
Android版本 | 编译要求的JDK版本 |
---|---|
Android 7.0 (Nougat) - Android 8.0 (O) | OpenJDK 8 |
Android 5.x (Lollipop) - Android 6.0 (Marshmallow) | OpenJDK 7 |
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat) | Java JDK 6 |
Android 1.5 (Cupcake) - Android 2.2.x (Froyo) | Java JDK 5 |
- jdk版本切换
sudo update-alternatives --config java
sudo update-alternatives --config javac
Docker注意事项
关于docker的基础知识以及如何使用我就不多说了,网上很多教程。这里说几点编译Android源码时的注意事项
- docker 默认给的内存是2G,编译Android源码,在7.0以上需要使用jack-server来取代以往的编译器工具,它的内存消耗比较大,通常需要4G以上。这里就需要修改docker分配给容器的内存大小,run -m的形式只是限制内存使用量,并不能增加。需要增加内存需要在docker的偏好设置的高级选项中设置。
- 由于docker没有设置USER环境变量会导致编译失败,需要手动添加
export USER=$(whoami)
- docker挂在本机目录
docker run -itv 需要共享的本机目录:docker目录 ubuntu:14.04 /bin/bash
编译源码
// cd到应的源码目路,初始化编译环境
1. source build/envsetup.sh
// aosp表示Android Open Source Project,arm64表示是使用arm64 cpu的设备,eng表示engineer版本,其直接开放了一些root等权限。当然直接使用lunch命令会列出所有可选的编译目标。
2. lunch aosp_arm64-eng
// 这里的j8表示可以开启8个线程来参与编译源码,这里指定的线程数一般应该遵从cpu内核数的2倍这个规律,可以通过cat /proc/cpuinfo查看相关cpu信息。
3. make -j8
错误锦集
recipe for target 'ninja_wrapper' failed
这种错误基本都是
jack-server
的内存太小导致,修改如下文件prebuilts/sdk/tools/jack-admin
找到JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation"
在最后添加 -Xmx4096
即:JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096
重启
jack-server
:prebuilts/sdk/tools/jack-admin kill-server
prebuilts/sdk/tools/jack-admin start-server
除了这个错基本就是依赖包没有安装,安装依赖包即可。
参考 https://blog.csdn.net/hunter___/article/details/80972878
https://blog.csdn.net/ltstud/article/details/79712054
https://blog.csdn.net/ronnyjiang/article/details/55812305
https://blog.csdn.net/Yoryky/article/details/81813717
推荐阅读
- 热闹中的孤独
- Docker应用:容器间通信与Mariadb数据库主从复制
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 由浅入深理解AOP
- 异地恋中,逐渐适应一个人到底意味着什么()
- 【译】20个更有效地使用谷歌搜索的技巧
- 我眼中的佛系经纪人