本文主要记录一下如何在不编译源码的情况下,如何编译 android framework 框架层源码的技巧和经验。
Framework 构成
android 系统的构成,从上到下依次是:
- app 应用层
- frameWork 框架层
- library 系统库层
- linux 内核层
在日常开发过程中,和我们接触最多的就是应用层和 frameWork 框架层了,下面就介绍一下怎么简单的来调试 fragmeWork 相关的代码。
下面以两个具体的例子来进行说明:
debug ActivityManagerService
我们以 debug android 9.0 的代码为例。
- 打开 android 模拟器,使用 Android 9.0 的镜像文件。
用其他模拟器(譬如 Genymotion)也行,但是使用的 android 系统版本必须和需要调试的代码是一致的。 注意这里选择模拟器时要选择不带 play store 的,带了 play store 的使用的系统基于 release 的,无法 debug 系统相关的服务。
-
打开 AndroidStudio ,新建项目,Next 直至完成。
-
找到你要下载的代码,譬如 android 9.0 的 ActivityManagerService 可以从这里下载
-
在项目中创建对应的 package,这里我们需要创建的包名是:
com.android.server.am
-
将下载好的文件移动到我们刚创建好的包名下。 完成后大概会长这样
-
在 ActivityManagerService.java 的 startActivity 方法上面设置断点,然后找到菜单的 Run -> Attach debugger to Android process 勾选 Show all process,选中 SystemServer 进程确定。
-
点击从桌面启动一个 app
如此我们便可以 debug 到我们想要 debug frameWork 中服务相关的类了。
debug TextView
- 下载源码。
- 新建项目,然后实现实现一个简单的逻辑,在点击事件中设置一下 textView 的文案,代码如下:
val tv = view.findViewById<TextView>(R.id.message)
view.findViewById<Button>(R.id.btn).setOnClickListener {
tv.text = "time: ${System.currentTimeMillis()}“
}
- 运行项目到模拟器中。
- 和 debug AMS 差不多,我们还是需要下载 TextView 的源码,然后将其导入到其对应的位置。
- 在 TextView.java 的 onDraw 方法上面设置断点,然后找到菜单的 Run -> Attach debugger to Android process 勾选 Show all process,选中刚刚运行的 app,点击确定。
- 点击触发 textView 的相关逻辑,进入到 debug 模式。
当然,同样的方法也适用于其他的 View,譬如 Button,ImageView 等等。