一.简介

最近因为修改系统源码层某功能的代码,对多个版本的系统源码进行了编译,并刷到手机中。如果是单纯研究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 作为环境变量使用。

可以将如下内容复制到你的~/.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源码

# 默认下载最新的Android版本
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
#如果需要某个特定的 Android 版本,则制定分支,如下:
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
# 官网下载,适合在vps上下载完代码,再压缩传回本地
repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r2

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

另外,Build号(如 RQ1D.210105.003)也很重要,因为需要通过这个字符串到Driver Binaries for Nexus and Pixel Devices中查看Nexus 或 Pixel的驱动文件,然后将这些文件加到系统源码根目录一起编译,才能将最终编译成的镜像刷到Nexus 或 Pixel设备中,详细加入方法参考本文编译章节。

另外,清华镜像源网站也提供了初始化包的方法下载Android源码,使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码

由于首次同步需要下载约 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。

(2)查找驱动文件并安装运行
查找网址:Driver Binaries for Nexus and Pixel Devices
通过android-11.0.0_r23的build号“RQ1A.201205.003.A1”查找,如下:

下载下来后,是两个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。

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

3)编译

参考:编译 Android

source build/envsetup.sh
# 或
. build/envsetup.sh
lunch
#选项中选择 aosp_blueline-userdebug 对应的序号
make -j8 #后面数字可相应更改

4.刷机

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

#系统根目录
. build/envsetup.sh
lunch
#选项中选择 aosp_blueline-userdebug 对应的序号
adb reboot bootloader
cd $ANDROID_PRODUCT_OUT
fastboot flashall -w

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

下载一个官方的同型号(pixel3 Android11)的刷机包,可以发现里面的内容如下:
刷机包内容如下:

image-blueline-rp1a.201105.002.zip中内容:


脚本中内容如下(本人使用的刷机环境是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.zipecho 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 亲测可刷机成功。

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-serverprebuilts/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  #每个分包大小设为最大1024m

回传压缩包时,使用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 systemfastboot flash bootloader bootloader-hammerhead-hhz12k.img # 改成对应镜像的相应img的名称
fastboot reboot-bootloaderfastboot flash radio radio-hammerhead-m8974a-2.0.50.2.27.img # 改成对应镜像的相应img的名称
fastboot reboot-bootloaderfastboot 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的避坑指南

对google手机编译android源码刷机相关推荐

  1. 编译android源码刷机到Nexus5x

    基础环境 1.系统:ubuntu16.04 2.安卓版本: android-8.1.0_r1 3.openjdk: 1.8 4.python版本: 2.7(系统默认) 1.设置ubuntu镜像源 /e ...

  2. Android 源码刷机版本号、支持设备对照表(AOSP )

    Android 源码刷机版本号.支持设备对照表(AOSP ) Android 官方地址:https://source.android.com/setup/start/build-numbers#sou ...

  3. Android逆向之源码刷机及Root

    前言 作为一个软件逆向分析师,拥有一台干净纯粹的手机,是一件开心事情. 对于拥有Google Nexus系列机器的我, 编译Android源码并刷入机器中,一件振奋人心的事情,我们今天就来带大家一块来 ...

  4. android:自己动手编译Android源码(超详细)

    自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...

  5. 编译Android源码

    通过参考网上的相关资料,我编译Android源码的步骤如下: 1 我的系统是Ubuntu 8.04 2 系统上必须安装以下工具(摘自网上的资料):    sudo apt-get install bu ...

  6. (转)编译Android源码的全过程

    在网上看到一篇编译android源码的文章,照着做挺行的, 通过参考网上的相关资料,我编译Android源码的步骤如下: * 1 我的系统是Ubuntu 8.04      * 2 系统上必须安装以下 ...

  7. ubuntu 11.10下载和编译Android源码

    ubuntu 11.10下载和编译Android源码 由衷感谢网上的各个博主的文章,给了小弟我莫大的帮助.这里呢,小弟也把自己的经历记录下来,以供大家参考^^.这篇应该算是零基础.从无到有的流程介绍了 ...

  8. 编译android源码及遇到的问题

    编译android源码,首先当然是下载源码. 在source.android.com中可以方便的找到下载流程. 虽然有现成的方法(GIT&REPO)不过最好还是先熟悉一下这两个工具使用方法最好 ...

  9. 编译android源码(小米 mix3内核)

    编译android源码(小米 mix3内核) 一.运行环境搭建 1.Ubuntu选择 在此文章中选择的是ubuntu14.04 2.Linux选择 在此文章中选择的是ubuntu14.04自带的lin ...

最新文章

  1. JavaCV 学习(一):JavaCV 初体验
  2. 图---Dijstra
  3. 工作单元php,PHP面向对象中的工作单元是什么
  4. mysql galera 下载_Mysql-Galera Cluster
  5. 虚拟机下挂载CentOS 镜像并配置yum本地镜像源
  6. Python+matplotlib使用雷达图技术绘制五角星
  7. java 广告插件_徒手创建一个chrome扩展-屏蔽广告插件
  8. python串口操作_Python Serial串口基本操作(收发数据)
  9. 【leetcode】复写零
  10. c#教程与视频教程类专题资料免费下载整理合集
  11. 反激电源电路电磁干扰原理
  12. github用的jekyll是什么意思?
  13. 马来西亚吉隆坡召开的2010OpenWebAsia大会
  14. html如何给盒子设置位置,CSS盒子定位
  15. 133、初沸点的概念
  16. oracle 无效连接,Oracle SQL多重连接与重复记录或“无效标识符”
  17. 常用到的宏定义!!!!!
  18. 星淘惠:跨境电商行业发展逐渐完善,四大方向是跨境电商的未来
  19. git submodule 添加子仓库
  20. Latex 三线表 横线竖线短横线

热门文章

  1. vue 路由进度条 nprogress
  2. 弘辽科技:多多进宝是如何为店铺奠定良好开局的
  3. Flutter 实现超人飞来,满屏的力量感动画
  4. 怎么对物联网卡进行充值?
  5. 自考管理系统中计算机应用可以不考吗,中南财大自考本科中科目“管理系统中计算机应用(实践)”能不能不考?...
  6. android闹钟测评,游戏闹钟AlarmMon评测 让起床变得快乐
  7. 王者荣耀手风琴效果实现
  8. GELOS观点——艺人们为何偷偷布局区块链?
  9. 效用分析 ( 效能分析、Power analysis)是什么?效用分析在线计算器介绍(分析样本量、效用和效应量之间的关系时,需要把其中一个因素固定,计算另外两个因素间的关系、或者给定两个因素计算第三个
  10. HTML css背景图练习——魔兽世界官网页面