# **Android第三方ROM编译教程(超详细!)**
* 新手应该都会吧?(应该)
* 本教程以使用Ubuntu 21.10为Redmi K30 Pro编译Pixel Experience为例进行教学
# **准备工作**
1.一台搭载Ubuntu 21.10的机器(具体安装自行百度或谷歌,可以双系统)
2.机器要求配置如下:
> * 一个 x86_64 架构的 CPU,性能越强越好
> * 至少 16G 运行内存
> * 有至少 200G 的空闲磁盘空间(硬盘最好是SSD)
>
3.遇到困难不要放弃,坚持寻找问题并在各大博客等地方请求帮助
4.网络一定要通畅!通畅!用国内网一定要挂梯子!不然同步源码会裂开
5.一定得有自己的GitHub账号!
# **准备**
1.先选择自己想要编译的ROM
如:
> Pixel Experience
> Lineage OS
> CrDroid
> Havoc OS
> Evolution X
> ......
2.选择好要编译的ROM后,在Ubuntu打开终端,并切换到root用户(具体操作百度和谷歌都有,这里不详细讲)
3.安装编译 Android 所用到的软件包(复制粘贴Enter就完事了,多简单?)
> 注意一点:第二条apt-get指令在部分服务器无法正常完全安装(如阿里云),解决办法是查看最后报出来没安装的几个包并在代码中删除对应的包,再粘贴到终端中运行即可
```
apt-get update && apt-get upgrade -y
apt-get install -y openjdk-8-jdk git gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses-dev libncurses5 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip bc imagemagick ccache schedtool libssl-dev jq patchelf python-is-python3
```
4.设置 Git 信息
```
git config --global user.name "在此处替换成你的名字"
git config --global user.email "在此处替换成你的邮箱"
```
> 示例
```
git config --global user.name "Zj031210"
git config --global user.email "alonzomax1210@gmail.com"
```
5.下载 Repo
```
mkdir ~/.bin
PATH=~/.bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod +x ~/.bin/repo
```
6.建立一个文件夹,并进入
> 文件夹名字随便,例如我要编译PE我可以设置为PE,我要编译Los可以设置为Lineage,这里我以PE作为例子)
```
mkdir PE && cd PE
```
7.去谷歌一下你要编译的ROM的名字+GitHub
> 依然以PE作为例子,我谷歌的内容是Pixel Experience Github
> 
> 进入PE的GitHub,找到Repositories,点击它,然后在列表内找到manifest,点击并进入
8.找到图中的这两个代码,并记下这两条代码分别的用途
> 
9.在终端中输入初始化仓库的代码
```
repo init -u https://github.com/PixelExperience/manifest -b twelve
```
> 注意:有可能会让你看一堆颜色让你回复y还是n,遇到这种情况直接回复y就行(也就是yes啦)
10.检查一遍自己的网络是否通畅
> 若是在自己家用自己的机器编译,要注意挂梯子,推荐用V2Ray挂梯子比较好,Clash极力不推荐(踩过坑,虽然不知道是不是自己端口啥的设置错了,但是我用QV2Ray连梯子比Clash的配置要舒服得多)
> 若是在服务器上编译,要注意服务器机房设置在国内还是国外(香港、澳门的服务器连的是外网),在国内的话需要挂梯子(有得选肯定选国外的啦)
11.开始同步
```
repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags
```
> 过程很漫长,视网速而定(开梯子的还得看你梯子服务商行不行)
> 我用自己电脑编译的,网速大概在10-15mb/s左右,同步了大概2-3小时,大概50个G左右,所以挂梯子的要准备好流量,不然同步到一半没流量了,那我只好送首凉凉给你听233
12.同步完成后我们还需要下载两个工具包
> **GCC**
```
git clone --depth=1 https://github.com/arter97/arm64-gcc -b master prebuilts/gcc/linux-x86/aarch64/aarch64-elf
git clone --depth=1 https://github.com/arter97/arm32-gcc -b master prebuilts/gcc/linux-x86/arm/arm-eabi
```
> **Clang**
```
git clone --depth=1 https://github.com/kdrag0n/proton-clang -b master prebuilts/clang/host/linux-x86/clang-proton
```
13.开始构建。
> 加载编译环境:
```
source build/envsetup.sh
```
做完这一步,准备过程就完成啦!
# **编译前的准备工作**
1.你需要知道编译所需要什么东西,一般来说就是需要Device Tree或者Common Tree以及一些Vendor和Kernel的Tree,这里我以我的Redmi K30 Pro举个例子
```
device
kernel
vendor
hardware
device extras
```
2.去GitHub寻找你设备所需要的Tree并且将其Fork一份到自己的GitHub账户里
> 一般采用开发成熟的Device Tree会舒服很多
> 举个例子,我Fork一份TH779在Arrow OS官方Device GitHub上发布的Tree,而且一般来说这种已经进官方的基本在其官方的Device GitHub上都有完整的一整套所需要的Tree,不用想那么多,像我一样全部Fork到自己的GitHub去
> 至于怎么Fork自己百度谷歌,这个很基本了吧
> 
**若您不知道需要些什么,请看这里:**
> 后面的保存路径不同的机型也许有不同,所有需要的文件和路径可以在Device Tree的aosp.dependencies(aosp有可能是其他名字啦)中查看
> 举例:

