Android系统作为一个庞大的开源项目,除了一些谷歌自带服务之外,其他所有代码均以AOSP(Android Open Source Project)的形式开源。对于框架开发者来说,熟悉AOSP是必不可少的知识。即使是普通开发者,为了优化代码或者是调用一些系统底层API,有时也需要参考底层源码。那么就需要搭配一个合适的源码阅读环境了。
首先要说的是,如果仅仅是阅读AOSP的源码,我们不必要直接下载源码。 Google提供了这个网站:
用于直接在线阅读AOSP的源码。虽然它很方便快捷,不过由于一些众所周知的原因,在国内是不能直接访问到的。并且如果你是框架开发者,那么还是免不了编译的过程,就只能一步步下载源码了。
下载AOSP源码并不简单,网上教程很多但也很杂。我尽量通过本文,用最简洁的篇幅帮你搞定所有的步骤,以及帮你避免所有你将要踩的坑。
阅读本文之前,我默认你已经了解Linux和Linux常用命令的基本使用,以及git的基本知识和命令使用。
PC配置准备
硬件要求:
64 位CPU,核数越多越好。 只检出分支查看代码,至少预留出 190GB 磁盘空间;如果要进行编译,则需要 300+GB。 不管是虚拟机还是实机编译,最低要求是要有 16GB 的系统内存RAM。编译环境准备
Android 官方声明 AOSP 历来是在 Ubuntu LTS 版本中进行开发和测试。所以为了避免任何其他不必要的麻烦,请使用 Ubuntu 及其他基于 Ubuntu 的发行版。
最低环境要求:
Ubuntu 14.04+ JDK1.8+ python3 GNU make git首先配置安装好Ubuntu,这里虚拟机还是实机都可,如果不是为了编译过老的Android版本,我建议一律使用18.04以上的版本。安装Ubuntu的网上教程很多,这里就不再多废话了。
进入系统,打开终端,然后执行以下命令安装好所有环境。
下载和签出代码
由于AOSP项目代码是超过上百个git项目的集合,为了管理庞大的仓库,我们必须使用谷歌提供的 repo 工具克隆并签出代码。 首先安装 repo 工具:
安装好后执行 repo -h 检查一下,输出如下说明安装成功。
AOSP代码部署在谷歌的git服务器上,由于一些众所周知的原因国内访问不到。这里我们使用来自清华大学的镜像源进行快速下载。
清华源的使用说明:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
建立一个目录,在这里我就叫 aosp ,我们就在这个文件夹里直接签出AOSP的代码:
这里会提示无法连接到 http://gerrit.googlesource.com,需要我们修改一下bash的环境变量,然后重新初始化仓库。
输出如下说明成功:
接下来,只需再运行这一条命令即可开始同步仓库:
第一次下载耗时会有数个小时,因为要下载签出这200GB数据,如果是固态硬盘会快一些。以后再更新整个AOSP仓库,也只需要执行这条命令。如果在下载中途遇到网络中断,重新执行这条命令即可。
至此源码下载完成。
阅读环境准备
阅读AOSP源码有很多方式,命令行爱好者喜欢使用vim,有些人习惯SourceInsight,当然也可以使用功能更完善的IDE,Android Studio。使用AS的优点是能提供代码跳转、智能语法高亮等功能,并且享受IDEA的一些强大功能,缺点是初始化需要一些时间。
本文主要说明如何通过Android Studio来阅读。
如果直接用Android Studio打开AOSP代码,是没有代码跳转等高级功能的。为了使用这些功能,需要编译一个AOSP中的idegen模块。 idegen用来生成可以导入Eclipse和IDEA的工程配置文件( 也就是.ipr文件 ),这个模块位于 development/tools/idegen/ 。
首先通过snap商店安装Android Studio:
桌面上出现图标后,打开Android Studio。随便创建一个项目,在 “帮助” –> “更改内存设置” 中把内存调整到8192MB,点击保存,然后关掉Android Studio。
进入AOSP目录,通过sh脚本加载环境变量,然后执行 mmm 编译idegen模块。
编译过程中请保证系统内存充足,否则会失败。也可以使用 -j2 或 -j4 减少编译的进程数,减少内存占用保证编译通过。
编译成功后在 /out/host/linux-x86/framework 目录下会生成 idegen.jar 文件。执行sh脚本,它将使用这个jar生成所需的 .ipr 文件:
注意这一步要在AOSP仓库根目录执行,不要在其他地方执行。
成功后,在AOSP代码根目录下可以找到 android.iml 和 android.ipr 两个文件。打开Android Studio,点击File –> Open,选中生成的 android.ipr 文件即可。
等待一段时间的扫描后,Android Studio的高级功能就可用了。
进行一次完整编译
一次完整编译比较耗时,以及需要大量的硬盘空间。请准备好充足的内存和硬盘资源,然后我们跑一次完整编译流程。
进行编译的第一步是加载shell环境变量。所有的环境变量都通过 build/envsetup.sh 进行加载。只有加载了变量后,对应的命令才可以使用。
第二步是选择编译哪种版本。执行 lunch 命令,输出一个菜单,它列出了当前Android源码支持的所有设备代号和编译类型。输入相应数字选择编译类型。
简要说明编译的类型:
user:限制所有权限,用于发布给用户使用的最终版本。 userdebug: 开放部分权限,允许root。 eng:工程师模式,开放所有权限并且有额外的调试工具。如果只是编译出一个正常的AOSP环境,直接选择 aosp_arm64-eng 编译arm版本,或者选择 aosp_x86_64-eng 编译x86版本也可。最后输出编译的环境变量。
输出提示告诉我们也可以直接使用名称选择版本:lunch aosp_arm64-eng。
第三步,使用make即可开始编译:
-j 后面数字表示同时运行的编译任务数。如果编译中因为内存不足而停止,可以减少数字重新编译,不过编译时间会增加。
经过漫长等待,编译完成。所有编译出的结果都在 /out 目录中可以找到。其中有三个重要的镜像文件简单介绍一下:
system.img:系统镜像,里面包含了 Android 系统主要的目录和文件,通过 init.c 进行解析并挂载到 /system 目录下。userdata.img:用户镜像,是 Android 系统中存放用户数据的,通过 init.c 进行解析并挂载到 /data 目录下。ramdisk.img:根文件系统镜像,包含一些启动 Android 系统的重要文件,比如 init.rc。编译完成之后,可以通过使用模拟器来模拟运行,或者使用真机进行刷机。
模拟器运行直接运行这条指令:
通过 adb 连接手机,也可以把系统镜像刷入真机。
先通过 adb 让手机重启到fastboot模式:
在fastboot模式下,使用该命令刷入:
其中 -w 表示擦除掉 /data 分区。
附录:AOSP常用编译和查找命令
m :等同于 make ,进行一次完整编译。mm:在当前目录下编译所有模块,但不包括依赖项。mmm [目录]:编译指定目录下的所有模块,但不包括依赖项。只编译指定模块:mmm [dir/:target1,target2] mma:在当前目录下编译所有模块,包括依赖项。mmma [目录]:编译指定目录下的所有模块,包括依赖项。make clean:删除整个 out/ 目录。make clobber:用于清除编译缓存。make snod:当重新编译部分模块完成后,快速生成img文件。
cgrep:对C/C++文件执行 grep (只搜寻C/C++文件类型,也包括.h类型)。jgrep:只对Java文件执行 grep (只搜寻Java文件类型)。resgrep:只匹配 /res 目录下的 xml 文件。sepgrep:只查找sepolicy文件。参考:
一步一步教你如何在AndroidStudio查看Android源码(AOSP源码) 玩转AOSP源码编译如果本文有帮到你的话,还请慷慨点赞收藏。我是ZeroFreeze,一名Android开发者,未来将持续向大家分享大量Android、Linux相关的技术知识文章。点点关注不迷路,我们下篇文章见~