0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译
0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译
原文地址: http://www.androidcrack.com/index.php/archives/3/
1. 前言
这是一个非常悲伤的故事, 因为一个意外, 不小心把之前镜像的源码搞坏了. 也没做版本管理,恢复不了了. 那么只能说是重新做一次.
再者以前的镜像太老旧了, 所以我决定这次把镜像更新到Android 12, 它也是Pixel3所能支持的最高镜像了.
开篇之际, 同时会把所有非必要的镜像操作都作为博客, 记录出来. 供大家一起学习交流!
2. 源码拉取
Android 源代码位于由 Google 托管的一组 Git 仓库中。Git 仓库包含 Android 源代码的完整历史记录,其中包括对源代码的更改以及更改时间。
2.1 初始化客户端
首先我们需要创建一个工作目录
cd ~
mkdir android12
cd android12
2.2 代理配置及源码拉取
由于我们都是使用国内网络, 国外专线也十分之昂贵. 故而我们可以使用国内中科大源. 当然, 同时还希望大家自备梯子, 因为在其中,不缺乏有些东西需要访问Google. 所以我们在Ubuntu虚拟机上可以使用 proxychains4
sudo apt-get install proxychains4
vim /etc/proxychains4.conf
安装完成后, 我们需要对配置文件做一下配置,在配置文件的最末尾处编辑为如下
socks5 IP 端口
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5 192.168.100.152 7890
为了保证大家的环境一模一样. 建议想跟着此篇文章了解Android源码编译的读者, 都使用android-12.0.0-r1
版本的镜像. 方便更好的交流.
-b
选项用于标识您正在初始化的分支。如果 -b 未提供,则repo init
默认采用主分支。如需查看分支和标记名称的列表,请参阅源代码标记和 build。
-u
是必需选项,用于指定清单文件。清单是一个 XML 文件,用于指定 Android 源代码中的各种 Git 项目位于工作目录的什么位置。 在此示例中,清单文件的名称未指定,因此命令使用默认清单文件 (default.xml
)。
proxychains4 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r1
proxychains4 repo sync -j8
然后我们就开始漫长的源码同步阶段了.
当读者看到repo sync has finished successfully.
字样的时候,代码通常就下载成功了.
来自谷歌的"排查并解决同步问题"
https://source.android.com/docs/setup/download/troubleshoot-sync?hl=zh-cn
2.3 Repo客户端
2.3.1 repo清单格式
下方引用了一段来自谷歌官方的描述, 按照我的理解就是这个清单是一个配置git下载的列表文件, 它告诉repo应该去哪个仓库拉取代码.
A repo manifest describes the structure of a repo client; that is the directories that are visible and where they should be obtained from with git.
The basic structure of a manifest is a bare Git repository holding a single
default.xml
XML file in the top level directory.Manifests are inherently version controlled, since they are kept within a Git repository. Updates to manifests are automatically obtained by clients during
repo sync
.
2.3.2清单 xml文件格式
进入到.repo
文件夹中, 我们可以看到manifest.xml
这个是我们代码拉取的配置文件.
<?xml version="1.0" encoding="UTF-8"?>
<!--
DO NOT EDIT THIS FILE! It is generated by repo and changes will be discarded.
If you want to use a different manifest, use `repo init -m <file>` instead.If you want to customize your checkout by overriding manifest settings, use
the local_manifests/ directory instead.For more information on repo manifests, check out:
https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
-->
<manifest><include name="default.xml" />
</manifest>
2.3.2.1 remote
我又在 manifest/default.xml
中找到了我们上面xml指向的文件. 文件非常大. 我只抽出部分来看
<manifest><remote name="aosp"fetch=".."review="https://android-review.googlesource.com/" />....
</manifest>
在上面可以看到, 这里有设置一个 remote节点.
- name : 清单文件唯一短名称, 每个远程元素指定一个由一个或多个项目共享的git url,以及(可选)这些项目通过其上传更改的Gerrit审核服务器。
- alias : 别名(这里没有)
- fetch : 所有使用此原创项目的Git URL前缀, 每个项目的名称都附加到该前缀中, 以形成用于克隆项目的实际Url.
- review : 由
repo upload
上传评论的Gerrit服务器的主机名。 这个属性是可选的;如果没有指定,那么repo upload
将不起作用。
2.3.2.2 default
最多可以指定一个默认元素。 当项目元素没有指定自己的remote或revision属性时,将使用其remote和revision属性。
<default revision="refs/tags/android-12.0.0_r1"remote="aosp"sync-j="4" />
- revision : Git分支的名称(例如
main
或refs/heads/main
)。 缺少自己的修订属性的项目元素将使用此修订。 - remote : 以前定义的远程元素的名称。缺乏自己的远程属性的项目元素将使用此远程。
- sync-j : 同步时要使用的并发数。
2.3.2.3 superproject
此元素用于指定超级项目的URL。它有“name”和“remote”作为属性。只有“name”是必需的,而其他的都有合理的默认值。最多只能指定一个超级项目。尝试重新定义它将无法分析。
<superproject name="platform/superproject" remote="aosp"/>
name
:超级项目的唯一名称。此属性与项目的name属性具有相同的含义。有关详细信息,请参见元素项目。remote
:以前定义的远程元素的名称。如果未提供,则使用默认元素提供的远程。
2.3.2.4 project
到了这边, project涵盖了我们整个源码拉取工程最重要的部分
可以指定一个或多个项目元素。 每个元素都描述了一个Git仓库,该仓库将被克隆到仓库客户端工作区中。 您可以通过创建嵌套项目来指定Git-submodules。 Git子模块将被自动识别并继承其父模块的属性,但这些属性可能会被显式指定的项目元素覆盖。
<project path="build/make" name="platform/build" groups="pdk" ><copyfile src="core/root.mk" dest="Makefile" /><linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" /><linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" /><linkfile src="core" dest="build/core" /><linkfile src="envsetup.sh" dest="build/envsetup.sh" /><linkfile src="target" dest="build/target" /><linkfile src="tools" dest="build/tools" /></project><project path="build/bazel" name="platform/build/bazel" groups="pdk" ><linkfile src="bazel.WORKSPACE" dest="WORKSPACE" /><linkfile src="bazel.sh" dest="tools/bazel" /><linkfile src="bazel.BUILD" dest="BUILD" /></project>
name
:此项目的唯一名称。 项目的名称被附加到其远程的获取URL上,以生成实际的URL来配置Git远程。 URL的格式为:
${remote_fetch}/${project_name}.git
-
path
:一个可选的路径,相对于repo客户端的顶层目录,这个项目的Git工作目录应该放在那里。 如果未提供,则使用项目名称。如果项目有父元素,则其路径将以父元素的路径为前缀。 -
groups
:该项目所属的组列表,以空格或逗号分隔。 所有项目都属于“all”组,每个项目自动属于一个组,其名称为:name
,路径为:path
。 例如,对于<project name="monkeys" path="barrel-of"/>
,该项目定义隐含在以下清单组中:default,name:monkeys和path:barrel-of。 如果你将一个项目放在“notdefault”组中,它将不会被repo自动下载。如果项目有父元素,则这里的name
和path
是前缀。
2.3.2.5 copyfile
可以将零个或多个copyfile元素指定为项目元素的子元素。每个元素描述一对src-dest文件;在repo sync
命令期间,“src”文件将被复制到“dest”位置。
“src”是相对于项目的,“dest”是相对于树的顶部的。不允许从项目外部的路径或到存储库客户端外部的路径进行复制。
“src”和“dest”必须是文件。 不允许使用目录或符号链接。中间路径也不能是符号链接。
如果缺少“dest”的父目录,将自动创建。
2.3.2.6 linkfile
它就像copyfile一样,与copyfile同时运行,但它不是复制,而是创建一个符号链接。
符号链接在“dest”(相对于树的顶部)创建,并指向由“src”指定的路径,该路径是项目中的路径。
如果缺少“dest”的父目录,将自动创建。
symlink目标可以是一个文件或目录,但它不能指向repo客户端之外。
2.3.3 repo 命令参考
在了解了repo manifest文件格式以后, 我们再来学习下repo工具的使用.
Repo 简化了跨多个代码库运行的流程,与 Git 相辅相成。
2.4 驱动下载
我们先从下面链接找到我们的版本号
https://source.android.com/docs/setup/reference/build-numbers?hl=zh-cn
我们的版本号为SP1A.210812.015
驱动的下载在如下链接下载. 我们找到对应设备的对应版本号
https://developers.google.com/android/drivers?hl=zh-cn
复制下载链接, 在工作目录下执行 wget
下载, 解压
wget https://dl.google.com/dl/android/aosp/google_devices-blueline-sp1a.210812.015-5a731cd2.tgz?hl=zh-cn
wget https://dl.google.com/dl/android/aosp/qcom-blueline-sp1a.210812.015-afd830c9.tgz?hl=zh-cnmv google_devices-blueline-sp1a.210812.015-5a731cd2.tgz\?hl\=zh-cn google_devices-blueline-sp1a.210812.015-5a731cd2.tgz
mv qcom-blueline-sp1a.210812.015-afd830c9.tgz\?hl\=zh-cn qcom-blueline-sp1a.210812.015-afd830c9.tgztar -zxvf google_devices-blueline-sp1a.210812.015-5a731cd2.tgz
tar -zxvf qcom-blueline-sp1a.210812.015-afd830c9.tgz
执行2个脚本,其中会让我们输入 I ACCEPT
, 然后就会释放一些文件到它该去的地方.
./extract-google_devices-blueline.sh
./extract-qcom-blueline.sh
至此, 我们所有前期的准备工作就完成了.
3. 编译安卓
在前面的所有工作顺利做好以后, 我们就可以开始尝试编译安卓系统了
⚠️请确保你的编译机器配置足够,否则你将会遇到无穷无尽的问题.
其实构建非常简单, 总共就3条命令
source build/envsetup.sh
lunch aosp_blueline-eng
m -j30
其中一些必要了解的点如下:
构建类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
执行完上面的命令以后, 就是非常漫长的等待了, 大概1-2小时.
直到出现下图所示内容, 那么恭喜你, 源码编译成功了!
4. 刷入设备 刷机
插上你祖传的Pixel3, 稍等片刻就可以体验上自己编译的镜像了~
adb reboot bootloader
cd out/target/product/blueline/
fastboot flashall -w
引用资料
https://source.android.com/docs/setup/download?hl=zh-cn
https://source.android.com/docs/setup/reference/build-numbers?hl=zh-cn
https://babyyn.github.io/Sources/AOSP/build.html
https://gerrit.googlesource.com/git-repo/+/main/docs/manifest-format.md
相关文章:

