快速调试安卓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行中可能有一行是自己需要断点的行。