一、前言
Android Framework 是整个 Android 系统的基石,不管是做应用开发,还是性能优化,对 Framework 的了解都会有助于工作的展开。尤其是现在转行到了车企公司,对 Framework 的了解就显得更是紧迫。本篇从 Android 源码的下载编译开始,学习了解 Framework 知识。
Android Open Source Project 建议使用 Ubuntu 搭建构建环境,以下步骤均在 Ubuntu 环境下执行。
二、环境搭建
2.1 Ubuntu 环境
Ubuntu 环境申请的是公司的云桌面,对应环境信息如图所示,可以看到云桌面的配置性能还是比较强的。
一般情况下,没有云桌面使用,我们可以使用 VMWare 虚拟机来安装 Ubuntu 环境使用。相关的安装说明可以在网上根据自己设备进行搜索查找。
2.2 git 安装
Git 官方文档:Git - 安装 Git
sudo apt install git
2.3 python3 安装
sudo apt install python3
由于 Ubuntu 22.04 版本中默认的 python 是 3.10 版本,但是在后续源码下载过程中,脚本还是使用的 python,因此建议安装下面这个工具,这样在使用 python 的地方就都使用 python3 来执行了。
sudo apt install python-is-python3
三、源码下载
AOSP(Android Open Source Project) 是 Google 开放的 Android 开源项目,其中文官网为 Android 开源项目。
国内由于墙的原因,无法连接 google 服务,建议使用国内镜像网站,如 中科大镜像 和 清华大学镜像。
本文使用中科大的镜像源。
3.1 Repo 工具说明
Git 是一种分布式版本管理系统,功能很强大,是当前很多开源项目的首选。为了方便在 Android 源码中更轻松的使用,Google 提供了一个基于 git 封装的 Python 脚本,它就是 Repo。
Repo 和 Git 流程有部分不同,主要体现在与远程服务仓库的交互上;而本地的开放仍然是以原生的 Git 命令为主。下面说明 Repo 的一些常用命令,可以和 Git 进行比较。
repo sync #同步当前所有项目
repo sync [PROJECT1][PROJECT2] #同步指定项目
repo start <BRANCH_NAME> #创建一个分支
repo branches #查看当前有多少分支
repo status #查询当前状态
repo diff #查询未提交的修改
repo upload #执行上传指令
3.2 安装 Repo
cd ~ #进入 Home 目录
mkdir ~/bin #创建 bin 目录用于存放 Repo 脚本
PATH=~/bin:$PATH #将 bin 目录加入系统路径
#使用 curl 下载保存 Repo 脚本
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
#给 Repo 脚本授予写权限
chmod a+x ~/bin/repo
3.3 下载源码
mkdir ~/source #新建 source 目录用于存放源码
cd source #进入 source 目录
#这两行是官方推荐做法,需要翻墙。
#获取最新版本的 Repo 及其最新 Bug 修复
repo init -u https://android.googlesource.com/platform/manifest
#或者需要获取其它分支,可使用 -b,如获取 master 分支
repo init -u https://android.googlesource.com/platform/manifest -b master
#国内推荐使用镜像
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r41
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
上述不同源码分支,可查阅 源代码标记和 build。
同时,REPO_URL 使用镜像可在 ~/bin/repo 中修改如下,使用的中科大镜像源。
在源码目录的隐藏文件 .repo 目录下,有一个文件可以查看 repo 相关的配置信息,该文件为:
local_source_code_path/.repo/manifests.git/.repo_config.json
接下来就开始下载源码,预计需要几小时左右。
#下载源码
repo sync
#加快同步速度,传递 -c(当前分支)和 -jthreadcount 标志
repo sync -c -j8
#源码下载结束后,可使用 repo status 检测源码是否下载正常
repo status
3.4 注意项
云桌面这里目前分配的本地空间大小只有 100 多 G,源码下载的位置需要更换,不然空间很容易就满了。云端有挂靠的 data 文件,硬盘空间大小有 6T,因此可以在这个目录下新建源码存储目录。
同时,由于我们不是管理员,这里需要使用命令行来进行文件夹的新建;此外,还需要将新建后的文件夹 owner 改为自己,这样方便后续文件的读写。
进入后,右键 Add to Bookmarks,方便后面从左侧菜单栏进入。
在此处打开命令行,新建文件夹及修改权限
#新建源码存放目录文件夹
sudo mkdir source
#修改文件夹 owner 权限
sudo chown user_name filename
四、源码编译
4.1 编译准备
使用 envsetup.sh 脚本初始化环境,它是每次编译开始的第一个命令。
当执行该脚本命令时,它会将当前终端会话的环境配置设置为 AOSP 构建环境,导入若干命令,让我们能够使用 Android 源代码。
source build/envsetup.sh
然而,这个设置只会在当前终端会话中生效,并不会永久保存。每次重启机器后,终端会话会重新开始,并且之前的环境配置会丢失。因此,需要重新执行命令来重新设置 AOSP 构建环境。
如需查看可用命令的完整列表,可运行hmm 命令。
使用 lunch 选择要构建的目标。lunch product_name-build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境默认输出目录 /out 中,以便供后续对 m 和其他类似命令的调用读取。
同时,默认情况下,每次构建输出都会存储在对应源代码树的 out/ 子目录下,可以通过导出 OUT_DIR/ 环境变量来替换这个设置。使用相同的源代码树为多个目标进行构建时,建议为每个目标使用单独的输出目录(使用单独的输出目录)。如果需要更改输出目录,这个命令需要在lunch 前进行,否则lunch 执行时还是默认的 out/ 输出配置文件。
export OUT_DIR=out/aosp_arm-eng
lunch 选择需要的配置作为参数进行传递。例如,以下命令表示针对模拟器进行完整构建,并且启用所有调试功能。
lunch aosp_arm-eng
如需查看当前的启动设置,可运行以下命令:
echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"
所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:
| 构建类型 | 使用情况 | |
|---|---|---|
| 1 | user | 权限受限;适用于生产环境 |
| 2 | userdebug | 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
| 3 | eng | 具有额外调试工具的开发配置,即 engineering 版本 |
lunch 菜单中提供了建议的设备 build,在不使用任何参数的情况下运行 lunch 命令即可查看。如需了解 AOSP 支持的所有设备的 build 配置,可参阅 选择设备build。
4.2 开始编译
使用 m 构建所有内容。m 可以使用 -jN 参数处理并行任务。如果没有提供 -j 参数,构建系统会自动选择最适合系统的并行任务计数。
#开始编译
m
#查看帮助
m help
# 删除此配置的所有输出和中间件。与 rm -rf out/ 相同
m clean
在构建编译过程中可能会出现各种错误,一般是依赖问题,可根据具体错误安装对应依赖即可。出现如下结果则表示编译成功。
4.3 运行模拟器
上述构建流程会自动将模拟器添加到系统路径中。如需运行模拟器,可输入以下命令
emulator
正常即可启动模拟器,但是我这边报错提示如下:
参考这篇文章的方式:groups.google.com/g/android-b…
#AOSP/device/generic/goldfish/data/etc/encryptionkey.img
emulator -encryption-key <path_to_encryptionkey.img>
继续报错
qemu-system-x86_64: Could not open '/root/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory
参考这篇文章重新编译包尝试 blog.csdn.net/qq_38307618…
#注意,如果你现在 lunch,你是看不到这个选项的,而实际上该 mk 文件是存在的,
#只能 lunch 这个版本,其他的都是针对专有设备的,会导致模拟器无法正常工作。
#Lunch 对应的可选 mk 文件存在 build/make/target/product/ 目录下
lunch sdk_phone_x86_64-eng