问题描述:在逆向一个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. Lua工具类

    1.打印table --一个用以打印table的函数 function print_r (t, name) print(pr(t,name)) end function pr (t, name, in ...

  2. browsersync的安装与基本使用

    browser-sync启动命令 Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 官网文档:http://www.brows ...

  3. 给虚拟机发送键盘按键key

    使用举例:virsh send-key 11 KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE作用:发送"ctrl+alt+del"给虚拟机,linux虚拟机 ...

  4. ubuntu中tensorflow安装

    首先加入了CUDA_HOM环境变量,然后下载了一个分析工具库,结果E: 无法定位软件包 libcupti-dev,在etc/apt 的sources.list 添加镜像源 deb http://arc ...

  5. Python 3.6 爬取BD电影网

    2018-07-10 #coding:utf-8 #coding:utf-8 from lxml import etree import requests import pandas import t ...

  6. BZOJ 4012 HNOI2015 开店 树的边分治+分治树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4012 题意概述:给出一颗N点的树,保证树上所有点的度不超过3,树上每个点有权值,每条边有权 ...

  7. Java集合(2)——深入理解ArrayList、Vector和LinkedList

    回顾 Java集合主要分为两个体系结构,Collection和Map.这篇博客主要介绍Collection子接口List下的三个经常使用的实现类:ArrayList.Vector和LinkedList ...

  8. 子组件通过$emit触发父组件的事件时,参数的传递

    子组件.vue <template> <div> <el-table :data="comSchemaData" highlight-current- ...

  9. 【python】time 和datetime类型转换,字符串型变量转成日期型变量

    s1='20120125';   6     s2='20120216';   7     a=time.strptime(s1,'%Y%m%d');   8     b=time.strptime( ...

  10. 大并发量订单处理的 KafKa部署

    大并发量订单处理的 KafKa部署总结 今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司 ...