上一篇文章中,我们编译了AOSP的源码并刷入自己编译的ROM到Pixel 6设备中。本文我们使用Android官方提供的IDE(Android Studio For Platform)来打开AOSP源码,并进行debug调试,这样可以方便我们跟踪底层代码的调用流程。
1.安装ASFP
ASFP的官网:https://developer.android.com/studio/platform
我们可以在官网直接下载安装,但需要注意的是,目前只有Linux版本
,我是使用Ubuntu系统,所以可以正常打开并下载。
按照官网的介绍,Android Studio for Platform (ASfP) 适用于使用 Soong 构建系统进行构建的 Android 开源项目 (AOSP) 平台开发人员。 我们可以简单理解为我们平常开发使用的Android Studio,只是开发面对的不是上层应用而是底层Framework层。
它与我们之前使用的源码查看工具不同,它支持我们在同一IDE中编辑Java、Kotlin和C++,同时支持对AOSP源码的debug调试。
下载后可以使用下面的命令安装:
sudo dpkg -i /path/to/asfp-2023.2.1.20-linux.deb
安装这个工具后,我们不光可以用来调试AOSP源码,还可以把它作为正常的Android Studio使用。
2.使用ASFP调试AOSP源码
2.1 导入AOSP源码
调试AOSP源码,需要我们先下载&编译AOSP源码,并拥有一台真机或者模拟器安装了我们编译的镜像。这里可以参考我的上一篇文章一文学会从零搭建编译AOSP源码刷机全流程。
然后我们将我们的AOSP源码导入,导入时需要注意,我们只需要导入我们需要调试的模块即可,这里我们以art模块为例。
选择「Import Asfp Project」,然后按下图填写即可。
需要注意的是Lunch Target,这个值需要与我们之前编译ROM时一致。需要注意的时,编译的Target要是以eng
结尾的版本才是可调试的。
点击「Finish」后会进行一次编译,然后开始建立索引,如果你之前编译过,则整个编译过程会比较短,主要是建立索引的过程较长。
索引建立完以后我们就可以进行代码跳转了。
2.2 Debug调试
这里我们使用ASFP新建一个Android工程,编写逻辑点击按钮后触发gc,核心代码如下:
Runtime.getRuntime().gc()
然后我们在aosp/art/runtime/gc/heap.cc
的collector::GcType Heap::CollectGarbageInternal()
函数中打上断点。
然后我们先安装运行我们的应用,然后在ASFP中选择Attach Debugger to Android Process
如下图,然后我们选择自己的App即可。
我们可以选择Debug C++代码或者Java代码或者同时debug(注意:我实际测试选择Dual(Java + Native)断点会出现异常),分别Debug Java和C++则正常,目前原因还未知,但对我们常规的调试基本是够用的。
我们点击触发C++代码后,可以看到如下断点命中,剩下的步骤就跟常规Debug一致了。
如果你只是Debug Java代码,你只需要使用普通的Android工程,将targetSdk设置为你的ROM系统版本即可正常Debug,并且代码行号也是对应上的,这样对系统资源的消耗会更低。