美文网首页Android开发Android开发经验谈Android技术知识
Android基础:如何在Activity的onCreate方法

Android基础:如何在Activity的onCreate方法

作者: 我在等你回复可你没回 | 来源:发表于2018-05-01 15:39 被阅读144次
    盛夏

    不知道大家要不要经常在oncreate打断点,其实感觉可能没什么卵用。不过如果要调试一些在oncreate做的逻辑,可能还是需要的把。

    1.有源码情况下

    有源码情况就好搞啦,在oncreate中加一句代码就可以了。

    import android.os.Debug;
    
    Debug.waitForDebugger();
    

    然后,点击应用启动,就会出现下面这个提示,他在等待调试器连接。


    wait for debug

    这时我们在Androidstudio中在oncreate设置一个断点,然后用DDMS连接上他,就会运行到断点处啦。


    打断点

    1.无源码情况下

    方法一:动态调试smail
    如果我们只有一个apk,那我们就反编译这个apk得到smail代码,然后在smail的oncreate代码处加入Debug.waitForDebugger()对应的smail代码即可。然后Android stduo可以动态调试smail代码。具体以后再详细说说。

    方法二:jdb调试
    1.设置com.example.anrdemo应用等待debug

    adb shell am set-debug-app -w com.example.anrdemo
    

    2.点击应用启动,会出现等待调试界面


    wait for debug

    3.adb转发端口,7600时端口号(确认该端口没被占用),31086是com.example.anrdemo的进程号。

    adb forward tcp:7600 jdwp:31086
    

    4.设置jdb脚本,让连接上手机后,先执行jdb脚本挂起所有的线程

    echo suspend > jdb.ini
    

    5.jdb连接手机(windows 和 linux命令不一样,下面的linux的)

    jdb -attach localhost:7600
    

    如下图,所有线程都挂起了。


    挂起了

    那挂在那里了呢?
    其实是挂在ActivityThread的handleBindApplication方法的Debug.waitForDebugger()方法中,handleBindApplication是AMS binder连接应用的方法,在oncreate之前。


    handleBindApplication

    6.在oncreate打断点。

    stop in com.example.anrdem.MainActivity.onCreate
    

    可以看到断点成功如下


    断点成功

    点击next就可以单步运行了,更多命令可查看jdb的命令,可以查看变量,设置变量,查看线程堆栈等功能,其实ecplise的断点功能就是对jdb加了个壳而已。


    next

    相关文章

      网友评论

        本文标题:Android基础:如何在Activity的onCreate方法

        本文链接:https://www.haomeiwen.com/subject/kknxrftx.html