使用Google Pixel5手机调试AOSP(代码下载、编译、刷机、调试)详细攻略

欢迎关注微信公众号 无限无羡

为了方便调试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编译出来的应用都比较简陋,原生系统带的比较美观。不过既然是调试代码使用,这个就无所谓了,自己有空了定制一下也是可以的。

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui