问题描述:在逆向一个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. Linux系统安装jdk后出现无法执行binary 文件的错误解决

    这是由于jdk版本的问题,针对Linux系统,Oracle提供了 ARM 的32jdk和64位jdk , 但是也提供了类似这样jdk-8u191-linux-i586.tar.gz32或64位的jdk ...

  2. Python全栈 正则表达式(概念、、语法、元字符、re模块)

    前言:        普通人有三件东西看不懂:医生的处方,道士的鬼符,程序员得正则表达式       什么是正则表达式? 正则表达式,又称规则表达式,英文名为Regular Expression,在代 ...

  3. AcCoder Contest-115 D - Christmas

    D - Christmas Time limit : 2sec / Memory limit : 1024MB Score : 400 points Problem Statement In some ...

  4. 九度OJ--Q1473

    import java.util.ArrayList;import java.util.Scanner; /* * 题目描述: * 大家都知道,数据在计算机里中存储是以二进制的形式存储的. * 有一天 ...

  5. 编译 TensorFlow 的 C/C++ 接口

    TensorFlow 的 Python 接口由于其方便性和实用性而大受欢迎,但实际应用中我们可能还需要其它编程语言的接口,本文将介绍如何编译 TensorFlow 的 C/C++ 接口. 安装环境: ...

  6. vue实战(一):利用vue与ajax实现增删改查

    vue实战(一):利用vue与ajax实现增删改查: <%@ page pageEncoding="UTF-8" language="java" %> ...

  7. C#数据库连接问题

    最近在看C#,今天下午刚开始接触C#的数据库连接,SQL Server2008,问题如图:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名 ...

  8. C# 测试代码的运行时间

    使用以下方法可以准确的记录代码运行的耗时. System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); / ...

  9. PokeCats开发者日志(二)

      现在是PokeCats游戏开发的第四天的上午,来记录一下昨天做的事情吧. day3   day3主要是添加音效和优化界面,本以为添加个音效1~2个小时就够了吧,没想到贼不顺,弄了一个下午才搞好. ...

  10. [luogu2617]Dynamic Rankings

    题面在这里 description 动态区间第\(k\)大 data range \[n,m\le 10000,a_i,t\le 1e^9\] solution 前置技能:主席树,静态区间第\(k\) ...