很久以来,我一直想找一种方法来断点调试安卓系统自身的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都能断点调试了,看起代码来应该更容易了。

【原创】如何用Android Studio断点安卓自带Service或Bind类型的Service的更多相关文章

  1. Android Studio断点调试

    Android Studio断点调试 Android Studio包含一个debugger程序,可以帮助你在模拟器和真机上调试你的android应用.通过Android Studio的debugger ...

  2. 如何用Android Studio查看build.gradle源码

    上一篇博客里讲过 build.gradle 里的每一行代码基本都是在调用一个方法,既然是这样,我们就可以用 android studio(下面简称as) 去查看它源码的方法注释说明,这样就可以理解每个 ...

  3. Android studio 断点技巧

    写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression , 知道条件断 ...

  4. 如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?

    0x00 前言 大家常常会抱怨安卓平台没有一个统一.好用的性能检查工具.不能像iOS的instrument那样方便. 图片来自:Instruments Help 比如,Unity Blog在3年前就已 ...

  5. 【Android Studio】安卓开发初体验1——安装与试用

    安装 (安装预留硬盘(C盘)空余空间16G以上,8G以上内存) Intel用户: 安装Android Studio和AVD(安卓虚拟机 Android Virtual Device) 安装过程需要注意 ...

  6. 如何用Android Studio打多包名APK

    问题:项目中不同的分发渠道可能需要打包多种APK(同样的代码),包名可能是不一样的,如果一个一个修改包名重新编apk是很麻烦,可以参考下列步骤在Android Studio上操纵Gradle来打包不同 ...

  7. 如何用Android Studio同时使用SVN和Git管理项目

    这篇来讲讲如何在 Android Studio 上同时用 SVN 和 Git 来管理项目.我知道,你肯定会说我吃饱了撑着,没事找事做,为啥要同时用 SVN 和 Git 来管理项目.问题是,我也不想啊, ...

  8. Android studio 创建安卓项目hello

    Android studio是一个非常好用的软件,只不过在使用的最开始,由于各种问题,会失败,并且新手本身就不懂的情况下,更加的懵逼. 这里我来记录一下我遇到过的一点坑. 首先,Android stu ...

  9. android studio学习----android studio断点调试

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

随机推荐

  1. IBatis添加信息返当前添加对象ID

      在Ibatis中,insert()的返回值为一个Object的主键,其实这个Object的主键是这样的来的:如果在bean的xml文件中设置了插入的keyProperty,则insert()方法返 ...

  2. 那些年一起用过的iOS开发利器之Parse

    阅读此文章需要对Objective-C和iOS有一定的了解,完全没有基础的朋友请先阅读<让不懂编程的人爱上iPhone开发>系列教程. 什么是后台服务(back-end service)? ...

  3. 2017技术核心——Spring

    从毕业从事Java WEB开始到现在已差不多快5年时间了,一直使用的Spring相关的技术,其实最主要的是SpringMVC这一块.其实,一直停留在用的地步,并不知晓其原理,真正耐下心来去研究Spri ...

  4. Win7 下安装VirtualBox 没有Ubuntu 64bit 选项问题

    参考: win7安装virtualbox遇到的问题 基于VirtualBox虚拟机安装Ubuntu图文教程 问题 在安装VirtualBox之后,选择虚拟机进行安装的时候发现没有Ubuntu 64bi ...

  5. MyBatis学习总结(六)——调用存储过程(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013518.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存 ...

  6. 汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY

    在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的 ...

  7. maven 依赖

    依赖排除 当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖. 示例(假设配置的是A的pom.xml,依赖关系为:A -- ...

  8. pdb调试技巧

    1.先import pdb 在适当的位置加上pdb.set_trace(),在cmd中运行脚本,就可以看到调试的提示符 2.常用的调试命令 h(elp),会打印当前版本,pdb可用的命令,如果要查询某 ...

  9. 数字和为sum的方法数

    [编程题] 数字和为sum的方法数 给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数. 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案. 输入描 ...

  10. MYSQL实现主从复制

    mysql主(称master)从(称slave)复制的原理:       (1).master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做 ...