快速调试安卓Framework源码一(导入单个,java文件即可进行断点)

快速调试安卓Framework源码 一(导入单个 .java 文件即可进行断点),使用场景:使用AndroidStudio断点调试Framework、SystemUI、设置等代码。 快速调试安卓Framework源码 二(导入单个 .java 文件即可进行编译),使用场景:做Feature时,修改一二十个文件,频繁修改代码进行编译验证时。 快速调试安卓Framework源码 三(通过修改 smali 实现),使用场景:只修改一两行代码,验证一个结论时。

-------------------------------------------------------------------------------------------------------------

0 AndroidStudio 调试 Framework 的 3 种方式

0.1 先编译 make idegen ,再导入源码。

0.2 导入部分源码,比如 frameworks/base。

0.3 导入单个 .java 文件(也可以叫新建项目的方式),此文介绍这一种方式。方法3的速度超快,比断点一个 App 的速度都要快。

App 也适用,如SystemUI、Launcher等等。

但是注意要找对,你在SystemUI的代码上断点,选择 Launcher的进程这样就是有问题的。

SystemUI上的代码,断点时 attach 选择进程SystemUI。

Launcher上的代码,断点时 attach 选择进程Launcher。

1. 准备好文件

根据包名来准备相关目录和文件。

2. 导入这个目录下的 Java 文件

从红色圈起来的地方开始导致文件

一路 next 到最后

配置 SDK

File Project Structure Project Project SDK 。 手机的版本一定要和选择的一样。Android Q 对应 29,Android R 对应30.

配置为一个 Android App

Activity 设置为 Nothing。

4.1 点击 “Add Configuration”

4.2 点击 “+” 加号,选择 Android App。

4.3 选择 Nothing。

4.4 选择 Nothing。

配置为一个 Android App,Activity 设置为 Nothing。(

5 设置断点

6 开始断点

点击 红圈所圈起来的绿色 bug 图标。

7 执行相关流程

8 动态修改变量的值

右击变量,选择 Set Value ,进行动态赋值。

把 userChangedBrightness 的值由 false 动态修改为 true。 节省很多打日志和调试的编译时间。

9 原理

每个Android进程都有一个叫做jdwp的线程。

debugger向被调试进程传入一个行号就可以断点了。

10 参考资料

https://mp.weixin.qq.com/s?src=11&timestamp=1605951987&ver=2720&signature=LbiB0C62E6xV1YqBrrcUuMn9gBVL*DtzZVDJgsCXgLqGTNYoyCzjuuDO0lAKgL1BTs3cvtiszAwxXP3i9cnfaVlAyfh9JBc9cfJ1CYyZZknMsNGJ48ZAET8VNo6mfIDt&new=1 http://gityuan.com/2016/08/13/android-os-env/ https://blog.csdn.net/songjinshi/article/details/53020549 https://juejin.cn/post/6844903844816617480 https://www.jianshu.com/p/afab104a8280 http://liuwangshu.cn/framework/aosp/5-debug-aosp.html https://blog.csdn.net/songjinshi/article/details/53020549

11 其他注意事项

11.1 当我们断点不生效的时候

可能是代码和手机版本不匹配,在代码的某一行处设置断点,可能在手机中匹配的代码是空行。

解决方法1:

找到手机的版本和代码进行匹配。比如拉去最新(或者基于同一天的 manifest)的代码和 ROM。

解决方法2:

如果差异不大的情况下把需要断点的地方上下5行全部断点。这样5行中可能有一行是自己需要断点的行。