问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面:

但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来。cmd里使用 adb jdwp 命令,也没有显示任何接口。

通过简单搜索发现,一个app进程要能被jdwp客户端调试,要不就是编译的时候主配置文件需要开启  android:debuggable="true" ,要不就是系统 boot.img 里的一个文件  default.pro 里的 ro.debuggable 需要值为 1, 后者可以使所有app 进程可以调试, 根据网上的做法用 apktool 工具反编译目标 app,将其主配置文件加上 android:debuggable="true" 再重新打包,然后安装到红米2 ,然而 adb jdwp 依然显示没有接口。

遇到这种情况,就需要研究下 adb 和 jdwp 的原理了,根据android源码  system/core/adb/jdwp_service.c 的注释的说明,基本了解了adb 和 jdwp 是什么回事,大概是这样的,adb 有3种角色(代码是一套,编译选项和运行选项有不同):adbd,adb client, adb server,  adb client 最简单的就是调试时在 cmd 里敲入的 adb 命令,这时候跑的就是 adb client 的代码,另外,ddms 或者 eclipse 或者 android studio 里的 debug 界面,其实也是一种 adb client , 它们都是接受用户的命令,然后发送给 adb server.  adb server 是调试端(如PC端)的一个服务进程,它接受 adb client 的命令,然后发送给设备或模拟器里的 adbd 进程。 另外,设备里根据配置可能会启动一个  adbd daemon 进程,这个进程负责响应adb server的命令,向android系统请求各种数据后返回给adb server,adbd 与adb server的交互可以用 tcp 的方式或者 usb 的方式。 jdwp 是一种java调试协议,在android的实现里边,如果开启了调试(前面说的两种情况至少满足一种),则进程内部虚拟机会启动一个 JDWP 线程,然后这个线程会跟 adbd 进程有一个unix socket的交互,交互的结果就是adbd内部维护了一个可以调试的目标app 进程列表,这样当 adb client 敲入 adb jdwp 后, adb server 将命令传给 adbd , adbd 就可以返回一个进程列表给 adb client 显示了。

adb client (debugger) , adb server, adbd, jdwp 4 者关系如下:

jdwp 线程和adbd 的 unix socket 连接可以通过命令查看:

了解了上述原理之后,首先可以确定一下,设备内部的jdwp调试路径是否正常,方法就是先安装原生的app(没有开启调试), 然后 busybox netstat -xa | grep jdwp 查看,发现果然没有连接,接着,用 apktool 反编译,修改后再打包安装,再用同样的命令查看,发现出来几个连接了,这时候可以基本判断,app 的修改是有效的,而且内部启动了jdwp线程且已经注册到了 adbd 进程内。

接下去的问题就是,为什么PC端的 Adb client 在跟 Adbd 请求的时候没有能返回列表,而如果请求的是模拟器,又是正常的。

红米2真机和模拟器的区别,主要就是 Adb server 和 adbd 的连接方式不一样,前者是USB的方式,后者是tcp的方式,而且有一个现象是,连接红米2后,adb devices 会提示出现两个设备,明明只有一个设备嘛! 既然有两个设备,就看一下设备管理器是什么情况,果然有发现:

android phone 设备下有两个驱动,搜索一下 xiaomi mdb ,果然有情况 :

小米mdb方案分析

android如何杀掉守护进程——干掉小米手机助手

小米助手不用打开usb调试能连接手机的小研究

原来小米/红米有一套 mdb 方案,可以实现小米助手在手机不开usb调试的情况下仍能连接手机(之前安装过小米助手,不确定mdb驱动是不是那时候安装的),不管三七二十一,在设备里找到 mdbd 进程,杀死它,发现能自动重启,又回到PC里边,把 MDB 驱动卸载了,重启系统之后,再次 Adb devices 发现只有一个设备了,再 adb jdwp ,发现居然能显示列表了:

打开ddms也能正常连接了,看来果然是小米的 mdb 驱动造成的。

