做淘宝好还是自建网站好,怎么做单页竞价网站,无法打开建行网站,asp网站开发书籍0. Pixel3 在Ubuntu22下Android12源码拉取 编译
原文地址: http://www.androidcrack.com/index.php/archives/3/
1. 前言
这是一个非常悲伤的故事, 因为一个意外, 不小心把之前镜像的源码搞坏了. 也没做版本管理,恢复不了了. 那么只能说是重新做一次.
再者以前的镜像太老旧…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 android122.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?hlzh-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 version1.0 encodingUTF-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
--
manifestinclude namedefault.xml /
/manifest
2.3.2.1 remote
我又在 manifest/default.xml中找到了我们上面xml指向的文件. 文件非常大. 我只抽出部分来看
manifestremote nameaospfetch..reviewhttps://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 revisionrefs/tags/android-12.0.0_r1remoteaospsync-j4 /revision : Git分支的名称例如main或refs/heads/main。 缺少自己的修订属性的项目元素将使用此修订。remote : 以前定义的远程元素的名称。缺乏自己的远程属性的项目元素将使用此远程。sync-j : 同步时要使用的并发数。
2.3.2.3 superproject
此元素用于指定超级项目的URL。它有“name”和“remote”作为属性。只有“name”是必需的而其他的都有合理的默认值。最多只能指定一个超级项目。尝试重新定义它将无法分析。 superproject nameplatform/superproject remoteaosp/
name超级项目的唯一名称。此属性与项目的name属性具有相同的含义。有关详细信息请参见元素项目。remote以前定义的远程元素的名称。如果未提供则使用默认元素提供的远程。
2.3.2.4 project
到了这边, project涵盖了我们整个源码拉取工程最重要的部分
可以指定一个或多个项目元素。 每个元素都描述了一个Git仓库该仓库将被克隆到仓库客户端工作区中。 您可以通过创建嵌套项目来指定Git-submodules。 Git子模块将被自动识别并继承其父模块的属性但这些属性可能会被显式指定的项目元素覆盖。 project pathbuild/make nameplatform/build groupspdk copyfile srccore/root.mk destMakefile /linkfile srcCleanSpec.mk destbuild/CleanSpec.mk /linkfile srcbuildspec.mk.default destbuild/buildspec.mk.default /linkfile srccore destbuild/core /linkfile srcenvsetup.sh destbuild/envsetup.sh /linkfile srctarget destbuild/target /linkfile srctools destbuild/tools //projectproject pathbuild/bazel nameplatform/build/bazel groupspdk linkfile srcbazel.WORKSPACE destWORKSPACE /linkfile srcbazel.sh desttools/bazel /linkfile srcbazel.BUILD destBUILD //projectname此项目的唯一名称。 项目的名称被附加到其远程的获取URL上以生成实际的URL来配置Git远程。 URL的格式为
${remote_fetch}/${project_name}.gitpath一个可选的路径相对于repo客户端的顶层目录这个项目的Git工作目录应该放在那里。 如果未提供则使用项目名称。如果项目有父元素则其路径将以父元素的路径为前缀。 groups该项目所属的组列表以空格或逗号分隔。 所有项目都属于“all”组每个项目自动属于一个组其名称为name路径为path。 例如对于project namemonkeys pathbarrel-of/该项目定义隐含在以下清单组中defaultnamemonkeys和pathbarrel-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?hlzh-cn 我们的版本号为SP1A.210812.015 驱动的下载在如下链接下载. 我们找到对应设备的对应版本号 https://developers.google.com/android/drivers?hlzh-cn 复制下载链接, 在工作目录下执行 wget下载, 解压
wget https://dl.google.com/dl/android/aosp/google_devices-blueline-sp1a.210812.015-5a731cd2.tgz?hlzh-cn
wget https://dl.google.com/dl/android/aosp/qcom-blueline-sp1a.210812.015-afd830c9.tgz?hlzh-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?hlzh-cn https://source.android.com/docs/setup/reference/build-numbers?hlzh-cn https://babyyn.github.io/Sources/AOSP/build.html https://gerrit.googlesource.com/git-repo//main/docs/manifest-format.md