0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译
0. Pixel3 在Ubuntu22下Android12源码拉取 编译 原文地址: http://www.androidcrack.com/index.php/archives/3/ 1. 前言 这是一个非常悲伤的故事, 因为一个意外, 不小心把之前镜像的源码搞坏了. 也没做版本管理,恢复不了了. 那么只能说是重新做一次. 再者以前的镜像太老旧…...
ip经过多个服务器转发会网速变慢吗
会的,IP经过多个服务器转发时,网速通常会变慢,主要原因包括: 增加的延迟: 每经过一个服务器,数据包就需要额外的时间进行处理和转发。这种处理时间和网络延迟会累积,导致整体延迟增加。 带宽限制…...
mongodb通过mongoimport导入JSON文件数据
目录 一、概念 二、mongoimport导入工具 三、导入命令 一、概念 MongoDB是一个流行的开源文档数据库,它支持JSON格式的文档,非常适合存储和处理大量的非结构化数据。在实际应用中,我们经常需要将大量的数据批量导入到MongoDB中。mongoimpo…...

【Qt】控件概述 (1)
控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…...

ping基本使用详解
在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为: 用来检测网络的连通情况和分析网络速度根据域名得到服务器 IP根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。我们通常会用它来直接 ping ip 地址,来测试网络的连…...

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)
目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构(用一个例子来阐明)场景例子:核心点: 五、方法 (架构各部分详解)5.1 模型1. RAG-Sequence Model2. RAG-Toke…...
踩坑spring cloud gateway /actuator/gateway/refresh不生效
版本 java version: 17 spring boot: 3.2.x spring cloud: 2023.0.3 现象 参考Spring Cloud Gateway -> Actuator API -> Refreshing the Route Cache 说明,先修改routes配置再调用/actuator/gateway/refresh,接口返回200 status,但…...

