android (21)

ADB是一个CS结构的程序,由三部分组成。通过它们,可以管理Android设备的状态。


1、Client端

Client端运行在PC上,可以由ADT插件、DDMS、Shell命令等方式调用。

2、Daemon端(ADBD)

作为后台进程运行在Android设备上。ADBD通过jdwp与VM Debugger交互获取VM中的调试信息。

2、Server端

作为后台进程运行在PC上,它负责Client端与Daemon端的通信。Client与Server通过Socket通信。

启动Client端后,Client端首先检查是否有Server端在运行,如果没有,会首先启动一个Server端。

Server端启动后会绑定到TCP端口5037上,开始监听Client端的命令(所有的Client端都使用5037向Server端发送命令)。

然后,Server端会尝试与所有正在运行的移动设备建立连接。这时,Server端会扫描5555~5585范围内的端口,一旦发现有Daemon的存在,就会建立一个到Daemon端所在端口的连接。

注意,每一个移动设备都会占用两个端口,一个用于Console,一个用于ADB。例如:


Emulator 1, console: 5554

Emulator 1, adb: 5555

Emulator 2, console: 5556

Emulator 2, adb: 5557 ...

当server端与所有的Daemon端建立连接后,就可以通过Client端访问这些设备了。每一个Client端都可以控制所有的移动设备。


adb server 和 adb deamon


如果ADB_HOST = 0,ADB Daemon(adbd)会被编译。

如果ADB_HOST = 1,Client和Server会被编译。

具体可以参考system/core/adb/Android.mk

Adbd已经被Android平台用C语言实现。在移动设备上,adbd通过init.rc启动,接下来会运行system/core/adb/adb.c的main函数。

DDMS

DMS主要提供端口重定向、抓屏、线程和堆栈信息查看、LOG打印、进程和信号等信息显示、来电和短信模拟、地理位置模拟等功能。这里对它的功能做一个大致的描述。

DDMS如何工作?

DDMS扮演了一个IDE与移动设备上的应用程序之间的中间人角色,在Android上,每一个应用程序都有一个自己的VM并运行在自己的进程中。

因此,每个进程都有一个不同的端口用来监听debugger。

1、DDMS启动时,会连接到ADB,并开启一个device监视服务,当有设备连接到ADB或者与ADB断开时,DDMS都会得到通知。

2、一旦一个设备连接到ADB,DDMS就会为它创建一个VM监视服务,当移动设备上有VM的启动或终止时,DDMS就会得到通知。

3、一旦一个VM开始运行,DDMS就会通过ADB获取VM的PID,然后,为这个VM打开一个端口,监听来自这个VM的Debugger。为第一个VM打开的监听端口是8600,第二个是8601,依次往后排。。。

5、DDMS还会打开一个默认为8700的本地端口,并通过这个端口监听来自IDE的Debugger。当有IDE Debugger连接上来时,DDMS查找当前选中的VM,再通过ADB转接上去。流程为:

IDE Debugger-->DDMS8700端口-->ADB-->ADBD-->VM

这样,Debuger就可以向VM发送信息了。

而VM的Debugger抓取到的堆栈、线程等VM的运行时信息通过连接到DDMS为这个VM打开的监听端口上,就可以发送到DDMS上了。

既然可以双向交互了,接下来的过程,就和一般的远程调试没什么区别了。

双向之间进行交互

参考文档:

http://hi.baidu.com/chocolly/blog/item/91d68f99210abc006f068c63.html

DDMS组成分析

DDMS包含三个模块:ddmlib,ddmuilib,ddms.

1、ddmlib

这是一个PC端的jar库,主要功能是支持PC和移动设备上的APP之间的通信。

2、ddmuilib

绘制DDMS的UI。

3、ddms

控制UI绘制和网络通信。


Android的LOG系统可以让我们看到系统的调试信息。来自不同APP的LOG被放在一系列circular buffer中,然后显示给我们。

Android的LOG系统维护了多个Circular buffer用来存放LOG信息,并不是所有的LOG都会被发送给默认的Circular buffer。想查看其它Circular buffer中的LOG的话,

需要用-b选项启动logcat,你可以选择查看下面几个Circular buffer中的一个:

radio:包含了radio/telephony相关的LOG的Circular buffer

events:事件相关的。

main:默认Circular buffer。

Dmesg:内核的调试信息

更多相关文章

  1. 多媒体文件信息
  2. android中查看端口占用
  3. [Android--Tool]不在Android设备运行而打开AVD问题解决
  4. android 中使用java aes加密算法,报错信息android javax.crypto.B
  5. adb devices找不到设备
  6. Android从SD卡中加载图片或读取信息
  7. android segment fault logcat相关信息分析
  8. android alarm相关信息
  9. Android存储设备管理

随机推荐

  1. Android(安卓)Gallery setSelection()和onF
  2. Android(安卓)沉浸式标题栏的快速实现方
  3. Android(安卓)编程的几点总结
  4. Android之高德地图自定义样式
  5. Android设计模式系列--原型模式
  6. Android(安卓)studio APP开发 ListView控
  7. Android(安卓)UI基础——EditText控件
  8. 抖音BoostMultiDex优化实践:Android低版本
  9. Android(安卓)AsyncTask !!!!
  10. Android常见40道原理性面试,去面试之前必