zoukankan      html  css  js  c++  java
  • 【原创】如何用Android Studio断点安卓自带Service或Bind类型的Service

    很久以来,我一直想找一种方法来断点调试安卓系统自身的Service,或者bind类型的Service,比如我想看WifiManager里面的getWifiApConfiguration函数是如何实现的。从代码看到:
    public WifiConfiguration getWifiApConfiguration() {
    try {
    return mService.getWifiApConfiguration();
    } catch (RemoteException e) {
    return null;
    }
    }
    它直接调用的是一个mService的变量。而这个东西是一个实现了IWifiManager的接口的类。在我自己的应用里无法用断点命中它,虽然我能找到它的真实实现是在/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java 中。
     
    今天,感谢这篇文章:
     
    终于找到了断点调试系统Service的方法:
     
    1. 首先获得一份Service的源代码。比如/frameworks/base/services/accessibility.
    2. 在Android Studio中,导入工程->Create project from existing sources,然后是选择要添加到项目根目录的目录,选择libraries,选择Modules,选择SDK,一路NEXT即可. 现在,代码被添加进来了,尽管缺少需要的类库,显示全是错误,但是没关系,不影响调试。
    3. 在Run菜单中,选择Edit configurations,添加一个Remote类型的调试。端口号默认的是5005,你可以修改成你需要的任意值。比如可以设置成9999
     


    4. 用 adb shell ps | grep system_server 找出Accessibility Service所在的进程,这里是 548
    system    548   195   1716200 121628 ffffffff b6e855d8 S system_server
    5. 同时,用adb jdwp确保548是可以调试的。这一步只是用来看一下,不是必需。
    6. adb forward tcp:9999 jdwp:548 这是最关键的一步了,把本机的9999端口转向远端机的jdwp 548端口。这里,9999是你刚才设置的调试配置中的端口。Android Studio会在调试开始时在本地的这个端口上监听。也就相当于在 jdwp 548端口监听了。
    7. 在android Studio中运行这个debug。当service相关函数被调用到的时候,会发现断点命中。
     
    如果你要调试的应用还没有运行起来,比如,是你自己的应用。你可以在开发者选项里面选择它为 调试应用,或者通过 adb shell am set-debug-app -w <包名> 来设置它在运行起来之后等待调试器。然后它会等待调试器挂载,你在进行上述动作。
     
    好了,现在基本所有的系统级别的Java都能断点调试了,看起代码来应该更容易了。
  • 相关阅读:
    ASP.Net在web.config中设置上传文件的大小方法
    asp.net利用QQ邮箱发送邮件,关键在于开启pop并设置授权码为发送密码
    ASP.NET中的几种弹出框提示基本实现方法
    asp.net 不用控件,自动登录(用于和其他系统对接的时候,自动登录系统,用户体验好)
    asp.net要验证的用户名和密码
    c#二维码建立与识别
    c#,读取二维码
    c#,条码
    JavaScript Dom 绑定事件
    JavaScript Dom0 Dom1
  • 原文地址:https://www.cnblogs.com/zzpbuaa/p/5557313.html
Copyright © 2011-2022 走看看