对google手机编译android源码刷机

一.简介

最近因为修改系统源码层某功能的代码,对多个版本的系统源码进行了编译,并刷到手机中。如果是单纯研究Android源码或Android手机系统层的某个功能,以google原生Android手机和源码为研究对象再适合不过了,因为google官方给出了很全面的源码编译/刷机等说明文档。
编译和刷机常使用到的google提供的链接记录如下,后面章节也会进一步说明以下链接:

  1. 下载源代码,下载前需要先安装repo:安装 Repo。国内推荐使用开源网站的镜像源,例如:清华大学开源软件镜像站-Android 镜像使用帮助
  2. 搭建构建环境
  3. 代号、标记和 Build 号(其中记录着Android的版本分支对应可以刷的手机版本,并且可以通过相应的build ID找到需要安装的手机的 “Driver Binaries for Nexus and Pixel Devices” )
  4. Driver Binaries for Nexus and Pixel Devices(Android系统源码要在编译后刷真机,就需要找到对应的 Driver,然后和源码一起编译)
  5. 编译 Android 官方文档
  6. Factory Images for Nexus and Pixel Devices(google提供的Nexus和pixel刷机包)
  7. 官方刷写设备

二.源码下载和编译

1. 下载repo:

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

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo

curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo

参考:
清华大学开源软件镜像站
LUG @ USTC-AOSP(Android) 镜像使用帮助
repo的运行过程中会尝试访问官方的git源更新自己,但使用google原生的 REPO_URL 需要翻墙或者翻墙,下载速度也很慢,因此需要将repo中REPO_URL替换如下:

REPO_URL = ‘https://gerrit.googlesource.com/git-repo/’ 替换成
REPO_URL = ‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/’ (清华源)或
REPO_URL = ‘https://gerrit-googlesource.proxy.ustclug.org/git-repo/’ (科大源)
如果有其它镜像源提供Android源码下载,也可以使用其他的。

如果不想改repo文件,可直接将REPO_URL 作为环境变量使用。

对google手机编译android源码刷机
可以将如下内容复制到你的~/.bashrc里:
export REPO_URL=’https://mirrors.tuna.tsinghua.edu.cn/git/git-repo’ 或
export REPO_URL = ‘https://gerrit-googlesource.proxy.ustclug.org/git-repo’
之后重启命令行或者source ~/.bashrc后使用。以下章节都是以清华源为例,科大源也是类似。

; 2. 下载Android源码


repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1

repo sync -j8

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2

repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r2

代号、标记和 Build 号 :下载的Android版本一定要支持对应的刷机设备,如下图。

对google手机编译android源码刷机
另外,Build号(如 RQ1D.210105.003)也很重要,因为需要通过这个字符串到Driver Binaries for Nexus and Pixel Devices中查看Nexus 或 Pixel的驱动文件,然后将这些文件加到系统源码根目录一起编译,才能将最终编译成的镜像刷到Nexus 或 Pixel设备中,详细加入方法参考本文编译章节。
对google手机编译android源码刷机
另外,清华镜像源网站也提供了初始化包的方法下载Android源码,使用方法如下:
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
tar xf aosp-latest.tar
cd AOSP

repo sync

由于首次同步需要下载约 95GB 数据,过程中任何网络故障都可能造成同步失败,清华镜像源网站强烈建议您使用初始化包进行初始化。
注明: 目前python版本需要3.6及以上版本。

3. 编译系统源码

1)搭建编译环境

针对不同版本的系统源码,google有给出如下一些环境说明:

  1. Ubuntu 版本以及硬件设备的要求;(磁盘空间等硬件要求
  2. Ubuntu系统中jdk版本(Android 8.0及以下的jdk版本需求及安装方法)和python版本的要求,目前较低版本Android源码编译需要python2.7的环境(至少Android 8还是 ——python版本要求);
  3. 针对不同的ubuntu,google有给出需要安装的软件列表。(设置 Linux 构建环境 (针对多个Ubuntu版本))

如果是严格按照Google的要求配置环境的,那编译基本上没什么问题。即使有,在网上搜一下,也能找到解决方法。

2)加入刷机必须的驱动文件

以下以pixel3 中刷入 android11源码为例。
(1)首先在代号、标记和 Build 号查找android 11中支持pixel 3手机的源码列表,支持pixel 3的Android列表有:android-11.0.0_r28,android-11.0.0_r27,android-11.0.0_r23,android-11.0.0_r18,android-11.0.0_r17,android-11.0.0_r4,android-11.0.0_r1,这里以android-11.0.0_r23为例,下载源码时指定该版本:repo init -u *** -b android-11.0.0_r23。

对google手机编译android源码刷机
(2)查找驱动文件并安装运行
查找网址:Driver Binaries for Nexus and Pixel Devices
通过android-11.0.0_r23的build号”RQ1A.201205.003.A1″查找,如下:
对google手机编译android源码刷机
下载下来后,是两个tgz压缩文件,解压后对应两个sh脚本文件extract-google_devices-blueline.sh和extract-qcom-blueline.sh,将sh脚本拷贝到系统源码根目录,依次运行:
./extract-google_devices-blueline.sh
./extract-qcom-blueline.sh

阅读协议时,但是由于协议过长,可以按ctrl+c进行中断,在此会提示需要输入I ACCEPT。

对google手机编译android源码刷机
注明:如果不加驱动文件,系统源码也是可以在lunch 选择 aosp_blueline-userdebug 编译的,但是会没有vendor.img镜像。并且将编译后的镜像试过刷到pixel3手机,但没有成功。

3)编译

参考:编译 Android

source build/envsetup.sh

. build/envsetup.sh
lunch

make -j8

4.刷机