解决小米/红米手机无法进行jdwp调试的问题的更多相关文章

  1. (最完美)红米手机5的Usb调试模式在哪里打开的教程

    就在我们使用安卓手机接通PC的时候,或者使用的有些app比如我们企业营销部门就在使用的app引号精灵,之前老版本就需要开启usb开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启usb开发者 ...

  2. (最简单)红米手机5A的USB调试模式在哪里开启的方法

    当我们使用安卓手机链接Pc的时候,或者使用的有些APP比如我们公司营销小组当使用的APP引号精灵,之前使用的老版本就需要开启usb调试模式下使用,现当新版本不需要了,如果手机没有开启usb调试模式,P ...

  3. (最完美)红米手机4的USB调试模式在哪里开启的经验

    每次我们使用安卓手机通过数据线连接上Pc的时候,或者使用的有些应用比如我们团队营销部门每次使用的应用引号精灵,之前的老版本就需要开启Usb开发者调试模式下使用,现每次新版本不需要了,如果手机没有开启U ...

  4. 红米手机连接logcat,调试信息刷屏解决办法

    我买了红米,平时拿它来当作安卓测试机的 可是把它接入eclipse里面,发现它会往logcat打印大量的日志,我自己想调试一个程序的时候,自己的程序的日志一会儿就被冲刷没了 新建一个logcat me ...

  5. 红米手机拍照效果测评(对比小米2A)

    小米相关的产品一向都很很受用户的欢迎,一个就是实惠,另一个就是配置还不错.近期小米推出的红米手机可谓是先声夺人,关注度异常火爆.今天刚抢的红米快递寄到了,来测试下红米手机的拍照表现,800万像素怎么样 ...

  6. android 解决小米手机上选择照片路径为null情况

    昨天测试帅哥说他手机选择图库崩溃了,这是一个上传头像的功能,相信很多应用都有这个功能,于是我就把手机拿过来打log看了下返回的路径 为null,在网上搜索了下解决方案,现在把解决方案记录下: 这是在o ...

  7. 解决小米手机不能运行Android Studio程序的问题

    转载自:解决小米手机不能运行Android Studio程序的问题 问题描述 Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: ...

  8. [RN] 解决小米手机安装应用报:INSTALL_FAILED_USER_RESTRICTED问题

    解决小米手机安装应用报:INSTALL_FAILED_USER_RESTRICTED问题 https://blog.csdn.net/u013023845/article/details/821082 ...

  9. 从红米手机经常发生UIM没有服务的一些猜想

    缘起:买了测试用的红米手机,安装电信卡,经常生UIM没有服务,大约两天1次. 我的解决办法:飞行模式切换一下就恢复正常. 之前这张卡用三星的信号是满格,红米断开挺经常的 上网搜索: 同样的现象,还好官 ...

随机推荐

  1. 数据库学习(三) sql语句中添加函数 to_char,round,连接符||

    ** to char 是把日期或数字转换为字符串  to date 是把字符串转换为数据库中得日期类型  参考资料:https://www.cnblogs.com/hllnj2008/p/533296 ...

  2. 【Python】python中的__dict__,__getattr__,__setattr__

    Python class 通过内置成员__dict__ 存储成员信息(字典) 首先用一个简单的例子看一下__dict__ 的用法 class A(): def __init__(self,ax,bx) ...

  3. C#的internal访问修饰符

    文章:C# 访问修饰符internal的访问范围误区释疑 internal访问修饰符限定的类,只能在本程序集中访问.

  4. tar 加密压缩和解密解压

    加密压缩 tar -czvf - file | openssl des3 -salt -k password -out /path/to/file.tar.gz 解密解压 openssl des3 - ...

  5. 关于C标准

    关于C标准 1. 前言 本文从英文 C-FAQ (2004 年 7 月 3 日修订版) 翻译而来.本文的 中文版权为朱群英和孙云所有. 本文的内容可以自由用于个人目的,但 是不可以未经许可出版发行. ...

  6. Spark中如何生成Avro文件

    研究spark的目的之一就是要取代MR,目前我司MR的一个典型应用场景即为生成Avro文件,然后加载到HIVE表里,所以如何在Spark中生成Avro文件,就是必然之路了. 我本人由于对java不熟, ...

  7. Hibernate常用方法之_插入

    1.使用session的save方法进行插入 public void saveUser(User user){ Session session = null; Transaction transact ...

  8. ES mapping field修改过程

    Elasticsearch 的坑爹事--记录一次mapping field修改过程 http://www.cnblogs.com/Creator/p/3722408.html Elasticsearc ...

  9. 【bzoj2659】[Beijing wc2012]算不出的算式 数论

    题目描述 求,其中p和q是奇质数. 输入 只有一行,两个奇质数,分别表示p,q. 输出 一个数,表示算式结果. 样例输入 5 样例输出 6 题解 数论 神TM数学结论题... 当$p\neq q$时, ...

  10. 附录A培训实习生-面向对象基础构造方法和带参数的构造方法(2)

    构造方法,又叫构造函数,其实就是对类进行实例化.构造方法与类同名,无返回值,也不需要void,在new时候调用.也就是说,就是调用构造方法的时候. 所有类都有构造方法,如果你不编码则系统默认生成空的的 ...