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是一个抽象类 ,它代表了应用程序的当前状态,包括资源和类加载器等,它提供了一个应用运行所需的信息,比如我们要获取资源 ,那么需要她,…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...