3.修改Device Tree或Common Tree
> 首先你得知道系统的代号是什么
> 举个例子(注意区分大小写!!!!切记!!!!)
```
Havoc OS : havoc
Evolution X : evolution
crDroid : lineage
Pixel Experience : aosp
Lineage OS:lineage
Arrow OS:arrow
```
> 需要修改的内容其实很少,包括以下几个文件
> 文件和文件夹名字有包括系统代号的也得改过去
> 注意:部分文件你可能找不到的,直接跳过即可
> 文件夹名字在GitHub网页版中改不了,可以使用GitHub在Windows的客户端改了之后再同步回去
> 在这些文件中寻找原本系统的代号换成你想编译的代号(我这里是Arrow os转PE,所以就是arrow改成aosp)
> 系统代号有些是大写或者小写字母的,一定要遵循它的格式
```
AndroidProducts.mk
Device.mk
extract-files.sh
arrow.dependencies → aosp.dependencies
arrow_lmi.mk → aosp_lmi.mk
setup-makefiles.sh
overly-arrow/ → overly-aosp/
```
> 还不明白吗?参考我的改动呗
> [lmi:init Aosp](https://github.com/Zj031210/android_device_xiaomi_lmi/commit/c9ed865834f7dcc1c423055e533833fea16208ff)
修改完了?来同步吧!
# **同步Device Tree或Common Tree**
---
首先你得让你的GitHub和你的机器有SSH的连接
> 相关教程谷歌百度或者参考我给的这个教程(会搞的直接跳过这一步就好了)
**教程:**
> 用以下代码产生一组新的密钥:
```
ssh-keygen -t rsa -C "你的邮箱地址"
```
> 把后面的邮箱地址改换成github上的登录邮箱地址就可以
> 默认密钥文件路径在~/.ssh,id_rsa是私钥文件,id_rsa.pub是公钥文件
> 提示“Enter a file in which to save the key(输入要保存密钥的文件)”时,按 Enter 键
> 提示时输入安全密码,按回车再输入一次确认密码,这个密码要记住,后面需要用到,不用密码也可以直接回车就行
**复制密钥**
```
cat ~/.ssh/id_rsa.pub
```
**在GitHub的设置中添加SSH**
**然后在终端检查与GitHub的连接**
```
ssh -T git@github.com
```
> 如果你正确执行了所有这些步骤,那么你会看到以下消息:
```
Hi 你的名字! You've successfully authenticated, but GitHub does not provide shell access.
```
---
**正题到了 这里是同步你的Device Tree或Common Tree**
备注一下:有些装置还有Device Common Tree / Vendor Common Tree / Kernel Common Tree 也要记得同步
> 同步代码格式
```
git clone Github链接 -b 分支 device/品牌名/机型代号
git clone GitHub链接 -b 分支 device/品牌名/extras
git clone Github链接 -b 分支 kernel/品牌名/机型代号
git clone Github链接 -b 分支 vendor/品牌名/机型代号
```
举例:
```
git clone git@github.com:Zj031210/android_device_xiaomi_lmi.git -b twelve device/xiaomi/lmi
git clone git@github.com:Zj031210/android_device_xiaomi_extras.git -b twelve device/xiaomi/extras
git clone git@github.com:Zj031210/android_hardware_xiaomi.git -b twelve hardware/xiaomi
git clone git@github.com:Zj031210/android_vendor_xiaomi_lmi.git -b twelve vendor/xiaomi/lmi
git clone git@github.com:Zj031210/android_kernel_xiaomi_lmi.git -b twelve kernel/xiaomi/lmi
```
将这些一个个键入终端并回车,会自动同步
**备注**
> 后面的保存路径不同的机型也许有不同,所有需要的文件和路径可以在Device Tree的aosp.dependencies(aosp有可能是其他名字啦)中查看
> 举例:

当同步完成后,就可以开始编译啦!
# **编译**
brunch <设备代号> 即可。
如:
```
brunch lmi
```
编译成功会有这样的输出

编译失败则会这样

编译失败可谓都不想见到吧233但是没有办法,这时候只能去酷安或者去XDA啊,去一些开发的Telegram群组寻求帮助(我最近遇到的那个问题就是在TG群组解决的)
**编译成功后,你可以在 out/target/product/<设备代号> 下找到你编译出来的刷机包,刷入即可。**
# **最后**
不要使用任何没有名誉的开发者的源码
建议使用第三方 ROM 官方设备仓库的源码
编译ROM始终是大工程,有问题都是很正常的,需要有耐心
本文根据两个教程文档及其自己在编译过程中所积累的一些经验所写
那两篇文章可以看这里
[EdwardWu的教程](https://hackmd.io/@EdwardWu/CompileAndroidCustomROM)
[TH779的教程](https://blog.779.moe/archives/3/)