最近因为修改系统源码层某功能的代码,对多个版本的系统源码进行了编译,并刷到手机中。如果是单纯研究Android源码或Android手机系统层的某个功能,以google原生Android手机和源码为研究对象再适合不过了,因为google官方给出了很全面的源码编译/刷机等说明文档。
编译和刷机常使用到的google提供的链接记录如下,后面章节也会进一步说明以下链接:
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后使用。以下章节都是以清华源为例,科大源也是类似。
# 默认下载最新的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及以上版本。
针对不同版本的系统源码,google有给出如下一些环境说明:
如果是严格按照Google的要求配置环境的,那编译基本上没什么问题。即使有,在网上搜一下,也能找到解决方法。
以下以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手机,但没有成功。
参考:编译 Android
source build/envsetup.sh
# 或
. build/envsetup.sh
lunch
#选项中选择 aosp_blueline-userdebug 对应的序号
make -j8 #后面数字可相应更改
如果手机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.zip
echo Press any key to exit...
pause >nul
exit
编译好的镜像内容中也包含以上文件,如下替换:
- bootloader-blueline-b1c1-0.3-6623201.img替换成bootloader.img
- radio-blueline-g845-00107-200702-b-6648703.img替换成radio.img
- update image-blueline-rp1a.201105.002.zip压缩包中的10个文件在最后的镜像中都包含同名称文件,直接使用那些文件压缩成一个zip格式的压缩包(是对10个文件选中后压缩,不能所在的文件夹压缩,不然就会和原版的对不上)
- 脚本中的相应文件名称改成对应的名称
- 对pixel3手机运行adb reboot bootloader后,再执行flash-all.bat 亲测可刷机成功。
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
解决方法:
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
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 #在当前终端中加入该环境变量,可以去除本地设置,让命令能正确执行
通过科大源下载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 [email protected]:/root/aosp6.0.0_r2_norepo.zip .
在Ubuntu 16.04 和 Ubuntu 18.04中编译完系统源码后,使用emulator启动虚拟机时,都失败了,目前还没解决,暂时是用真机。
最近使用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 # 改成对应镜像的相应img的名称
fastboot reboot-bootloader
fastboot flash radio radio-hammerhead-m8974a-2.0.50.2.27.img # 改成对应镜像的相应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 刷机》。
本文是个人在编译源码时的一些心得记录,如果有什么错误的地方,还请多多指正~