一般来说,使用 ubuntu 系统来编译 Android 系统会比较方便一点,问题会少一点,因为 google 官方就是在 ubuntu 上进行编译的,其他的发行版本没有验证过。但是官方使用的 ubuntu系统都是非常旧的版本,还停留在 14.04, 16.04 这些版本,现在我都装上18.04了,明年20.04都出来了。使用较新版本的ubuntu编译较旧版本的 Android也是比较折腾的。虽说都是 linux 内核的发行版本,但各发行版的各种工具链的版本差异是很大的,之前在 archlinux, deepin 15.5 上尝试过编译android 6.0, 这过程就出现了各种奇怪的编译错误。虽然这些编译错误只要慢慢用心查,还是能找到处理方法的,但就是太折腾了。所以后面自己搞了一套 docker 的编译环境。无论你用哪个 linux 发行版,都可以不用折腾这些编译环境了。这套环境我在 Android5.1, Android 6.0, Android 8.1 上都编译验证过,没问题。具体的使用方法如下。
安装 docker
网上介绍 docker 的安装方法乱七八糟的,其实只要简单的一条命令就行了
1 | curl -sSL https://get.docker.com/ | sh |
编译 docker 镜像
我已经做好了一个可以用来编译 Android 各版本系统源码的 docker 镜像, 不想麻烦的话,直接用就行。
1 | git clone https://github.com/qiushao/aosp_builder.git |
构建出来的镜像用户名为 builder,
如果想要了解这个镜像的环境是怎么构建的,可以参考一下 aosp_builder 里面的 Dockerfile 文件。
使用方法
按上面的步骤操作完之后,应该生成一个 aosp_builder:V1.0 的docker 镜像了。
创建容器:
1 | docker run -it --name aosp_builder -v ~/source:/home/builder/source -u builder aosp_builder:V1.0 /bin/bash |
其中
-v ~/source:/home/builder/source 参数是将宿主机目录 ~/source 映射到 docker 容器的 /home/builder/source 目录。因为我宿主机上 Android 的源码放在 ~/source这个目录里面了。
-u builder 表示使用 builder 用户登录,不指定的话,会使用 root 用户登录,最好不要用 root 登录,用 root 用户登录的话,编译时产生的文件用户属主就是 root 了,在宿主机上要编辑或删除这些编译生成的文件就得用 sudo 了。
其他参数的意义就不作详细说明了,想要了解的话请查阅 docker 使用文档。
电脑重启后, 我们之前创建的容器还存在的, 我们不需要重新创建容器, 只要启动之前创建的容器就行:
1 | docker start aosp_builder |
然后我们就可以按照 Android 的标准编译流程开编了