【STM32开发环境搭建】-3-STM32CubeMX Project Manager配置-自动生成一个Keil(MDK-ARM) 5的工程
目录 1 KEIL(MDK-ARM) 5 Project工程设置 2 MCU和嵌入式软件包的选择 3 Code Generator 3.1 STM32Cube Firmware Library Package 3.2 Generated files 3.3 HAL Settings 3.4 Template Settings 4 Advanced Settings 5 自动生成的KEIL(MDK-ARM) 5 Project工程目录 结…...

计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

Java的学习(语法相关)
字符串存储的问题 char 和字符串都是字符的集合,它们之间的确有相似性,但在 Java 中它们有着不同的存储机制和处理方式。让我从 char 和 String 的本质区别入手来解释。 1. char 和 String 的区别 char 是基本类型:char 是 Java 中的基本数据…...

简单的springboot 编写Socket服务接口
简单的springboot 编写Socket服务接口 1.需求 我们项目中有部分老接口为票据接口,其中实现为java socket形式进行实现,但是其中大部分信息都是原始公司封装的包进行实现的,想要修改非常费劲,所以此处简单了解了一下socket&#…...

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)
1. 前言 忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 …...

VS Code使用Git Bash终端
Git Bash可以运行linux命令,在VS Code的终端界面,找到号旁边的箭头,就能直接切换了 当然,前提是安装了Git Bash,并且在资源管理器里,能鼠标右键出"Git Bash Here"...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)
1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k,k;map是k,v),现在直接用T代替 template<class T> //这里直接传了T作为模板参数,T可能是pai…...

【C++】多态(下)
个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…...

基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN
在上节中,我们已经详细介绍了WISDM数据集及如何使用CNN网络训练,得到了六个维度的模型仿真指标及五个维度的可视化分析,那么现在我们将训练模型推广到其他网路结构中去,通过仿真实验来对比一下不同网络之间对于WISDM数据集的训练效…...

【蚂蚁HR-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
【分布式微服务云原生】详解Redis的主从模式,主服务器挂了如何从多个从服务器选出新的主服务器
深入探索Redis主从模式:架构、故障转移与最佳实践 摘要: 本文深入探讨了Redis的主从复制模式,包括其工作原理、故障转移机制以及如何配置和管理这一模式。文章通过清晰的结构和实例代码,帮助读者理解如何在实际项目中应用Redis主…...

Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?
目录 一、Context是什么? 在Android中,Context是一个抽象类 ,它代表了应用程序的当前状态,包括资源和类加载器等,它提供了一个应用运行所需的信息,比如我们要获取资源 ,那么需要她,…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...