ceph源码下载编译-Android系统开发系列(一):Android 12源码下载、编译与变砖救援

Android 12正式版已经发布:。 Android 12正式版的代码也已经发布,官方文档也已更新:

本文将帮助您下载并编译最新的 Android 12 代码。 本地编译的代码有以下用途:

可以烧写真机,方便开发者进行本地调试。 同时可以将代码导出到Android Studio进行调试,并可以编译Userdebug版本。 可root、重新挂载,方便调试系统和App。 在Debug模式下,可以看到很多看不到的User版本。 问题; 同时,因为可以看到更多的信息,也方便进行App竞品分析和App行为分析,让研究Android源码变得更加容易。 本地版本可以打开很多系统级的Debug Log,也可以自己添加Log。 ,或者自己改变流程

如果不需要下载编译Debug,只看代码的话,推荐使用cs.android.com。想要深入了解Android系统的朋友以及Android系统开发初学者可以看一下。 推荐编译配置如下

闲鱼购买一台二手解锁的Pixel 3及以上(Android 12仅支持Pixel 3及以上),硬盘足够大(最好是SSD),显存足够大(最好是32g,如果没有就设置swap),台式电脑没有这么弱的CPU(否则会影响编译时间)并且安装了Linux 1.代码下载

因为在国外使用Google官方下载站时,可能会出现下载失败的情况,甚至有时无法下载.repo,所以本教程以国外镜像站作为反例。 如果你有爬墙的方法,可以简单参考官方教程

中科大AOSP镜像站点地址:

下载时只需要按照下面的步骤即可(以下方法可以在Ubuntu、WSL、WSL2、Mac上运行,但是编译代码时只能使用Linux,所以建议大家还是使用Linux像Ubuntu这样的系统来下载、编译和开发代码)

1.1 第一步:Repo工具下载

1
2
3
4

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

1.2 第二步:配置个人信息

如果没有安装git,请先自行安装git,然后执行下面的命令并填写您的Name和Email

1
2

git config --global user.name "Your Name" 
git config --global user.email "you@example.com"

比如我填写的

1
2

git config --global user.name "Gracker"
git config --global user.email "dreamtale.jg@gmail.com"

1.2 第三步:创建项目目录

本地建立一个工作目录(名字随意,这里以Android_12_AOSP为例)

1
2

mkdir Android_12_AOSP
cd Android_12_AOSP

1.4 第四步:初始化仓库

仓库初始化有两种形式,一种是直接下载,另一种是添加Tag并下载特定Tag版本。 下面将介绍这两种方法。 您可以选择哪种形式(注意:这里的两种下载方式都会影响后续的驱动下载,所以请记住您使用的是哪种方式,并在驱动下载章节中选择合适的驱动)

1.4.1 直接下载(推荐)

此方法将下载所有代码。 默认分支是master。 如果你不担心空间问题,可以直接使用这些方法下载。

1
2
3

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

这里需要注意的是,默认的repo地址是REPO_URL = ''。 这里我们需要更改REPO_URL,否则会很难下载。

修改方法一:在rc文件中添加配置:REPO_URL="" 修改方法二:直接打开~/bin/repo,将REPO_URL行替换为:REPO_URL = ''

下载.repo后,会有以下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

➜  Android12 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
Downloading Repo source from https://gerrit-googlesource.proxy.ustclug.org/git-repo

... A new version of repo (2.17) is available.
... You should upgrade soon:
cp /home/gracker/Code/Android12/.repo/repo/repo /home/gracker/bin/repo

Downloading manifest from git://mirrors.ustc.edu.cn/aosp/platform/manifest
remote: Enumerating objects: 91965, done.
remote: Total 91965 (delta 0), reused 0 (delta 0)

Your identity is: Gracker
If you want to change this, please re-run 'repo init' with --config-name

repo has been initialized in /home/gracker/Code/Android12

如果选择直接下载,则无需阅读3.2。

1.4.2 下载特定标签

该方法是指只下载单个Tag对应的代码。 可以在此处查看此处的标签。 例如,我的开发机器是 Google Pixel 3 XL。 我检查了相应型号的标签列表。 目前,Android 12仅发布了两个,如下

对应的Tags是android-12.0.0_r3和android-12.0.0_r1,所以我在下载的时候可以制定对应的TAG。 这样做的好处是下载的代码更少,下载速度会更快; 不方便的一点是更新不方便。 Google 会定期向您发送电子邮件ceph源码下载编译,告诉您发布了哪些新标签。 您可以在此基础上更新代码。

1

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b  android-12.0.0_r3

1.5 第五步:同步代码

上面第3步只是下载了.repo文件,具体代码还需要执行reposync来下载。由于镜像站点的限制以及下载过程中可能遇到的问题,建议您使用- j4下载

1

repo sync -j4

然后开始漫长的下载。 由于下载可能会失败,所以可以创建一个sh脚本来循环下载,一醒来就下载。

1
2
3
4
5
6
7
8

#!/bin/bash
repo sync -j4
while [ $? -ne 0 ]
do
echo "======sync failed ,re-sync again======"
sleep 3
repo sync -j4
done

具体方法

1
2
3
4

touch repo.sh  # 1. 创建 repo.sh 文件
vim repo.sh # 2. 复制上面的脚本内容到 repo.sh 里面,这里你可以使用你自己喜欢的方法打开并修改文件,比如 vscode
chmod a+x repo.sh #3. 修改权限
./repo.sh # 4. 运行脚本,万事大吉

