当前位置: 首页 > news >正文

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

然后我们就开始漫长的源码同步阶段了.

image-20240926101303783

当读者看到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分支的名称(例如mainrefs/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自动下载。如果项目有父元素,则这里的namepath是前缀。

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

image-20240926141430174

驱动的下载在如下链接下载. 我们找到对应设备的对应版本号

https://developers.google.com/android/drivers?hl=zh-cn

image-20240926141518128

复制下载链接, 在工作目录下执行 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

image-20240926142055804

image-20240926142134968

./extract-qcom-blueline.sh

image-20240926142250539

至此, 我们所有前期的准备工作就完成了.

3. 编译安卓

在前面的所有工作顺利做好以后, 我们就可以开始尝试编译安卓系统了

⚠️请确保你的编译机器配置足够,否则你将会遇到无穷无尽的问题.

其实构建非常简单, 总共就3条命令

source build/envsetup.sh
lunch aosp_blueline-eng
m -j30

其中一些必要了解的点如下:

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

执行完上面的命令以后, 就是非常漫长的等待了, 大概1-2小时.

image-20240926142836517

直到出现下图所示内容, 那么恭喜你, 源码编译成功了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4. 刷入设备 刷机

插上你祖传的Pixel3, 稍等片刻就可以体验上自己编译的镜像了~

adb reboot bootloader
cd out/target/product/blueline/
fastboot flashall -w

image-20240926170150613

引用资料

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经过多个服务器转发会网速变慢吗

会的&#xff0c;IP经过多个服务器转发时&#xff0c;网速通常会变慢&#xff0c;主要原因包括&#xff1a; 增加的延迟&#xff1a; 每经过一个服务器&#xff0c;数据包就需要额外的时间进行处理和转发。这种处理时间和网络延迟会累积&#xff0c;导致整体延迟增加。 带宽限制…...

mongodb通过mongoimport导入JSON文件数据

目录 一、概念 二、mongoimport导入工具 三、导入命令 一、概念 MongoDB是一个流行的开源文档数据库&#xff0c;它支持JSON格式的文档&#xff0c;非常适合存储和处理大量的非结构化数据。在实际应用中&#xff0c;我们经常需要将大量的数据批量导入到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工具。它的作用主要为&#xff1a; 用来检测网络的连通情况和分析网络速度根据域名得到服务器 IP根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。我们通常会用它来直接 ping ip 地址&#xff0c;来测试网络的连…...

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;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 说明&#xff0c;先修改routes配置再调用/actuator/gateway/refresh&#xff0c;接口返回200 status&#xff0c;但…...

【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实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

Java的学习(语法相关)

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

简单的springboot 编写Socket服务接口

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

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  …...

VS Code使用Git Bash终端

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

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)

1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k&#xff0c;k&#xff1b;map是k&#xff0c;v&#xff09;&#xff0c;现在直接用T代替 template<class T> //这里直接传了T作为模板参数&#xff0c;T可能是pai…...

【C++】多态(下)

个人主页~ 多态&#xff08;上&#xff09;~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…...

基于四种网络结构的WISDM数据集仿真及对比:Resnet、LSTM、Shufflenet及CNN

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

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

【分布式微服务云原生】详解Redis的主从模式,主服务器挂了如何从多个从服务器选出新的主服务器

深入探索Redis主从模式&#xff1a;架构、故障转移与最佳实践 摘要&#xff1a; 本文深入探讨了Redis的主从复制模式&#xff0c;包括其工作原理、故障转移机制以及如何配置和管理这一模式。文章通过清晰的结构和实例代码&#xff0c;帮助读者理解如何在实际项目中应用Redis主…...

Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?

目录 一、Context是什么&#xff1f; 在Android中&#xff0c;Context是一个抽象类 &#xff0c;它代表了应用程序的当前状态&#xff0c;包括资源和类加载器等&#xff0c;它提供了一个应用运行所需的信息&#xff0c;比如我们要获取资源 &#xff0c;那么需要她&#xff0c;…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...