0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译

news2024/9/28 8:56:25

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-cn

mv 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.tgz

tar -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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文|部署去中心化网络的 AI 照片管理应用 PhotoPrism

828华为云征文&#xff5c;部署去中心化网络的 AI 照片管理应用 PhotoPrism 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 PhotoPrism3.1 PhotoPrism 介绍3.2 PhotoPrism…

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(驱动移植)

1.将RKNPU驱动移植到Openharmony内核 本文以rk3568为例&#xff0c;将RKNPU驱动移植到Openharmony使用的kernel 5.10中 开发环境 DAYU200 rk3568开发板OpenHarmony 4.1 Release 64位系统 文档约定&#xff1a;4.1r_3568为OpenHarmony标准系统源码根目录 1.0 环境准备 1.搭建O…

Windows11 + Ubuntu 24.10

我在win11安装Ubuntu主板:华硕主板Z790 DARK HERO,进入安装,所以文章中bios系统设置为华硕的bios系统。 一、确认系统信息-BIOS为UEFL 备注:UEFL优于MBR,具体可以查询问ai。如果BIOS模式中不是UEFL,建议为UEFL 1、 win+R 输入 msinfo32,打开系统信息,可以看到…

printf详解

printf("hello \nworld\n")&#xff1a;将hello word打印到屏幕上&#xff0c;在使用printf函数时可以多次使用换行符\n&#xff0c;想在哪里加都可以 int main() {printf("hello \nworld\n");return 0; } 占位符&#xff1a;在printf中&#xff0c;占位…

delphi制作漂亮的农历窗体(IntraWeb+Layui的完美结合)

delphi制作漂亮的农历窗体&#xff08;IntraWebLayui的完美结合&#xff09; 不需要安装服务器&#xff0c;Apache和IIS都不需要&#xff0c;自带企业级服务器。 运行exe服务器就架好了&#xff0c;直接打开手机浏览器或者电脑浏览器&#xff0c;网页就出来了&#xff0c;如果…

AI驱动TDSQL-C Serverless 数据库技术实战营-颠覆传统分析模式:智能体与TDSQL-C结合实现人才的可视化数据分析

文章目录 前言云数据库的对比传统云数据库&#xff1a;TDSQL-C Serverless: 智能体与TDSQL-C的结合思路 算力服务器与数据库服务器申请与部署购买 TDSQL-C Mysql Serverless 实例购买HAI高算力服务器 准备工作准备数据下载依赖 案例开发创建数据库开启智能体与TDSQL-C结合 总结…

智能新宠:BabyAlpha A2开启家庭机器人新时代

具身智能领域的“疯狂”&#xff0c;已经迈入了全新的阶段&#xff01;让我们一起来看看这段视频&#xff1a;一个人形机器人在前面奔跑&#xff0c;一群机器狗紧随其后&#xff1b;接着是人追赶机器狗&#xff0c;随后机器狗又追逐人……视频最后&#xff0c;那个机器人似乎还…

【Python】Daphne:Django 异步服务的桥梁

Daphne 是 Django Channels 项目的一部分&#xff0c;专门用于为 Django 提供支持 HTTP、WebSocket、HTTP2 和 ASGI 协议的异步服务器。Daphne 是一个开源的 Python 异步服务器&#xff0c;它可以帮助开发者运行异步应用程序&#xff0c;并且非常适合与 Django Channels 一起使…

回家啦回家啦

耒阳也有茶颜月色了&#xff0c;没忍住喝了一杯&#xff01; 衡阳卤粉&#xff0c;想出来的味道&#x1f445;&#xff0c;一般般 但一个粉店能做到24小时不打烊&#xff0c;应该也还行哈 银行竟然支持扫脸取钱了&#xff01;&#xff01;

【微服务即时通讯系统】——etcd一致性键值存储系统、etcd的介绍、etcd的安装、etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

--杂项2--

将之前实现的顺序表、栈、队列都更改成模板类 #include <iostream> #include <string.h> using namespace std;template <typename T> class Stack { private:T* a;int top;int size1;public:Stack(int c) : a(new T[c]), top(-1), size1(c) {}~Stack() { de…

IDEA 系列产品 下载

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-mbHnH 仅供参考 环境 演示环境&#xff1a; 操作系统&#xff1a;windows10 产品&#xff1a;IntelliJ IDEA 版本&#xff1a;2024.1.2 注意&#xff1a;如果需要其他产品或者版本可以自行下载&#xff0…

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名称保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本文仅仅依据属性值&#xff0c;将一个shp…

Android界面控件概述

节选自《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年7月出版 做最简单的安卓入门教程&#xff0c;手把手视频、代码、答疑全配齐 控件是Android界面的重要组成单元&#xff0c;Android应用主要通过控件与用户交互&#xff0c;Android提供了非常…

YUView:YUV查看工具

文章目录 引言安装步骤使用YUView查看YUV数据播放与分析功能亮点注意事项 YUView的架构设计 引言 本文将介绍如何在Ubuntu 20.04上安装YUView&#xff0c;并分享其基本使用方法。 安装步骤 安装依赖项 在开始安装YUView前&#xff0c;先确保安装了所有必需的依赖包。打开终…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

每日一题学习笔记

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;提示&…

Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.

一运行就循环打印这个报错&#xff0c; 解决办法&#xff0c;每次改参数之后在HIerarchy中手动保存&#xff0c;就会停止循环打印&#xff0c;style中的字体也显示出来了&#xff0c; 或者 直接换个低版本的

如何使用C语言接入Doris数据库

如何使用C语言接入Doris数据库 一、环境准备1. 安装MySQL C API2. Doris数据库环境二、编写C语言接入代码1. 包含必要的头文件2. 编写连接和查询函数3. 编译和运行程序三、注意事项1. 安全性2. 错误处理3. 性能优化4. 兼容性5. 调试和日志记录四、结论Doris(之前称为Palo或Apa…