如果手机bootloader还未解锁,参考:解锁引导加载程序解锁设备。
注意: 最好是使用最新版本的platform-tools,不然可能会导致刷机不成功。
1)在编译安卓源码的电脑上刷机


. build/envsetup.sh
lunch

adb reboot bootloader
cd $ANDROID_PRODUCT_OUT
fastboot flashall -w

2)制作刷机包
如果需要将编译好的镜像给到他人使用,还是需要制作成刷机包。官网刷机包地址:Factory Images for Nexus and Pixel Devices

对google手机编译android源码刷机
下载一个官方的同型号(pixel3 Android11)的刷机包,可以发现里面的内容如下:
刷机包内容如下:
对google手机编译android源码刷机
image-blueline-rp1a.201105.002.zip中内容:

对google手机编译android源码刷机
脚本中内容如下(本人使用的刷机环境是windows刷机,因此以flash-all.bat为例):
@ECHO OFF
PATH=%PATH%;"%SYSTEMROOT%\System32"
fastboot flash bootloader bootloader-blueline-b1c1-0.3-6623201.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash radio radio-blueline-g845-00107-200702-b-6648703.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot -w update image-blueline-rp1a.201105.002.zip

echo Press any key to exit...

pause >nul
exit

编译好的镜像内容中也包含以上文件,如下替换:

  1. bootloader-blueline-b1c1-0.3-6623201.img替换成bootloader.img
  2. radio-blueline-g845-00107-200702-b-6648703.img替换成radio.img
  3. update image-blueline-rp1a.201105.002.zip压缩包中的10个文件在最后的镜像中都包含同名称文件,直接使用那些文件压缩成一个zip格式的压缩包(是对10个文件选中后压缩,不能所在的文件夹压缩,不然就会和原版的对不上)
  4. 脚本中的相应文件名称改成对应的名称
  5. 对pixel3手机运行adb reboot bootloader后,再执行flash-all.bat 亲测可刷机成功。

对google手机编译android源码刷机

5. 编译源码时,问题及解决方法记录

(1) 编译Android 11 时基本没遇到什么问题

(2)编译Android 8 时遇到的问题记录

1)Jack server 问题

Jack server already installed in "/home/tom/.jack-server"
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'
[  0% 6/50989] target  C++: libpdfiumf...nal/pdfium/core/fxge/ge/fx_ge_text.cpp
ninja: build stopped: subcommand failed.

22:57:32 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target 'run_soong_ui' failed
make: *** [run_soong_ui] Error 1

解决方法:

  1. 将 /etc/java-8-openjdk/security/java.security 中 TLSv1, TLSv1.1 去掉,如下:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
改成:
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
  1. 重启服务
 prebuilts/sdk/tools/jack-admin kill-server
 prebuilts/sdk/tools/jack-admin start-server

2)’cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ 导致编译中断
解决方法:

export LC_ALL=C

(3) 下载源码慢

通过科大源下载Android-8.0.0_r2的源码差不多花了4个小时左右,通过vps的命令终端下载花了半个多小时,但从vps上压缩好源码再回传到本地也很慢,不过这种方式可以免去本地装翻墙软件。下载的Android-8.0.0_r2的源码总共有68G,之前下的Android 11的源码大概有109G。
注意: 通过vps命令终端压缩源码时,.repo 目录内容可以删除,编译源码时不会使用到其中内容。如果源码内容太多,则可以分多个文件压缩,如:

7z a source.7z aosp_dir -v1024m

回传压缩包时,使用ubuntu或mac的 scp 命令, 千万不要使用xshell的sz命令,因为前者是后者传输速度的几十倍,例如本人网速一般的情况下,前者是平均 2 Mb/s,后者平均是 70 Kb/s,整整29倍。scp 使用命令如下:

scp root@197.24.23.95:/root/aosp6.0.0_r2_norepo.zip .

(4) emulator 启动虚拟机失败

在Ubuntu 16.04 和 Ubuntu 18.04中编译完系统源码后,使用emulator启动虚拟机时,都失败了,目前还没解决,暂时是用真机。

(5) 最近碰到的nexus5刷官方镜像老是卡在启动界面的问题

最近使用nexus5刷官方镜像时,使用其中自带的 flash-all.sh 或 flash-all.bat 刷机,会一直卡在google字样的启动界面,尝试的Android4~6都是这样。这个问题折腾了挺长时间,后来按照一篇博客上说将google镜像拆开来,一个个img刷入,才解决了问题,刷入脚本可以如下:

fastboot erase cache
fastboot erase userdata
fastboot erase boot
fastboot erase cache
fastboot erase recovery
fastboot erase system

fastboot flash bootloader bootloader-hammerhead-hhz12k.img
fastboot reboot-bootloader

fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.27.img
fastboot reboot-bootloader

fastboot flash recovery recovery.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash cache cache.img
fastboot flash userdata userdata.img

参考自《Nexus5 刷机》。

三. 小结

本文是个人在编译源码时的一些心得记录,如果有什么错误的地方,还请多多指正~

参考链接

  1. 下载源代码
  2. 清华大学开源软件镜像站-Android 镜像使用帮助
  3. 搭建构建环境
  4. 代号、标记和 Build 号
  5. Driver Binaries for Nexus and Pixel Devices
  6. 编译 Android
  7. Factory Images for Nexus and Pixel Devices(google提供的Nexus和pixel刷机包)
  8. 刷写设备
  9. Ubuntu20.04 编译Android 10源码 并烧录源码到pixel3的避坑指南

Original: https://blog.csdn.net/Denny_Chen_/article/details/115272053
Author: Denny_Chen_
Title: 对google手机编译android源码刷机

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817216/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球