欢迎关注微信公众号 [无限无羡]
为了方便调试AOSP源码 ,花1000多大洋在pdd上买了一个99新的pixel5手机,从此终于可以在真机上调试代码了。
代码下载
AOSP代码的下载在本专栏中已经有文章介绍过了,这里就不再赘述,没看过的可以去翻看之前介绍的文章。
这里想要说明的是如下下载对应手机型号的代码,比如pixel5对应的代码如何下载。
打开如下链接AOSP源代码标记和 build可以看到如下内容:
在这里插入图片描述
支持的设备一栏表明该分支的代码支持的手机型号,标记一栏指的是我们下载代码时指定的TAG,build ID一栏是用来下载Google的闭源资源的id。因为我们想要编译一个完整镜像的话,除了开源的aosp之外,还有一部分比如驱动、vendor.img等是不开源的,就需要通过这个build ID来下载对应的资源,放到aosp源码目录下进行解压编译,最后会生成完整的镜像。
由于我们是pixel5设备,可以看到android-13.0.0_r40是支持的,我们先通过如下命令下载对应aosp
bash
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,所以我们搜索buildID 为TQ2A.230405.003.B2的pixel5即可。
在这里插入图片描述
如上图可以看到,我们需要下载两个文件,一个是Google的,一个是高通的关于硬件相关的镜像。因为pixel5用的是高通芯片,所以需要高通的部分镜像。点击两个蓝色Link进行文件下载。下载完毕后进行解压发现是两个shell脚本。我们将其放到aosp根目录下,如下:
在这里插入图片描述
图中标记出来的就是解压后的shell脚本,分别执行,开始会有一些协议条款的打印,我们翻到最后,需要输入I ACCEPT,然后就开始解压了。解压完成后就可以进行代码编译了。
代码编译
这部分主要介绍编译时的lunch选项怎么选,其实也很简单,打开如下页面选择设备 build
在这里插入图片描述
这里列出了每个机型的编译配置,比如我们编译pixel5的代码,用如下命令:
bash
source build/envsetup.sh
lunch aosp_redfin-userdebug
m -j8
刷机
刷机需要用到fastboot和adb工具,我有一个偷懒的方法就是如果安装了Android Studio的话,直接将Sdk里的工具复制到系统的bin目录下即可。
在这里插入图片描述
刷机前需要先打开usb调试,然后执行如下命令开始刷机。
注意要在aosp根目录,如果没有进行过lunch要先执行
bash
source build/envsetup.sh
lunch aosp_redfin-userdebug
然后开始刷机
adb reboot bootloader
fastboot flashing unlock
这个时候手机上会有选项,根据说明按下音量键切换到允许unlock,再按电源键确认即可。
最后执行
diff
fastboot flashall -w
-w会清除data分区,如果不想的话也可以不加-w选项
然后等待刷机完成手机自动重启开机即可,下面是我刷成功的输出:
ruby
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版本,所以后面我们调试时是可以进行push的。需要先执行
adb root
adb remount
adb reboot
我们在Launcher启动时加一行日志来进行验证一下:
在这里插入图片描述
bash
source build/envsetup.sh
lunch aosp_redfin-userdebug
make Launcher3
在这里插入图片描述
将编译好的Launcher3 push到设备并重启
ruby
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编译出来的应用都比较简陋,原生系统带的比较美观。不过既然是调试代码使用,这个就无所谓了,自己有空了定制一下也是可以的。