2.驱动下载

代码下载下来后,我们并不急于编译。 如果想在真机上运行,​​就需要从厂家下载一些闭源的驱动文件,以便后续编译的代码能够搬到真机上。

上面下载代码的时候我们谈到了两种形式,直接下载和下载特定Tag,不同的下载形式对应不同的驱动

2.1 直接下载对应的驱动

直接下载的代码使用master分支,驱动需要在这里下载

以我的pixel 3 XL为例,我需要下载的驱动程序是

点击Link下载这两个文件,然后解压到代码根目录,然后执行sh脚本将驱动发布到合适的位置。 二进制文件及其相应的 makefile 将安装在源代码树的供应商/层次结构中。

2.2 下载特定Tag代码对应的驱动

如果下载时加了-b,那么需要检查相应标签对应的驱动,地址如下:

以我的pixel 3 XL为例,下载的TAG是android-12.0.0_r3(repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-12.0.0_r3)

然后我们需要找到下部。 这里的SP1A.210812.016.A1对应的是之前的4.2节,即Tag android-12.0.0_r3对应的Build ID为SP1A.210812.016.A1。您可以根据您下载的TAG找到对应的Build ID,并然后根据Build ID找到对应的驱动

对应4.2节下载的Tag:

2.3 驱动提取

下载的内容解压后,有两个sh文件。 以我的Pixel 3 XL为例,在代码根目录下执行,使用D向上翻页,直到最后自动输入I ACCEPT。

1
2

# 解压缩 extract-google_devices-crosshatch.sh
./extract-google_devices-crosshatch.sh

1
2

# 解压缩  ./extract-qcom-crosshatch.sh
./extract-qcom-crosshatch.sh

3. 代码编译

下载完代码和驱动后,就可以开始编译代码了。 由于新版本不再支持Mac编译,建议大家仍然使用Linux进行编译。 推荐使用Ubuntu。

3.1 设置编译环境

参考:

Ubuntu 18.04以上直接运行:

1

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

3.2 设置代码编译环境

每次关闭Shell都需要重新执行以下脚本,相当于配置了编译环境

1

source build/envsetup.sh

或者

1

. build/envsetup.sh

3.3 选择编译目标

1

lunch

吃完午饭后,会有一堆设备供你选择。 我们以我的 Pixel 3 XL 为例。 它的代号是,

Pixel 3 XL 对应的代号是:crosshatch

所以我选择编译aosp_crosshatch-userdebug。 您可以在此处输入数字,也可以直接输入 aosp_crosshatch-userdebug。

然后脚本会进行一系列配置并输出以下内容

3.4 编译全部

使用 m 来构建一切。 m 可以使用-jN 参数来处理并行任务。 如果您不提供 -j 参数,构建系统将手动选择您认为最适合您的系统的并行任务计数。

1

m

如上所述,您可以通过在 m 命令行上列出其名称来构建特定模块,而不是构建完整的设备映像。 此外,m还提供了一些用于各种特殊用途的伪目标。 这里有些例子:

droid - m droid 是一个普通版本。 该目标位于此处是因为默认目标需要名称。 all - m all 构建 m droid 构建的所有内容,以及不包含 droid 标签的所有内容。 构建服务器运行此命令以确保构建树中包含 Android.mk 文件的所有元素。 m - 从树的底部运行构建系统。 这很有用,因为您可以在子目录中运行 make。 如果设置了 TOP 环境变量,它将使用该变量。 如果不设置此变量,它将从当前目录中查找相应的树,试图找到树的顶层。 您可以通过运行不带参数的 m 来构建整个源代码树ceph源码下载编译,也可以通过指定相应的名称来构建特定的目标。 mma - 在当前目录中构建所有模块及其依赖项。 mmma - 在提供的目录中构建所有模块及其依赖项。 croot - cd 到树的底部。 clean - m clean 将删除此配置的所有输出和中间文件。 这与 rm -rf out/ 相同。

运行 m help 查看 m 提供的其他命令

输入m后,将开始第一次完整编译。 这将是一个漫长的等待。 编译时间取决于你的笔记本配置……主要是CPU和显存。 建议显存32G以上,CPU不要太软。

编译成功后会有如下输出

4、闪光灯

使用自己编译的UserDebug固件进行Debug,无论是Debug Framework还是App,都非常方便

编译完成后,开始救砖,以我的测试机Pixel 3 XL为例,依次执行以下命令

1
2
3
4
5
6
7

adb reboot fastboot

# 等待手机进入 fastboot 界面之后
fastboot flashall -w

# 刷机完成之后,执行 fastboot reboot 长期系统即可
fastboot reboot

刷机截图如下

之后手机会手动重启,然后进入主界面。 至此,我们的代码下载-编译-烧写就结束了。

自己编译的AOSP启动器比较难看,因为没有Google这些闭源包的支持,看起来还是很寒酸。 它内置的应用程序很少,而且基本上没有维护。 这是提供给手机制造商的。

它仍然是 Pixel 自带的官方启动器,看起来不错(由 Google 开发和维护)

如果救砖过程中遇到问题,可以刷官方刷机包来保存:

5. 结束

本文主要讲如何下载、编译、刷机。 后续的代码导出、修改编译模块、代码调试等将单独一篇文章介绍。

关于我&&博客关于我,非常希望与您交流,共同进步。 博客内容导航 优秀博客文章记录——Android性能优化必须要知道

一个人可以走得更快,一群人可以走得更远