其实想要从源码编译一个Android Rom无非就是有以下几个要求:

一、 需要什么

(1)基础知识

  • 熟悉Linux基础命令
  • 熟悉的Git使用

不会也没有问题,这恰好是一个学习Linux的机会

会复制粘贴和善用搜索引擎就行

(2)硬件要求

一台服务器或者实体电脑:

  • 至少 8G 运行内存(Android 10以上 要求 16G)
  • 有至少 200G 的空闲磁盘空间

配置越强越好,当然用笔记本也是可以的

贴出我的配置以供参考

笔记本型号MSI PS42
CPUIntel Core i5-8250U
内存16GB 金士顿骇客神条 DDR4 2600MHz
硬盘Intel 760p SSD 512GB

编译耗时 1h30m (Android 11 需要2h30m)

build_success

  CPU越强就可以有更多的线程和更快的处理速度
  内存不用说了,即使16G编译也会跑进swap,内存不够缓存来凑
  硬盘主要影响编译时间,固态硬盘快,机械硬盘慢一点,无所谓

良好的散热条件

开始编译会持续保持100%CPU 占用,我的cpu核心温度到了90度,加个散热底座好一些(86度)

(3)系统要求

aosp官方推荐Ubuntu /Debian
我这里用的是Manjaro KDE,完全没有问题

Manjaro yyds
screenfetch

(4)网络要求

安卓源码往往在国外的服务器上,所以一个畅通的网络是必要的


二、 构建准备

 以Manjaro编译 Pixel Experience 11 plus为例

(1)安装依赖

要编译安卓11,你需要的软件包

base-devel multilib-devel gcc repo git gnupg gperf sdl wxgtk2 squashfs-tools curl ncurses zlib schedtool perl-switch zip unzip libxslt bc rsync ccache lib32-zlib lib32-ncurses lib32-readline ncurses5-compat-libs lib32-ncurses5-compat-libs

这一堆已经有aur包整合了 aosp-devel

如果编译Lineage OS还额外要用到 xml2, lzop, pngcrush, imagemagick,包含在ineageos-devel
所以不管是编译aosp还是 Lineage OS

yay -S lineageos-devel 

即可安装好编译依赖
是不是体会到了arch Linux yay一下啥都有的魅力了?

(2)创建工作目录

mkdir -p ~/bin
mkdir -p ~/android/pe

~/bin目录用来存放repo工具,~/android/pe目录用来存放 PixelExperience的源码

(3)安装repo工具

下载repo二进制文件并使其可执行:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

repo添加至系统环境变量:

编辑你shell的配置文件

  • 使用bash就编辑 ~/.bashrc
  • 如果使用zsh,编辑~/.zshrc

在末尾加入:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

然后source ~/.bashrc 或者source ~/.zshrc

(4)配置git

repo需要验证git身份信息以同步Android源码

# 将""里面的邮箱和用户名换成你自己的
git config --global user.email "chaptsand@gmail.com"
git config --global user.name "chaptsand"

(5)初始化源码仓库

cd ~/android/pe
repo init -u https://github.com/PixelExperience/manifest -b eleven-plus

(6)同步源码

repo sync -j$(nproc --all) -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags

我在这里遇到的问题是:不管用什么代理方式,vendor_gapps都同步不下来,pe的gapps组件放在gitlab上,但是我的连接总是被阻断

解决办法:直接去gitlab打包下载,然后解压到vendor/gapps

然后编辑.repo/manifests/snippets/pixel.xml

<project path="vendor/gapps" name="vendor_gapps" remote="pixel-gitlab" clone-depth="1" />

把这一句删掉,我们以经下载到源码目录了,不需要同步

然后再repo sync就没问题了

如果网络没问题,100M 带宽跑满,大概一个小时左右就同步好了

三、开始编译

进入源码目录

cd ~/android/pe

(1)加载编译环境

source build/envsetup.sh

(2)lunch机型平台

接下来分为三种情况:

  1. 有官方维护:
    lunch <设备代号>

例如,要编译小米9(cepheus)

lunch aosp_cepheus-userdebug
  1. 无官方维护,但有非官方设备树源码:

2.1 去将编译需要用的Tree(device,kernel,vendor)从 Git 托管代码站 Clone 到相应位置(一般是 <device/kernel/vendor>/设备厂商名/设备代号

例如,要编译小米10 (umi)

# 克隆device tree
git clone -b eleven-plus https://github.com/chaptsand/device_xiaomi_umi.git device/xiaomi/umi
# 克隆vendor tree
git clone -b eleven-plus https://github.com/chaptsand/vendor_xiaomi_umi.git vendor/xiaomi/umi
# 这里因为我们用预编译内核,就不需要克隆kernel源码了,如果要编译内核的话,还需要kernel tree

2.2 lunch <设备代号>

lunch aosp_umi-userdebug
  1. 无官方维护,且无非官方源码,但是有其他自定义 ROM 的源码:

3.1 去将编译需要用的源码(device,kernel,vendor)从 Git 托管代码站 Clone 到相应位置(一般是 <device/kernel/vendor>/设备厂商名/设备代号)。

3.2 在此基础上作 ify(参考这里

3.3 lunch <设备代号>

(3)开启cache加速(推荐)

# Setup ccache
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

建议将这段加到你的shell配置文件里
然后,source ~/.zshrc

设置最大ccache缓存

ccache -M 50G

其中50G对应于50GB的缓存,性能足够的话,大概1小时构建时间可以减少到20分钟,第一次编译需要6个小时左右,开启ccache跑过一遍后再编译只需要两个半小时

这一步不是必须的,根据你的硬盘剩余空间来决定是否开启,编译产物将近有100G,加上源码100G,ccache再开50G ,妥妥的250G没了

(4)Start the build

终于可以开始了,淦

croot
mka bacon -j$(nproc --all)

漫长的等待.....

(5)查看编译产物

out

编译完成后,你可以在 out/target/product/<设备代号> 下找到你编译出来的刷机包

enjoy

Last modification:May 9th, 2021 at 05:58 pm
支持我的工作,请我喝杯可乐