使用 ASfP 搭建 Android Framwork 开发调试阅读环境
在之前写《写给Windows用户的AOSP构建开发环境配置指南》 这篇文章的时候,留了一个坑——写一篇文章介绍如何使用Android Studio 对 AOSP Framework 进行调试。在填坑过程中发现 Android Studio 对 Native Framework 的调试支持不好,所以想着写一个 Intellij Plugins 来实现,然后再来补这篇文章,这其中又因为各种事耽搁了。恰巧前段时间 Android 推出了 Android Studio for Platform ,尝鲜后发现仅支持 Java Framwork 调试,直到最近看邮件组已经支持了 Native Framework 调试。
ASfP(Android Studio for Platform) 是 Android 官方推出的专门为 AOSP 开发者打造的 Android Studio。ASfP 支持在一个 IDE 中进行 C++、Kotlin 和 Java 语言的编辑, 同时还支持将调试器附加到 Android 进程以调试 Java 和 C++ 代码,并集成了 Sonng 构建系统。
本篇文章将带领读者,使用 ASfP 搭建一个支持 AOSP 代码编辑和阅读,并能对 Native/Java Framwork 进行调试的环境。由于使用 Cuttlefish 虚拟机,读者可无需配备任何 Pixel 硬件,在个人电脑即可开始调试。
不论你是 Framework 工程师,还是想阅读代码的应用工程师,希望这篇文章能给你带来一点收获。
ASfP 仅支持 Linux 环境,作者也是在 Linux 完成以下步骤,而非 WSL2 环境。
构建 AOSP 和运行 Cuttlefish
在《写给Windows用户的AOSP构建开发环境配置指南》 中已经带领读者构建了 AOSP ,并运行了 Cuttlefish 虚拟机。虽然当时文章是在 WSL2 环境下进行构建,然而,只要留意带有 Ubuntu 标签的章节(注意:无需操作 构建WSL2内核以支持Cuttlefish ),你就可以找到在 Ubuntu 上进行完整构建的清晰步骤,所以可以直接参考这篇文章进行构建,如有问题可以和作者沟通。
在跟随上文成功构建之后,之后我们再次启动 Cuttlefish 虚拟机可以按照下面的步骤进行。而不用每次都进行编译
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd --start_webrtc=true
之后我们打开https://localhost:8443/
就可以看到下面的页面了,我们将调试这台“云手机”进行开发调试,这样可以避免繁琐的刷机步骤和等待时间以及硬件的投入。
ASfP 的安装和导入
安装 ASfP
- 在官网下载 deb 包,当前最新版本为 asfp-2023.2.1.19
- 执行下面的命令进行安装
sudo dpkg -i /path/to/asfp-2023.2.1.19-linux.deb
- 执行
/opt/android-studio-for-platform/bin/studio.sh
打开ASfP,之后你就能看到熟悉又带点陌生的 Android Studio 界面了
项目导入
在成功安装 ASfP 之后,下面我们将 AOSP 源码导入到 ASfP 。
- 点击Import Asfp Project 会出现下面的配置框:
- Repo checkout 是你 AOSP 下载的目录
- Lunch target 应该和构建 AOSP 时的目标一致,这里由于我们目标平台是 Cuttlefish 所以填写了
aosp_cf_x86_64_phone-userdebug
,如果你的目标是真机,按需修改。 - Module paths 选择你关心的目录,这里我们想要阅读调试 art 的代码,由于 art 为 Native 代码,所以勾选了Enable native(C/C++)support 选项
- 其他选项保持默认即可。然后点击 Finish 进行导入
由于在之前我们已经进行过编译,所以在导入到 ASfP 过程中构建并不会花费很长时间(见到如下图中的绿色成功信息就是构建成功了),但是会花费大量的时间在 Indexing 上,这时候我们静静等待就好。
在一切都完成后,这时候右上角 Attach Debugge 会变为可点击,Java/C++ 代码也会支持索引。
调试
无可调试进程解决
当你点击了右上角 Attach Debugge 迫不及待的想调试一下 system_server 或者 Setting 的时候,你竟然发现?一个进程都没有?那肯定是我打开的姿势不对?
这里是因为 Android 13 的这次修改,由于我们是 userdebug 构建,只有 eng 构建才能够进行附加调试,那怎么办呢?很简单代码都在我们手上,我们改一下就好了。正好我们在 ASfP 里面编辑有代码提示,修改逻辑如下即可。
这里为什么选择直接修改代码,如果从 userdebug 改为 eng 构建需要花费较多的时间,
setprop persist.debug.dalvik.vm.jdwp.enabled 1
,又需要进程重启才能应用。
在修改后,我们停止 Cuttlefish 虚拟机(Ctrl+Z 停止命令行),然后重新构建运行:
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
m
launch_cvd --start_webrtc=true
这时候再次点击 Attach Debugge 发现,一切都回来了。
Java 和 Native 的调试
这里我们选择创建一个 Debugging App 来进行调试,别忘了 ASfP 就是 Android Studio,我们可以用 ASfP 新建一个 App ,这个 App 会在点击按钮之后调用 Runtime.getRuntime().gc();
,然后将 App 安装到 Cuttlefish 虚拟机。
回到 AOSP 项目,attach 到 Debugging App 进程,并在 art/runtime/gc/heap.cc 文件中给Heap::CollectGarbageInternal
挂上断点,同时在 Runtime.java 给 getRuntime
挂上断点
点击测试应用的 Button 按钮,这时候会发现,首先触发了 Java 的断点,停在了Runtime#getRuntime
,由于我们强制进行了 gc ,然后又会触发Heap::CollectGarbageInternal
断点,可见在 ASfP 中调试 AOSP 像我们调试应用一样简单方便。
最后
ASfP 的推出不仅为 Framework 开发者带来了方便,对应用开发者来说,ASfP 能够让你无缝进行代码阅读的同时,还可以动手改一改,并动态的调一调,从之前在 Source insight “静态”的代码变成现在“动态”的代码,同时加深开发者对 Framework 的理解,增强自己的基本功。
AOSP 系列文章:
环境搭建:写给Windows用户的AOSP构建开发环境配置指南
Android Kernel调试: Android Kernel 编译与调试指北 & 使用VScode阅读Android Kernel代码并调试