前言
在开始学习Android Framework的知识之前,准备好相关的源码环境是非常有必要的。 你可以选择直接在网站上在线观看,但是跳转没有IDE里那么方便。 或者可以下载指定版本的源码,通过IDE查看,但是编译源码比较困难,所以修改源码编译查看疗效也比较困难。
所以这篇文章主要是为了以后编译Android源码的目的。 由于编译源码最好在Linux环境下进行(因为Android官方是在Linux环境下编译的,为了省事),但是我的设备是Windows,所以为了不影响原来的系统源码编译软件安装源码编译软件安装,可以安装一个虚拟机并在虚拟机中安装Linux系统。 或者还有更方便的方式安装Docker,在Docker下安装别人已经规划好的Linux环境,但前者本文不做介绍。
本文使用的环境和版本信息:
使用设备:Windows 10 64位x86系统
VirtualBox:版本 7.0.2
Ubuntu:22.04.1 LTS 版本
开始之前 下载并安装 VirtualBox 虚拟机软件: 下载适用于 Linux 的 Ubuntu 发行版:
VirtualBox的安装非常简单,直接下一步下一步即可。 所以前面主要介绍Ubuntu的安装和配置。
安装Ubuntu 打开VirtualBox,点击“新建”按钮,填写虚拟机的名称:
注意:此时不需要选择ISO Image,所以会自动安装,您可以选择系统语言进行手动安装。
分配显存和线程数(建议至少分配4G内存):
分配c盘大小(建议至少200G):
单击“完成”。
接下来,您将进入系统的安装过程。 语言可以选择英文,输入用户名和密码,根据提示一步步安装即可。
注意:进入系统引导安装页面后,屏幕码率很低,可能会导致显示不完整,例如没有显示下一步的按钮。 这时,你可以使用快捷键Win+鼠标左键拖动安装页面,以显示不完整的页面。
配置Ubuntu修改帧率:由于默认帧率太低,看起来不太舒服,所以可以进入设置页面将帧率调整到合适的大小。 安装增强工具:这可以使用共享目录、共享剪贴板和拖放功能。 点击“设备”->“安装增强工具”,此时文件系统中会出现VBox_GAs_xxx目录。 进入该目录,右键打开当前目录下的终端。 在终端中输入: sudo ./VBoxLinuxAdditions.run 并回车,即可以安装增强工具打开共享目录:可以在“设备”->“共享文件夹”中添加要共享的文件夹。 注:只需勾选“自动挂载”和“固定分配”即可。 重新启动系统后,可以在文件系统中看到sf_xxx目录,即共享目录。 如果点击查看目录出现权限问题,可以使用sudo adduser [用户名] vboxsf命令将当前用户添加到vboxsf用户组中(注意替换为你设置的用户名)。 将“共享粘贴板”和“拖放”设置为单向。 配置网络代理:即使我们在Windows系统上安装了FQ软件,但在Ubuntu系统中仍然无法访问内网。 所以我们需要配置代理,这样以后下载Android源码就更方便了。 例如(IP地址为Windows系统上的IP,端口为FQ软件上设置的端口):
注意:配置完成后最好重新启动系统以使配置生效。
准备安装Repo的源码环境
Android项目很大,是一个超级项目。 所以为了更好的管理代码,Android官方做了一个叫做Repo的工具,以便更好的在Android环境下使用Git来管理代码。 因此,如果我们想要获取Android源码,首先需要准备好工具。
在终端中运行以下命令来安装 Repo Tools:
sudo apt-get update
sudo apt-get install repo
检查是否安装成功:
repo version
如果出现类似下面的输出,则说明安装成功:
airsaid@airsaid-VirtualBox:~$ repo version
repo launcher version 2.17
(from /usr/bin/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/repo
repo运行过程中,会尝试访问官方Git源来更新自身。 如果你想使用镜像源进行更新,可以将以下内容复制到你的~/.bashrc中(使用 sudo nano ~/.bashrc 命令进入nano编辑器进行更改):
# https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
export PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
使用source ~/.bashrc使其立即生效。 下载源码创建一个存放源码的目录:
mkdir <dir_name>
cd <dir_name>
使用真实用户名和短信地址配置 Git:
git config --global user.name YourName
git config --global user.email you@example.com
初始化仓库:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
如果需要指定版本,可以使用-b选项指定分支(此链接包含所有分支信息:):
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.sh脚本用于初始化环境,里面记录了编译过程中需要的各种功能的实现,如lunch、m、mm、mmm等,在下载的源码目录下使用以下命令执行该脚本:
source ./build/envsetup.sh
或者,您可以使用以下命令:
. ./build/envsetup.sh
注意:每次重新打开终端时都需要再次执行该命令。 另外,使用 hmm 查看可用命令的完整列表。
选择编译目标
通过午餐
-命令可以选择要构建的目标。 其中,product_name 指定要构建的产品,build_variant 指定要构建的变体。
所有重构目标都使用 BUILD-BUILDTYPE 方法,其中 BUILD 是指代特定功能组合的代号。 BUILDTYPE 是以下之一:
构建类型 备注
用户
编译的系统有权限限制,适合生产环境
用户调试
编译后的系统具有root权限,调试首选
英语
优先考虑开发效率并关闭额外的调试工具和优化
如果您不知道如何选择目标产品,您可以使用lunch命令枚举可用产品列表。 例如:
airsaid@airsaid-VirtualBox:~/aosp$ lunch
You're 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。
执行编译命令
根据不同的使用场景,有多种编译指令。 编译指令如下表所示:
编译器指令备注
在源代码树的根目录下编译
毫米
编译当前路径下的所有模块,但不包含依赖项
嗯[模块路径]
编译指定路径下的所有模块,但不包含依赖
MMA
编译当前路径下的所有模块并包含依赖项
mmma [模块路径]
编译指定路径下的所有模块并包含依赖
制作[模块名称]
不指定参数时,表示编译整个Android源码(包括依赖)
注:m、mm、mmm、mma、mmma这些命令都是由make完成的。
一般第一次编译都会使用make命令,相当于完全编译。 为了提高编译速度,可以使用-j参数指定线程数,例如:
make -j8
编译成功后,终端会显示构建成功。 同时源码根目录下的/home/air表示/aosp/out/target/product/
编译后的产品将出现在目录中。 比较重要的是以下三个图像文件:
编译过程中可能会遇到以下问题,可以按照相应的解决方案进行解决:
找不到 /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指向python2:
sudo 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:virtualbox>VBoxManage list hdds
UUID: 279063de-8822-48c2-97d9-67964fb90b18
Parent UUID: base
State: created
Type: normal (base)
Location: G:VirtualBoxVMsUbuntuUbuntu.vdi
Storage format: VDI
Capacity: 225280 MBytes
Encryption: disabled
根据指定的UUID修改对应虚拟机的容量。 例如,在下面的示例中,重新分配了 51200 MB (50G):
VBoxManage modifyhd 279063de-8822-48c2-97d9-67964fb90b18 --resize 51200
打开虚拟机并安装gparted分区工具:
sudo apt-get install gparted
打开分区工具,将多余的c盘划分到对应的c盘。
注意:如果出现Unable to resize read-only file system,可以参考这篇文章解决: