想要下载并编译安卓系统,请必须预留至少 250G 及以上的空余空间,并保持代理连接稳定,否则将导致下载失败并从头下载!

# 安卓系统编译环境配置

# 为虚拟机配置代理

# 查看虚拟机代理地址

打开 clash for windows , 并打开 Allow LAN 的开关,随后点击 network interfaces

image-20230811175325211

请注意我的虚拟机使用的网络连接方式为 NAT 模式,所以需要关注 VMnet8 的地址,所以对于该虚拟机,代理地址为 192.168.27.1 , 端口就是 clashPort 选项所显示的端口

image-20230811175516413

# 启用虚拟机代理

依次点击如下选项进入代理配置

image-20230811180538737

输入代理地址保存即可

image-20230811180608202

# 配置 docker ubuntu 镜像

# 安装 docker

sudo apt install docker.io

# docker pull 代理配置

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo gedit /etc/systemd/system/docker.service.d/proxy.conf

输入以下代理服务器内容

[Service]
Environment="HTTP_PROXY=http://192.168.27.1:7890/"
Environment="HTTPS_PROXY=http://192.168.27.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1"

# 刷新配置并重启 docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

# docker 镜像代理配置

sudo mkdir -p ~/.docker/
sudo gedit ~/.docker/config.json

输入以下内容

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://192.168.27.1:7890/",
     "httpsProxy": "http://192.168.27.1:7890/",
     "noProxy": "localhost,127.0.0.1"
   }
 }
}

# 下载 Ubuntu 镜像

docker pull ubuntu

# 运行 Ubuntu 镜像

docker run --privileged -it --net host --name aplatform ubuntu /bin/bash

# 安装 sudo,vim

apt-get update
apt-get install vim
apt-get install sudo

# 修改 apt-get 的软件源为阿里源

sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo vim /etc/apt/sources.list

替换为如下内容

deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

随后将 apt-get 更新至最新版本

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

# 安装必要的库

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libssl-dev bc kmod cpio git curl rsync

# 为 git 配置基本信息

git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"
git config --global http.proxy 192.168.27.1:7890

# 安装 repo

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

# 修改 repo 的下载源为清华源,并添加 repo 至全局变量

# 打开全局变量配置文件

sudo vim ~/.bashrc

# 添加全局变量

在末尾添加这三行并保存

# repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
export PATH="~/bin:$PATH"

# 使配置文件生效

source ~/.bashrc

# 安装 python

如果使用 python --version 有打印 python 版本的话,那么这一步就不需要了,如果 docker 中没有安装 python , 在 docker 内使用如下命令安装

sudo apt-get install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.9
sudo ln -s /usr/bin/python3 /usr/bin/python

# 修改交换区大小

为了防止编译源码的过程中由于交换区不足而失败,所以我们需要去修改虚拟机的交换区的大小

# 如果提示 No such file or directory,那就直接进行下面设置交换区的操作
sudo swapoff /swapfile
sudo rm /swapfile
# 设置了 32g 交换区,防止编译失败,执行下列命令需要花费一段时间,如果执行命令后没有输出,请耐心等待命令执行完毕
sudo dd if=/dev/zero of=/swapfile bs=1GB count=32
sudo chmod 600 /swapfile
sudo mkswap -f /swapfile
sudo swapon /swapfile

# 安卓系统源码下载

# 查看 android 版本

进入代号,标记和 build 号来查看安卓系统的版本

如果是预装的系统,那么 kernel 版本和系统版本是有对应关系的,例如我给 pixel3 刷入的系统为 blueline-sp1a.210812.016.c2-factory-fa981d87 , 那么在上面提到的网址内找到该安卓系统该 build ID 所对应的安卓系统版本 android-12.0.0_r34 如图所示

image-20231010095645706

# 下载

输入如下命令来进行安卓系统源码下载,分支就选择我们之前查找到的那个分支

mkdir android-platform && cd android-platform
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r34 --depth=1
repo sync -j4

# 安卓系统编译

在源码下载完成之后,我们首先使用 envsetup.sh 设置构建环境

source build/envsetup.sh

之后使用 lunch 命令选择目标,我们可以直接输入 lunch 来查看可供编译的编译

lunch

google 设备代号中可以知道 pixel3 的设备代号是 blueline

image-20240620192202983

所以我们可以直接使用如下命令设置好编译目标

lunch aosp_blueline-userdebug

这里出现了 Build sandboxing disabled due to nsjail error 报错,这个报错应该是不会影响后续的系统编译的

image-20240620194321797

lunch自定义命令组合
lunch product_name-release-build_variant

此字符串的组成部分包括:

  • product_name 是我们要构建的产品的名称,例如 aosp_cf_x86_64_phoneaosp_husky 。特定的 product_name 可以遵循我们自己的设备格式,但 Google 为其设备采用的格式包含以下组件:

    • aosp 是指 Android 开源平台。
    • (可选)如果要在 Cuttlefish 模拟器中运行目标,则包含 cf
    • 架构和硬件(代号),例如 x86_64_phonehusky (Pixel 8 Pro 的代号)。如需查看 Google 设备的代号列表,请参阅设备代号

    所以对于 pixel3 来说,我们可以将 product_name 配置为 aosp_blueline

  • 将 release 设置为 trunk_staging

  • 此字符串的 build_variant 部分可以是下表中的三个值之一,这里我选择 user 为目标来构建,毕竟谁知道万一编译成 debug 会不会有 app 检测到特征了嘞~

    build_variant 概述 说明 ro.secure ro.debuggable ro.kernel.android.checkjni adb 功能 Proguard 混淆器 DEXPREOPT 预先编译优化
    user release 版本 此 build 变体提供有限的安全访问权限,适用于生产环境。 设定属性 ro.secure=1,打开安全检查功能 设定属性 ro.debuggable=0,关闭应用调试功能 设定属性 ro.kernel.android.checkjni=0,关闭 JNI 调用检查 关闭 打开 打开
    userdebug 部分 debug 版本 此 build 变体可帮助设备开发者了解开发中版本的性能和功耗。使用 userdebug build 进行开发时,请遵循 userdebug 指南 设定属性 ro.secure=1,打开安全检查功能 设定属性 ro.debuggable=1,启用应用调试功能 设定属性 ro.kernel.android.checkjni=0,关闭 JNI 调用检查 打开 打开 打开
    eng debug 版本 此 build 变体的构建时间更短,如果您不在意性能和功耗,它最适合用于日常开发。 设定属性 ro.secure=0,关闭安全检查功能 设定属性 ro.debuggable=1,启用应用调试功能 设定属性 ro.kernel.android.checkjni=1,启用 JNI 调用检查 打开 关闭 关闭

所以对于我的 pixel3 来说编译命令如下

lunch aosp_blueline-trunk_staging-user

但是没想到的是竟然报错了?估计是不能以 user 作为目标编译?之后看看 userdebug 会不会被检测到再决定是否继续研究此处的报错

image-20240620191331546

然后开始编译,给虚拟机分配 12 核的话第一次大概需要两个小时左右可以编译完成,后面再次编译的速度就很快了

make -j8

编译完成后会生成一个 vbmeta.img 文件,到时候我们要刷入的也是这一个文件

image-20240620215327602

# 编译后的镜像刷入手机

//TODO 6.24 号周一的时候刷进去试试看功能是不是正常!

# 参考资料

  • 构建 Android
  • Android 编译选项 eng、user、userdebug 的区别
更新于 阅读次数