文章参考 AOSP 编译和烧写
自己喜欢折腾, 想要自己修改源代码, 编译并刷机.
硬件: Pixel 3A
源码: Android 10.0
系统: Ubuntu 16.04
Google 为我们操碎了心, 为我们提供了一系列的教程供我们学习
https://source.android.com/setup/build/initializing
自己准备一台 Ubuntu 16.04 电脑, 可以在实体电脑上, 也可以开启一个虚拟机, 建议内存至少12GB, 不然可能会因为内存不够出现编译出错的情况.
安装一些必要的工具
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
https://developers.google.com/android/drivers
不同的设备驱动有所不同, 国内手机厂商的驱动多是不开放的, 可以尝试去上述网站找找看, 以 Pixel 3A 手机为例.
https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
根据 2.2.1 查到的 Build 代号, 在上述网站找到相应的分支名, 有可能找不到这个代号, 需要在网页右上角将语言改为英语.
https://source.android.com/setup/build/downloading
源码根据官方教程下载既可, 但因为网络原因不能正常访问, 建议访问下面的网站下载:
从 Google 官网下载步骤如下:
- 安装 Repo 工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
- 下载 AOSP 源码
mkdir -p /var/local/android/aosp
cd /var/local/android/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r10
repo sync -j4
repo start android-10.0.0_r10 --all
需要将 2.2.1 步骤驱动下载并解压到源码目录下, 驱动会放置到源码 vendor 目录下, 这里以 Pixel 3A 为例.
- 下载并解压, 注意: 不同的设备驱动下载地址不一样, 这里以 Pixel 3A 为例
cd /var/local/android/aosp
curl https://dl.google.com/dl/android/aosp/qcom-sargo-qp1a.191105.003-77f22f98.tgz -o qcom-sargo-qp1a.191105.003-77f22f98.tgz
curl https://dl.google.com/dl/android/aosp/google_devices-sargo-qp1a.191105.003-dd53ee45.tgz -o google_devices-sargo-qp1a.191105.003-dd53ee45.tgz
tar -xvf qcom-sargo-qp1a.191105.003-77f22f98.tgz
tar -xvf google_devices-sargo-qp1a.191105.003-dd53ee45.tgz
- 执行驱动预置操作, 需要浏览协议(按空格)并在结尾处输入"I ACCEPT"
./extract-qcom-sargo.sh
./extract-google_devices-sargo.sh
参考开源仓库 Opengapps
安装 Opengapps 所需工具
sudo apt-get instal git-lfs lunzip
编辑.repo/manifest.xml
文件, 将 opengapps 地址添加进去
<remote name="opengapps" fetch="https://github.com/opengapps/"/>
<remote name="gitlab" fetch="https://gitlab.opengapps.org/opengapps/"/>
<project path="vendor/opengapps/build" name="aosp_build" revision="master" remote="opengapps"/>
<project path="vendor/opengapps/sources/all" name="all" clone-depth="1" revision="master" remote="gitlab"/>
<project path="vendor/opengapps/sources/arm" name="arm" clone-depth="1" revision="master" remote="gitlab"/>
<project path="vendor/opengapps/sources/arm64" name="arm64" clone-depth="1" revision="master" remote="gitlab"/>
<project path="vendor/opengapps/sources/x86" name="x86" clone-depth="1" revision="master" remote="gitlab"/>
<project path="vendor/opengapps/sources/x86_64" name="x86_64" clone-depth="1" revision="master" remote="gitlab"/>
编辑vendor/google_devices/bonito/proprietary/device-vendor.mk
文件
stoke 可以替换, 可以在 package types 找到
GAPPS_VARIANT := stock
$(call inherit-product, vendor/opengapps/build/opengapps-packages.mk)
https://source.android.com/setup/build/building
编译时需要先设置环境变量以及 shell 函数, 这些环境在源码 build/envsetup.sh 已经写好
cd /var/local/android/aosp
. build/envsetup.sh
需要使用 lunch 命令设置构建类型, 执行命令后会列出构建类型的列表, 以 Pixel 3A 为例, 选择 aosp_sargo-userdebug, 可以直接输入编号
具体的编译类型可以参考 https://source.android.com/setup/build/building#choose-a-target
lunch
执行 make
make -j8
编译完成后, 会在 out 目录下生成 img 镜像文件, 刷机就是刷入这些镜像文件.
需要设置两个环境变量
PATH: 需要将新生成的 fastboot 设置到 PATH 中, 避免自带的 fastboot 版本太低
ANDROID_PRODUCT_OUT: 将生成的镜像 img 路径设置到 ANDROID_PRODUCT_OUT 中
export ANDROID_PRODUCT_OUT=/var/local/android/aosp/out/target/product/sargo
export PATH=/var/local/android/aosp/out/host/linux-x86/bin:${PATH}
adb reboot bootloader
fastboot flashall -w
fastboot reboot
https://developers.google.com/android/images
刷机时可能需要先将手机解锁, 如果遇到这种情况, 执行下面的步骤, 然后根据手机指示解锁, 再执行 4.1 刷机步骤.
如果依然不能解决, 或者想刷回 Google 的系统, 可以从上述网站刷回
adb reboot bootloader
fastboot flashing unlock