Android ActivityThread的代码调试

我们打算在模拟器上调试代码,因为大部分真机的源码都是修改过的,调试时会经常出现源码不匹配字节码的提示。应用的SDK版本要和模拟器选择的Android版本一致,如果你要调试System Process等系统服务进程,在选择虚拟设备的时候不要选择带Play Store标志的,如下图,这样的虚拟设备没有root权限,系统进程不可调试。

image.png

如果要调试一个正在运行的App,点击下图所示的按钮就会出现一个对话框,选择我们需要调试的进程即可,这些进程大部分是以包名区分的

image.png

但如果你想像上面那样调试ActivityThread就比较麻烦,等你把app的进程attach上后它的初始化代码基本都执行完了,网上有说在AMS中断点的,等AMS执行完会自动回到ActivityThread,我试了没成功。后来看到ActivityThread的handleBindApplication有如下一段代码,大致的意思就是显示等待Debugger的对话框,当Debugger附上了进程就会关闭对话框

       if (data.debugMode != ApplicationThreadConstants.DEBUG_OFF) {
               //让AMS显示等待Debugger的对话框
               mgr.showWaitingForDebugger(mAppThread, true);
               //等待Debugger
                Debug.waitForDebugger();  
               //让AMS关闭等待Debugger的对话框
                mgr.showWaitingForDebugger(mAppThread, false);
        }

再看waitForDebugger代码,重点看注释。大意就是在waitForDebugger方法后面你才能开始断点跟踪

Wait until a debugger attaches. As soon as the debugger attaches,
this returns, so you will need to place a breakpoint after the
waitForDebugger() call if you want to start tracing immediately.

Debug.java
    public static void waitForDebugger() {
        ...
    }

于是我在上述方法之后加了一个断点


image.png

然后选择debug app按钮启动应用,注意和上面的按钮不一样


image.png

断点成功,虽然前面代码已经执行一部分Binder通讯,但到此ActivityThread大部分还没初始化,如果想看Activity启动之前干了哪些事还是很有用的
image.png

你可能感兴趣的:(Android ActivityThread的代码调试)