快速调试安卓Framework源码一(导入单个,java文件即可进行断点)
快速调试安卓Framework源码 一(导入单个 .java 文件即可进行断点),使用场景:使用AndroidStudio断点调试Framework、SystemUI、设置等代码。 快速调试安卓Framework源码 二(导入单个 .java 文件即可进行编译),使用场景:做Feature时,修改一二十个文件,频繁修改代码进行编译验证时。 快速调试安卓Framework源码 三(通过修改 smali 实现),使用场景:只修改一两行代码,验证一个结论时。
-------------------------------------------------------------------------------------------------------------
- 0 AndroidStudio 调试 Framework 的 3 种方式
- 1 准备好文件
- 2 导入这个目录下的 Java 文件
- 3 配置 SDK
- 4 配置为一个 Android App
- 5 设置断点
- 6 开始断点
- 7 执行相关流程
- 8 动态修改变量的值
- 9 原理
- 10 参考资料
- 11 其他注意事项
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×tamp=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行中可能有一行是自己需要断点的行。