Android调试之Framework Java调试

时间:2024-04-01 22:52:51

概述

转载请注明出处:https://blog.csdn.net/wangzaieee/article/details/83993829

之前我们讲了Framework Native的调试,但是实际开发中我们见到最多的是Framework Java层的核心系统服务,例如ActivityManagerService(AMS),PowerManagerService(PMS)和PackageManagerService(PKMS)等等。这个时候我们如何追踪调试java代码呢?
下面我们来讲解一下如何使用Android Studio调试Framework Java代码,分为两步:

  • 将Android Framework代码导入Android Studio
  • 调试Framework Java代码

Framework代码导入Android Studio

准备条件

  • 已经编译好的Android源码(debug)
  • 使用上面镜像的设备
  • Android Studio

配置环境

# 配置环境
$ source build/envsetup.sh
# 选择编译版本
$ lunch

导入Framework源码我们需要用到idegen这个工具,首先我们看一下该工具的README,目录是(先进入源码根目录):

./development/tools/idegen/README

查看里面的部分内容:

If you’re using IntelliJ…

From the project’s root directory…

  1. make (to produce generated .java source)

  2. development/tools/idegen/idegen.sh

  3. Open android.ipr in IntelliJ. If you already have the project open,
    hit the sync button in IntelliJ, and it will automatically detect the
    updated configuration.

    If you get unexpected compilation errors from IntelliJ, try running
    “Build -> Rebuild Project”. Sometimes IntelliJ gets confused after the
    project changes significantly.

大致意思是,使用Android Studio导入Andorid源码的步骤:

# 编译系统,如果已经编译过了,就跳过
$ make 
# 编译idegen工具,生成idegen.jar
$ mmm development/tools/idegen
# 生成源码对应的配置文件(android.ipr和android.iml)
$ source development/tools/idegen/idegen.sh

然后Android Studio以Project的方式打开android.ipr文件,等待一段时间,就可以来调试Framework Java代码了。

选择导入文件

导入的时候我们发现导入的很慢,我们截取android.iml部分文件如下:

<sourceFolder url=“file://./art/test/005-annotations/src” isTestSource=“true”/>
<excludeFolder url=“file://./frameworks/base/docs”/>

sourceFolder表示要导入的目录,excludeFolder表示不导入的目录,查看这个文件会发现有很多我们根本不需要导入的代码,比如art/、cts/等等目录下的代码。有没有一种方式可以只导入我想要的代码呢?比如只要frameworks/目录的代码,以下是和上面同一个README文件中的方案:

Excluding source roots and jars

IDEGen keeps an exclusion list in the “excluded-paths” file. This file
has one regular expression per line that matches paths (relative to the
project root) that should be excluded from the IDE configuration. We
use Java’s regular expression parser (see java.util.regex.Parser).

You can create your own additional exclusion list by creating an
“excluded-paths” file in the project’s root directory. For example, you
might exclude all apps except the Browser in your IDE configuration with
this regular expression: “^packages/apps/(?!Browser)”.

大致意思是有一个配置文件excluded-paths文件,可以配置哪些目录代码导入,哪些目录代码不导入,文件路径为(和README在同一级目录):

./development/tools/idegen/excluded-paths

我们在exclued-paths文件中添加如下内容:

#Exclude all except FrameWork
^abi$ #过滤abi/目录
^art$ #过滤art/目录
^bionic$ #过滤bionic/目录
^bootable$ #过滤bootable/目录
^build$ #过滤builde/目录
^cts$ #过滤cts/目录
#...等等你想过滤的目录

然后重新执行:

# 生成源码对应的配置文件(android.ipr和android.iml)
$ source development/tools/idegen/idegen.sh

查看android.iml文件就精简了很多(我这边就只有frameworks的目录代码了,其他的全过滤掉),然后使用Andorid Studio打开android.ipr文件发现导入的速度很快,这个时候我们就可以调试Framework Java代码了。

调试Framework Java代码

本文以调试AMS的startActivity方法为例。我们知道AMS是运行在system_server进程中,所以Android Studio要选择这个进程attach然后调试(Android Studio中的进程名是system_process
调试流程如下:

  • 连接设备到电脑上,然后点击 Android调试之Framework Java调试Attach debugger to Android process 按钮,选择system_process进程进行调试
  • 然后给AMS打断点,Shift+Shift搜索ActivityManagerNative.java文件,然后给OnTransact()的START_ACTIVITY_TRANSACTION代码下的startActivity()方法打断点
  • 然后随便点击一个应用,走到断点,如下图所示
    Android调试之Framework Java调试

然后进行调试,f7单步调试,f8进入方法体等等,具体调试技巧查看android官方调试文档

以上就是Framework Java代码的调试流程,如果觉得写的对你有帮助请留下一个赞吧~觉得写的不好的地方也请批评指出~