几点说明
为什么要使用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)
Android 5.x (Lollipop) - Android 6.0 (Marshmallow)
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat)
Android 1.5 (Cupcake) - Android 2.2.x (Froyo)
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
除了这个错基本就是依赖包没有安装,安装依赖包即可。
参考