android 简单调试 FrameWork 层代码的方法

1,403 阅读2分钟

本文主要记录一下如何在不编译源码的情况下,如何编译 android framework 框架层源码的技巧和经验。

Framework 构成

android 系统的构成,从上到下依次是:

  1. app 应用层
  2. frameWork 框架层
  3. library 系统库层
  4. linux 内核层

在日常开发过程中,和我们接触最多的就是应用层和 frameWork 框架层了,下面就介绍一下怎么简单的来调试 fragmeWork 相关的代码。

下面以两个具体的例子来进行说明:

debug ActivityManagerService

我们以 debug android 9.0 的代码为例。

  1. 打开 android 模拟器,使用 Android 9.0 的镜像文件。

用其他模拟器(譬如 Genymotion)也行,但是使用的 android 系统版本必须和需要调试的代码是一致的。 注意这里选择模拟器时要选择不带 play store 的,带了 play store 的使用的系统基于 release 的,无法 debug 系统相关的服务。

  1. 打开 AndroidStudio ,新建项目,Next 直至完成。

  2. 找到你要下载的代码,譬如 android 9.0 的 ActivityManagerService 可以从这里下载

  3. 在项目中创建对应的 package,这里我们需要创建的包名是:com.android.server.am

  4. 将下载好的文件移动到我们刚创建好的包名下。 完成后大概会长这样

  5. 在 ActivityManagerService.java 的 startActivity 方法上面设置断点,然后找到菜单的 Run -> Attach debugger to Android process 勾选 Show all process,选中 SystemServer 进程确定。

  6. 点击从桌面启动一个 app

如此我们便可以 debug 到我们想要 debug frameWork 中服务相关的类了。

debug TextView

  1. 下载源码。
  2. 新建项目,然后实现实现一个简单的逻辑,在点击事件中设置一下 textView 的文案,代码如下:
      val tv = view.findViewById<TextView>(R.id.message)
        view.findViewById<Button>(R.id.btn).setOnClickListener {
           tv.text = "time: ${System.currentTimeMillis()}“
        }
  1. 运行项目到模拟器中。
  2. 和 debug AMS 差不多,我们还是需要下载 TextView 的源码,然后将其导入到其对应的位置。
  3. 在 TextView.java 的 onDraw 方法上面设置断点,然后找到菜单的 Run -> Attach debugger to Android process 勾选 Show all process,选中刚刚运行的 app,点击确定。
  4. 点击触发 textView 的相关逻辑,进入到 debug 模式。

当然,同样的方法也适用于其他的 View,譬如 Button,ImageView 等等。

参考: time.geekbang.org/column/arti…