从 0 开始编译 Android 系统源码

发布时间:2026/8/27 12:36:11
从 0 开始编译 Android 系统源码 前言在开始学习 Android Framework 的知识前准备好相关的源码环境是非常有必要的。可以选择直接在 cs.android.com/ 网站在线看但是跳转这些还是不如在 IDE 下来的方便。或者也可以下载好指定版本的源码并通过 IDE 来查看但是这样无法编译源码所以也就无法修改源码后编译查看效果。所以这篇文章主要是为了后续编译 Android 源码来做准备的由于编译源码最好是在 Linux 环境下进行因为 Android 官方就是在 Linux 环境下编译的为了省事但是我的设备是 Windows所以为了在不影响原系统的情况下可以通过安装虚拟机并在虚拟机中安装 Linux 系统。或者有一种更方便的方式是安装 Docker在 Docker 下安装别人已经准备好的 Linux 环境但是后者在这篇文章中就不介绍了。当前文章所使用的环境和版本信息使用设备Windows 10 64 位 x86 系统 VirtualBox7.0.2 版本 Ubuntu22.04.1 LTS 版本准备工作下载并安装 VirtualBox 虚拟机软件www.virtualbox.org/wiki/Downlo…下载 Linux 的 Ubuntu 发行版cn.ubuntu.com/download/de…VirtualBox 的安装很简单直接下一步、下一步就可以了。所以后面主要介绍下 Ubuntu 的安装和配置。安装 Ubuntu打开 VirtualBox点击“新建”按钮并填写虚拟机的名称注此时不需要选择 ISO Image这样就是手动安装了手动安装可以选择系统语言。分配内存和线程数建议分配最少 4G 内存分配磁盘大小建议最少 200G 起点击完成。接下来会进入系统的安装流程语言可以选择中文输入用户名和密码根据提示直接一步步安装即可。注意进入系统的引导安装页面后屏幕的分辨率很低可能会导致显示不完整的情况例如没有显示出下一步的按钮。此时可以用快捷键 Win 鼠标左键拖动安装页面将显示不全的页面展示出来。配置 Ubuntu修改分辨率由于默认的分辨率太低看起来不是很舒服所以可以进入设置页面调整分辨率到合适的大小。安装增强工具从而可以使用共享目录、共享粘贴板和拖放功能。点击“设备”- “安装增强工具”此时文件系统中会出现 VBox_GAs_xxx 目录进入该目录并右键选择在当前目录打开终端在终端中输入sudo ./VBoxLinuxAdditions.run并回车即可安装增强工具开启共享目录在“设备”- “共享文件夹”中可以添加要共享的文件夹。注意只需要勾选“自动挂载”和“固定分配”。当重启系统后就可以在文件系统中看到sf_xxx的目录该目录就是共享的目录。如果点击查看该目录出现权限问题可以使用sudo adduser [username] vboxsf命令将当前用户添加到vboxsf用户组注意替换为你设置的用户名。设置“共享粘贴板”和“拖放”为双向。配置网络代理即便我们在 Windows 系统上安装好了 FQ 软件但是在 Ubuntu 系统中还是无法访问外网的。所以我们需要配置好代理从而在后续下载 Android 源码时更方便。例如IP 地址为 Windows 系统上的 IP端口为 FQ 软件上设置的端口注意在完成配置后最好重启下系统从而让配置生效。准备源码环境安装 RepoAndroid 项目很大是一个超级项目。所以为了更好的管理代码Android 官方做了一个叫做 Repo 的工具用来在 Android 环境中更好的使用 Git 来管理代码。因此我们要获取 Android 源码首先需要准备好该工具。在终端中运行以下命令来安装 Repo 工具sudo apt-get update sudo apt-get install repo检查是否安装成功repo version如果出现和以下类似的输出则说明安装成功airsaidairsaid-VirtualBox:~$ repo version repo not installed repo launcher version 2.17 (from /usr/bin/repo)初始化 Repo由于众多周知的原因如果不适用镜像的话会出现网络问题下载速度也不理想。因此可以选择用清华大学或其他组织提供的镜像地址来解决问题。这里以清华大学的镜像为例安装 curl 工具sudo apt-get install curl下载 repo 到 bin 目录并设置权限mkdir ~/bin curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo chmod x ~/bin/reporepo 的运行过程中会尝试访问官方的 Git 源更新自己如果想使用镜像源进行更新可以将如下内容复制到你的~/.bashrc里使用sudo nano ~/.bashrc命令进入nano编辑器修改# https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/ export PATH~/bin:$PATH export REPO_URLhttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo使用source ~/.bashrc让其立即生效。下载源码创建一个目录用来存放源码mkdir dir_name cd dir_name使用真实用户名和邮件地址配置 Gitgit config --global user.name YourName git config --global user.email youexample.com初始化 reporepo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest如果需要指定版本可以使用 -b 选项指定分支该链接中包含所有的分支信息source.android.com/docs/setup/…repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r47同步源码repo sync如果需要加快同步速度可以传递-c当前分支和-jthreadcount标志repo sync -c -j4以 Android 10 源码为例下载完大小大约为 100G 左右。编译源码安装所需工具在编译的过程中需要用到一些工具所以提前安装好它们避免编译失败sudo apt install m4 libncurses5 python-is-python3执行 envsetup 脚本envsetup.sh脚本用于初始化环境其中记录着编译过程中所需的各种函数实现例如lunch、m、mm、mmm等等。在下载好的源码目录下通过一下命令执行该脚本source ./build/envsetup.sh或者也可以使用以下命令. ./build/envsetup.sh注意每次重新打开终端后都需要再次执行该命令。另外使用 hmm 可查看可用命令的完整列表。选择编译目标通过lunch product_name-build_variant命令可以选择要构建的目标。其中product_name指定要构建的产品build_variant指定要构建的变体。所有构建目标都采用BUILD-BUILDTYPE形式其中BUILD是指代特定功能组合的代号。BUILDTYPE是以下之一BUILD TYPE备注user编译出的系统有权限限制适用于生产环境userdebug编译出的系统有 root 权限调试首选eng优先考虑开发生产力带有附加调试工具并关闭了优化如果不知道该如何选择目标产品可以只使用lunch命令列出可用的产品列表。例如airsaidairsaid-VirtualBox:~/aosp$ lunch Youre building on Linux Lunch menu... pick a combo: 1\. aosp_arm-eng 2\. aosp_arm64-eng 3\. aosp_blueline-userdebug 4\. aosp_bonito-userdebug 5\. aosp_car_arm-userdebug 6\. aosp_car_arm64-userdebug 7\. aosp_car_x86-userdebug 8\. aosp_car_x86_64-userdebug 9\. aosp_cf_arm64_phone-userdebug 10\. aosp_cf_x86_64_phone-userdebug ......此时可以直接输入对应的序号来选择后续也可以直接通过产品名来直接选择例如lunch aosp_arm-eng。执行编译命令编译指令根据使用场景不同有好几种下表中列出了这些编译指令编译指令备注m在源码树的根目录执行编译mm编译当前路径下所有模块但不包含依赖mmm [module_path]编译指定路径下所有模块但不包含依赖mma编译当前路径下所有模块并包含依赖mmma [module_path]编译指定路径下所有模块并包含依赖make [module_name]当不指定参数时则表示编译整个 Android 源码包含依赖注m、mm、mmm、mma、mmma 这些命令都是通过 make 方式来完成的。一般首次的情况下会使用make指令来编译相当于进行一次全量编译。为了加快编译速度可以使用-j参数指定线程数例如make -j8编译成功后终端会显示build completed successfully。同时在源码根目录下的/home/airsaid/aosp/out/target/product/product_name目录中会出现编译后的产物。其中比较重要的有以下三个镜像文件system.img系统镜像。里面包含了 Android 系统主要的目录和文件通过init.c进行解析并mount挂载到/system目录下。userdata.img用户镜像。是 Android 系统中存放用户数据的通过init.c进行解析并mount挂载到/data目录下。ramdisk.img根文件系统镜像。包含一些启动 Android 系统的重要文件例如init.rc。在编译的过程中可能会遇到以下问题可以按照对应的解决方法来解决找不到/usr/bin/python文件或目录/bin/bash: device/generic/goldfish/tools/mk_combined_img.py/usr/bin/python解释器错误: 没有那个文件或目录python 脚本语法错误由于源码中部分 python 脚本用到了 python2 的语法导致的File /home/airsaid/aosp/device/generic/goldfish/tools/mk_combined_img.py, line 48 print %s cannot be converted to int % (line[2]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to print. Did you mean print(...)?解决方法没有安装 python2 则先安装并建立软连接将 python 指向 python2sudo apt install python2 sudo ln -s /usr/bin/python2 /usr/bin/python 复制代码内存溢出Exception in thread “main” java.lang.OutOfMemoryError: Java heap space 复制代码解决方法通过修改_JAVA_OPTIONS环境变量配置指定更大的内存。将下面的代码添加到.bashrc文件export _JAVA_OPTIONS-Xmx4096m其他为 VirtualBox 中的 Ubuntu 扩容在关闭虚拟机的前提下通过 cmd 进入 VirtualBox 的安装目录例如cd /d D:\virtualbox\查看 VirtualBox 的虚拟硬盘并记下 UUID 信息D:\virtualboxVBoxManage list hdds UUID: 279063de-8822-48c2-97d9-67964fb90b18 Parent UUID: base State: created Type: normal (base) Location: G:\VirtualBoxVMs\Ubuntu\Ubuntu.vdi Storage format: VDI Capacity: 225280 MBytes Encryption: disabled根据指定 UUID 修改对应虚拟机的容量大小例如下面的示例中重新分配了 51200 MB50GVBoxManage modifyhd 279063de-8822-48c2-97d9-67964fb90b18 --resize 51200打开虚拟机安装gparted分区工具sudo apt-get install gparted打开分区工具并将多出来的磁盘分到对应磁盘上。注意如果出现Unable to resize read-only file system可以参照该文章进行解决blog.csdn.net/ningmengzhi…作者Airsaid链接https://juejin.cn/post/7168809689990299678最后如果想要成为架构师或想突破20~30K薪资范畴那就不要局限在编码业务要会选型、扩展提升编程思维。此外良好的职业规划也很重要学习的习惯很重要但是最重要的还是要能持之以恒任何不能坚持落实的计划都是空谈。如果你没有方向这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》帮大家将杂乱、零散、碎片化的知识进行体系化的整理让大家系统而高效地掌握Android开发的各个知识点。相对于我们平时看的碎片化内容这份笔记的知识点更系统化更容易理解和记忆是严格按照知识体系编排的。全套视频资料一、面试合集二、源码解析合集三、开源框架合集欢迎大家一键三连支持若需要文中资料直接点击文末CSDN官方认证微信卡片免费领取↓↓↓