惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
H
Help Net Security
腾讯CDC
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
D
DataBreaches.Net
C
Check Point Blog
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

Android Performance

SmartPerfetto 架构文章 Q&A:8 个深度技术问答 从 Trace 到洞察:SmartPerfetto AI Agent 的 Harness Engineering 实战 OpenClaw 常见问题解答:Token 消耗、能干什么、本地模型、隐私安全、使用体验 我把 OpenClaw 跑在本地三周后,发现它根本不是聊天机器人 Android Perfetto 系列 10 - Binder 调度与锁竞争 Android Perfetto 系列 9 - CPU 信息解读 Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析 Android Perfetto 系列 7 - MainThread 和 RenderThread 解读 Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战 Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程 Android Perfetto 系列 4:使用命令行在本地打开超大 Trace Android ANR 系列 3 :ANR 案例分享 Android ANR 系列 2 :ANR 分析套路和关键 Log 介绍 Android ANR 系列 1 :理解 Android ANR 设计思想 Android Perfetto 系列 3:熟悉 Perfetto View Android Perfetto 系列 2:Perfetto Trace 抓取 Android Perfetto 系列 1:Perfetto 工具简介 Android Perfetto 系列目录 2023 年的方方面面 关于 The Android Performance 知识星球介绍 The Performance Design Of OS OS 设计之性能设计 当 App 有了系统权限,真的可以为所欲为? The Performance 星球茶话会 - 第一期 Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇 Systrace 线程 CPU 运行状态分析技巧 - Running 篇 Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇 Android 性能优化的术、道、器 Techniques, Philosophy, and Tools for Android Performance Optimization 回顾 2021
Android 系统开发系列(1):Android 12 源代码下载、编译和刷机
Gracker · 2021-10-26 · via Android Performance

Android 12 正式版 已经发布:https://mp.weixin.qq.com/s/OiFSWEnc-0N2z7JYWTJluw 。Android 12 正式版的代码也已经发布,官方文档 也进行了更新:https://source.android.google.cn/

本文就带大家下载和编译最新的 Android 12 代码,本地编译的代码有下面几个好处

  1. 可以刷真机,方便开发者进行本地 Debug,同时代码可以导入 Android Studio 进行 Debug
  2. 可以编译 Userdebug 版本,可以 root 和 remount,方便对系统和 App 进行 Debug,Debug 模式下可以看到许多 User 版本上看不到的问题;同时由于可以看到更多的信息,也方便进行 App 竞品分析、App 行为分析
  3. 可以更方便地进行 Android 源代码的学习,本地版本可以打开很多系统级别的 Debug Log,也可以自己加 Log,或者自己修改流程

这篇文章记录的是 Android 12/Pixel 3 时代的实操流程,适合作为 Android 12 分支和旧 Pixel 设备的版本化参考;如果你现在要从头构建 AOSP,流程要按官方当前文档调整:源码分支优先使用 android-latest-release,而不是直接跟 master/aosp-main;初始化可以使用 repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest,同步用 repo sync -c -j8 这类只取当前分支的方式;构建前仍然是 source build/envsetup.sh,但新的 lunch 目标格式已经变成 product_name-release_config-build_variant,例如 lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug,之后用 m 构建。真机刷机则要根据当前 Pixel 机型、驱动/厂商二进制、解锁状态和官方支持列表重新选择,不要把文中的 Pixel 3/Android 12 tag 直接套到新设备上。

如果大家没有下载编译 Debug 的需求,只是单纯的看代码的话,推荐使用 cs.android.com 即可。想深入了解 Android 系统的小伙伴和 Android 系统开发初学者可以看看,建议编译配置如下

  1. 闲鱼搞一个二手不带锁的 Pixel 3 以上(Android 12 只支持 Pixel 3 及以上)
  2. 一个有足够大硬盘(最好是 ssd)、足够大内存(最好是 32g,不行就设 swap)、没那么弱的 cpu(否则会影响编译时间)、安装了 Linux 的台式机

1. 代码下载

由于在国内使用 Google 的官方下载站点,会有下不动的情况,有时候 .repo 都下载不下来,所以本教程是以国内的镜像站点为例子,如果你有方法可以爬墙,那么可以简单参考 官方的教程 https://source.android.google.cn/source/downloading

科大 AOSP 镜像站点地址:https://mirrors.ustc.edu.cn/help/aosp.html

下载只需要跟着下面几个步骤走即可(以下方法可以在 Ubuntu、WSL、WSL2、Mac 上运行,但是后面进行代码编译的时候,只能使用 Linux ,所以建议大家还是使用 Ubuntu 这样的 Linux 系统来进行代码的下载、编译、开发工作)

1.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 步骤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 步骤3:创建工程目录

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

1
2
mkdir Android_12_AOSP
cd Android_12_AOSP

1.4 步骤4:初始化仓库

