为了方便调试AOSP源码,我在pdd上花了1000多元买了一台99新的pixel 5手机,终于可以在真机上调试代码了。
代码下载
AOSP代码的下载本专栏已经介绍过e源码编译使用,这里不再重复。 如果你还没有看过,可以看看之前介绍过的文章。
这里要说明的是下载手机型号对应的代码如下,比如如何下载pixel5对应的代码。
打开以下链接AOSP源代码标记和构建可以看到以下内容:(#source-code-tags-and-builds)
supported devices一栏表示该分支的代码支持的手机型号,tag一栏是指我们下载代码时指定的TAG,build ID一栏是用于下载Google闭源资源的id。 因为如果我们要编译一个完整的镜像,除了开源的aosp之外,还有一些部分如drivers、vendor.img等不开源e源码编译使用,所以我们需要通过这个build ID下载对应的资源并放入将它们在aosp源代码目录中解压并编译,最终会生成一个完整的镜像。
由于我们是pixel5设备,所以可以看到支持android-13.0.0_r40,我们首先通过以下命令下载对应的aosp
mkdir android-13.0.0_r40
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r40
repo sync
然后进入以下页面下载Nexus和Pixel设备的驱动程序二进制文件()
android-13.0.0_r40对应的驱动文件的build ID为TQ2A.230405.003.B2,因此我们可以搜索build ID为TQ2A.230405.003.B2的pixel5。
从上图可以看到,我们需要下载两个文件,一个是来自Google的,另一个是来自MediaTek的硬件相关镜像。 由于pixel5采用联发科芯片,因此需要Snapdragon的部分图片。 单击两个红色链接即可下载该文件。 下载完成后解压,发现有两个shell脚本。 我们放到aosp根目录下,如下:
图中标注的是解压后的shell脚本,单独执行。 一开始会复制一些合同条款。 当我们转到最后时,我们需要输入I ACCEPT,然后开始解压。 解压完成后即可编译代码。代码编译
这部分主要介绍编译时如何选择lunch选项。 其实很简单。 打开以下页面并选择设备版本 (#selecting-device-build)
下面是各个模型的编译配置。 例如我们编译pixel5的代码,命令如下:
source build/envsetup.sh
lunch aosp_redfin-userdebug
m -j8
闪光
需要使用fastboot和adb工具来刷机。 我有一个偷懒的方法,如果安装了Android Studio,直接将Sdk中的工具复制到系统的bin目录下。
刷机前需要先打开usb调试,然后执行以下命令开始救砖。
注意一定要在aosp根目录下,如果没有执行lunch则必须先执行
source build/envsetup.sh
lunch aosp_redfin-userdebug
然后开始省砖
adb reboot bootloader
fastboot flashing unlock
这个时候手机上会有选项,根据说明按下音量键切换到允许unlock,再按电源键确认即可。
最后一次执行
fastboot flashall -w
-w会清除data分区,如果不想的话也可以不加-w选项
然后等待存砖完成,手动重启手机。 以下是我刷机成功的输出:
zzh@ubuntu:~/work/android/aosp/android-13.0.0_r40$ fastboot flashall
--------------------------------------------
Checking 'product' OKAY [ 0.069s]
Setting current slot to 'b' OKAY [ 0.087s]
Sending 'boot_b' (98304 KB) OKAY [ 2.720s]
Writing 'boot_b' OKAY [ 0.308s]
Sending 'dtbo_b' (16384 KB) OKAY [ 0.540s]
Writing 'dtbo_b' OKAY [ 0.112s]
Sending 'vbmeta_b' (8 KB) OKAY [ 0.140s]
Writing 'vbmeta_b' OKAY [ 0.079s]
Sending 'vbmeta_system_b' (4 KB) OKAY [ 0.140s]
Writing 'vbmeta_system_b' OKAY [ 0.079s]
Sending 'vendor_boot_b' (98304 KB) OKAY [ 2.680s]
Writing 'vendor_boot_b' OKAY [ 0.308s]
Rebooting into fastboot OKAY [ 0.070s]
< waiting for any device >
Sending 'super' (4 KB) OKAY [ 0.001s]
Updating super partition OKAY [ 0.031s]
Resizing 'product_b' OKAY [ 0.006s]
Resizing 'system_b' OKAY [ 0.006s]
Resizing 'system_ext_b' OKAY [ 0.006s]
Resizing 'system_a' OKAY [ 0.006s]
Resizing 'vendor_b' OKAY [ 0.006s]
Resizing 'vendor_a' OKAY [ 0.006s]
Invalid sparse file format at header magic
Resizing 'product_b' OKAY [ 0.006s]
Sending sparse 'product_b' 1/2 (262140 KB) OKAY [ 6.954s]
Writing 'product_b' OKAY [ 0.710s]
Sending sparse 'product_b' 2/2 (20168 KB) OKAY [ 0.547s]
Writing 'product_b' OKAY [ 0.090s]
Invalid sparse file format at header magic
Resizing 'system_b' OKAY [ 0.006s]
Sending sparse 'system_b' 1/4 (262112 KB) OKAY [ 6.951s]
Writing 'system_b' OKAY [ 0.697s]
Sending sparse 'system_b' 2/4 (262116 KB) OKAY [ 6.912s]
Writing 'system_b' OKAY [ 0.701s]
Sending sparse 'system_b' 3/4 (262140 KB) OKAY [ 6.935s]
Writing 'system_b' OKAY [ 0.679s]
Sending sparse 'system_b' 4/4 (64236 KB) OKAY [ 1.697s]
Writing 'system_b' OKAY [ 0.206s]
Resizing 'system_ext_b' OKAY [ 0.006s]
Sending 'system_ext_b' (191812 KB) OKAY [ 4.977s]
Writing 'system_ext_b' OKAY [ 0.526s]
Resizing 'system_a' OKAY [ 0.005s]
Sending 'system_a' (26672 KB) OKAY [ 0.699s]
Writing 'system_a' OKAY [ 0.091s]
Invalid sparse file format at header magic
Resizing 'vendor_b' OKAY [ 0.010s]
Sending sparse 'vendor_b' 1/3 (262092 KB) OKAY [ 6.941s]
Writing 'vendor_b' OKAY [ 0.731s]
Sending sparse 'vendor_b' 2/3 (262116 KB) OKAY [ 6.881s]
Writing 'vendor_b' OKAY [ 0.692s]
Sending sparse 'vendor_b' 3/3 (239980 KB) OKAY [ 6.379s]
Writing 'vendor_b' OKAY [ 0.627s]
Rebooting OKAY [ 0.000s]
Finished. Total time: 88.360s
调试
由于我们编译的是userdebug版本,所以debug的时候可以push。需要先执行
adb root
adb remount
adb reboot
让我们添加一行日志来验证启动器何时启动:
source build/envsetup.sh
lunch aosp_redfin-userdebug
make Launcher3
将编译好的Launcher3推送到设备并重启
adb root
adb remount
// 在测试时发现已经被安装的apk重启后不会再扫描,需要删除data下的文件才可以,所以我直接install apk验证了。
// 当然其他文件,比如so库,jar包,xml文件等还是可以push验证的。
// adb push out/target/product/redfin/system_ext/priv-app/Launcher3/ /system_ext/priv-app/
adb install -r out/target/product/redfin/system_ext/priv-app/Launcher3/Launcher3.apk
// 此时Launcher会重启,可以看到我们添加的日志打印出来了。
07-26 22:08:53.441 5855 5855 D zzh : Launcher3 Start...
不足的
我买回来的设备,或者从网上下载的对应设备的镜像,有gms服务和应用程序,但是如果我自己编译aosp的话,就没有。 如果我需要它们,我需要安装外部 gms 服务和应用程序。
另外就是系统应用也和原生系统不同。 aosp编译出来的应用程序比较小,而原生系统则比较美观。 不过既然是用来调试代码的,那就无所谓了,有时间就点一下吧。