Android Framework(一)—— Android11源码下载及编译

1,494 阅读5分钟

网上针对最新版的安卓系统的讲解也不少,由于要出门要找口饭吃,正好也需要接触有关Android Framework层相关知识,在这里我把我学习的部分整理成相关文档,旨在结合最新的安卓11源码讲解我对有关Farmework层的相关知识的理解。

1、准备

由于环境原因,每个人编译安卓源码时可以说都不是一帆风顺的,我们今天就从安卓源码的下载和编译开始,在开始之前,请确保您的主机满足如下条件

操作系统Linux
操作系统类型64位
内存16G以上
处理器4核8线程以上

警告:自 2021 年 6 月 22 日起,安卓操作系统不再支持在 Windows 或 MacOS 上进行构建。

2、下载

2.1 工具下载

  • git
sudo apt-get install git
  • curl下载工具
sudo apt-get install curl
  • 下载repo工具

因为Android源码引用了很多开源项目,每一个子项目都是一个Git仓库,每个Git仓库都有很多分支版本,为了方便统一管理各个子项目的Git仓库,需要一个上层工具批量进行处理,因此repo诞生。

mkdir ~/bin
PATH=~/bin:$PATH
curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo

2.2 源码下载

  • 修改repo

repo在使用之前,会访问repo原地址对自身进行更新,这是作者为统一repo版本而设计的,由于repo源地址在国内是无法访问的,故需要使用国内镜像对repo源地址进行替换。

# 编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
  • 建立工作目录(名字任意)
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
  • 初始化仓库:
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1
  • 同步源码树(以后只需执行这条命令来同步):
repo sync

这一步需要同步近130G数据,请在网络状况良好的情况下完成,一般该步骤需要数小时才能完成,下载完成后repo将对源码进行checkout。

3、源码编译

如果您成功完成了上面的所有步骤,您将可以开始源码的编译

  • 设置环境

使用 envsetup.sh 脚本初始化环境

source build/envsetup.sh
  • 选择编译目标

使用 lunch 选择要构建的目标。lunch product_name*-*build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m 和其他类似命令的调用读取。

lunch sdk_phone_x86_64

注意 安卓官网这步给出的lunch aosp_arm-eng在实际编译完成后是无法正常运行的,这个是很大的坑,很多人都是在这一步卡住了很久,真正能在模拟器上运行的是sdk_phone_x86_64

如需了解所有现有设备的构建配置,请参阅选择设备构建系统。所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

构建类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置
  • 编译代码

使用 m 构建所有内容。m 可以使用 -jN 参数处理并行任务。如果您没有提供 -j 参数,构建系统会自动选择您认为最适合您系统的并行任务计数。

# 第一次构建可以使用all参数,m all 会构建 m droid 构建的所有内容
m all

一般来讲,多线程编译可以选择的最佳线程是您处理器核心的4倍,逻辑线程的两倍

这一步需要花费5小时以上,编译速度视您编译机器的速度而定。编译成功后,您将看到如下输出:

##  make completed successful (01:00:00 (hh:mm:ss)) ##

同时,您将在WORKING_DIRECTORY/out/target/product文件夹下找到您的编译结果

  • 启动模拟器

编译流程会自动将模拟器添加到您的路径中。如需运行模拟器,请输入以下命令:

emulator

如果一帆风顺的话,在这一步您已经可以看到由自己亲手构建的安卓系统已经跑在了模拟器上,但正如前文所说,编译过程大多不是一帆风顺的,如果您遇到了问题,您可以参看下面的问题排查

[附录]问题排查

1、repo出现语法错误

如果您运行repo init或其他有关repo的命令时出现了类似以下的输出,说明您使用的安repo版本与您电脑系统的python版本不匹配。

File "./repo"
line 175 except OSError
e: SyntaxError: invalid syntax

值得注意的是,google官方已经放弃了repo python2.x版本,现有的repo使用的是python3.x版本,您需要更新您的python版本到3.x或者使用如下命令使用repo(其中 ~/bin/repo是您的repo所安装的路径):

python3 ~/bin/repo

2、'userdata-qemu.img': No such file or directory

如果您运行emulator命令出现了以下输出,说明您在lunch这一步选择了专用于其他设备的安卓系统,您需要重新执行lunch sdk_phone_x86_64这个命令进行选择,并重新构建您的安卓源码。

root@xxx:~/aosp# emulator
emulator: Android emulator version 30.7.4.0 (build_id 7479360) (CL:N/A)
emulator: WARNING: encryption is off
handleCpuAcceleration: feature check for hvf
cannot add library /root/aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/lib64/vulkan/libvulkan.so: failed
added library /root/aosp/prebuilts/android-emulator/linux-x86_64/lib64/vulkan/libvulkan.so
emulator: ERROR: VkCommonOperations.cpp:537: Failed to create Vulkan instance.
qemu-system-x86_64: Could not open '/root/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory

3、Unable to connect to adb daemon on port: 5037

如您运行emulator的时候出现了以下输出,说明您的adb工具还未运行。

emulator: ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037

您需要执行以下代码运行adb工具

adb start-server