仓库初始化有两种方式,一种是直接下载,另外一种是加 Tag,下载特定的 Tag 版本,下面会对这两种方法分别进行介绍,大家可以自己选择哪一种方式 (注意:这里的两种下载方式会影响后续的驱动下载,所以要记清楚自己使用的是哪种方式,在 驱动下载 章节选择合适的驱动

1.4.1 直接下载(推荐)

这种方法会下载所有的代码,默认分支是 master ,不愁空间的话,直接用这种方法下载即可

1
2
3
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest


这里需要注意,默认的 repo 使用的地址是 REPO_URL = ‘https://gerrit.googlesource.com/git-repo‘ ,这里我们需要修改 REPO_URL,否则会出现无法下载的情况

  1. 修改方法1:在你的 rc 文件里面,加入一条配置即可:REPO_URL=”https://gerrit-googlesource.proxy.ustclug.org/git-repo
  2. 修改方法2:直接打开 ~/bin/repo, 把 REPO_URL 一行替换成下面的: REPO_URL = ‘https://gerrit-googlesource.proxy.ustclug.org/git-repo

下载好 .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 <dreamtale.jg@gmail.com>
If you want to change this, please re-run 'repo init' with

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

如果选择了直接下载,那么就不需要看 3.2 了

1.4.2 下载特定的 Tag

这种方法指的是只下载单个 Tag 所对应的代码,这里的 Tag 可以 查看这里 https://source.android.google.cn/setup/start/build-numbers,比如我的开发机是 Google Pixel 3 XL,我在 Tag 列表查看对应的机型都有哪些 TAG,目前 Android 12 只发布了两个,如下

对应的 Tag 分别是 android-12.0.0_r3 和 android-12.0.0_r1 ,所以下载的时候我可以制定对应的 TAG,这样的好处是下载的代码比较少,下载速度会快一些;不方便的点是更新不方便,Google 会定期发邮件告诉你哪些新的 Tag 发布了,你可以根据这个来更新代码

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

1.5 步骤5 :同步代码

上面步骤三只是下载了 .repo 文件,具体的代码还需要执行 repo sync 来进行下载。由于镜像站的限制和下载过程中可能会遇到的问题,建议大家用 -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  
vim repo.sh
chmod a+x repo.sh
./repo.sh

2. 驱动下载

代码下载完成之后,我们先不着急编译,如果要想在真机上跑,需要下载一些厂商闭源的驱动文件,这样后续编译的代码才可以跑到真机上,此处对应的 官方文档 https://source.android.google.cn/setup/build/downloading#obtaining-proprietary-binaries

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

2.1 直接下载方式所对应的驱动

直接下载的代码使用的是 master 分支,驱动程序需要在这里下载 https://developers.google.cn/android/blobs-preview

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

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

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

如果下载的时候加了 -b ,那么就需要查看对应的 tag 所对应的驱动,地址如下:https://developers.google.cn/android/drivers

以我的 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 寻找对应的驱动即可 https://developers.google.cn/android/drivers

跟 4.2 节下载的 Tag 是对应的:

2.3 驱动提取

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

1
2

./extract-google_devices-crosshatch.sh

1
2

./extract-qcom-crosshatch.sh

3. 代码编译

代码和驱动都下载好之后,就可以开始代码的编译工作了,由于新版本不再支持 Mac 编译,所以建议大家还是使用 Linux 来进行编译,推荐使用 Ubuntu

不再支持Mac编译

3.1 设置编译环境

参考:https://source.android.google.cn/setup/build/initializing

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

运行 lunch 之后,会有一堆设备出来让你选择,还是以我的 Pixel 3 XL 为例,其代号是 ,在这里可以查看所有机型对应的代号:https://source.android.google.cn/setup/build/running#selecting-device-build
Pixel 3 XL 对应的代号是:crosshatch

所以我选择编译的是 aosp_crosshatch-userdebug ,这里可以输入编号也可以直接输入 aosp_crosshatch-userdebug

lunch 选项

然后脚本会进行一系列的配置,输出下面的内容

3.4 全部编译

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

1
m

如上所述,您可以通过在 m 命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像。此外,m 还针对各种特殊目的提供了一些伪目标。以下是一些示例:

  1. droid - m droid 是正常 build。此目标在此处,因为默认目标需要名称。
  2. all - m all 会构建 m droid 构建的所有内容,加上不包含 droid 标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含 Android.mk 文件的所有元素都会构建。
  3. m - 从树的顶部运行构建系统。这很有用,因为您可以在子目录中运行 make。如果您设置了 TOP 环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的 m 来构建整个源代码树,也可以通过指定相应名称来构建特定目标。
  4. mma - 构建当前目录中的所有模块及其依赖项。
  5. mmma - 构建提供的目录中的所有模块及其依赖项。
  6. croot - cd 到树顶部。
  7. 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 flashall -w


fastboot reboot

刷机截图如下
刷机

之后手机会自动重启,然后进入主界面,至此,我们的代码下载-编译-刷机的这部分就结束了

自己编译的 AOSP 的 Launcher 比较丑,因为没有 Google 闭源的那些套件的加持,看上去还是很简陋的,自带的 App 非常少,而且基本上没怎么维护,给到手机厂商的就是这么一个东西

还是官方的 Pixel 带的 Launcher 好看(Google 开发和维护)

如果在刷机的过程中遇到问题,可刷官方的刷机包拯救 :https://developers.google.cn/android/images

5. End

本文主要是讲如何下载、编译、刷机,后续的代码导入、修改和编译模块、代码 Debug 等,会另起一篇文章来介绍

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球 : 欢迎加入,多谢支持~

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

微信扫一扫