博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADB原理,Wi-Fi连接,常用命令及拓展
阅读量:6868 次
发布时间:2019-06-26

本文共 5030 字,大约阅读时间需要 16 分钟。

文章多处链接需要科学上网

本文按顺序主要讲解了ADB的原理,使用Wi-Fi连接设备,ADB常用命令,在Java代码中执行shell命令,使用ddmlib进行扩展。

ADB的原理

参考

ADB(Android Debug Bridge)是一个通用的命令行工具,能让你和模拟器或连接的Android手机通信。

ADB的结构是一个client-server的结构,包含3个部分:

  • A Client : 发送命令。客户端在你开发的PC上运行,当你在shell里使用Adb命令的时候就会开启一个client。(其实你的shell就是一个client)

  • A daemon : 在设备上执行命令。守护进程在设备上后台运行。(也就是一个叫做aabd的东西,运行在Andriod设备的底层)

  • A server : 管理客户端(client)和守护进程(daemon)的连接。server在开发app的PC上后台运行。

你可以在 /platform-tools 找到adb工具

ADB是如何工作的?

当你开启一个adb client,client会首先检查adb server是否运行,如果没有的话先启动一个adb server,当server启动后,server默认绑定到本地(PC)的TCP端口5037(这个端口号可以设置,后文有述)并开始监听从client发送的命令。(所有的adb client都会用5037端口和server通信)

然后server会建立和所有正在运行的设备或模拟器的通信连接。server通过扫描5555至5585之间的奇数号端口查找设备(这就是说设备所使用的端口号一定是5555-5585之间的奇数),如果server找到了一个守护进程daemon(运行在设备上的),那么server就会在这个端口建立一个连接(server是client和daemon的中间的桥梁)

注意:每一个设备需要一对连续的端口号,奇数端口号用来建立adb连接,偶数端口号用于控制台连接(原文是console connections,据我理解应该是指 )

像这样:

Emulator 1, console: 5554Emulator 1, adb: 5555Emulator 2, console: 5556Emulator 2, adb: 5557and so on...复制代码

上一个结构图:

*上面的图片来自于一篇很早比较详细的文章 *

有可能有人会问:5555-5585的奇数端口号是指定设备的,那么设备有没有上限呢?

答案是没有,原因如下:

  • 1.adb可以使用WiFi连接,也就是通过无线网络连接。下文会讲无线连接如何使用
  • 2.adb可以为adb server指定端口号,指定端口号后可以开启多个server(不过Android Studio在调试程序时只识别5037端口的server)。

像这样:

可以通过大写的-P指定端口号,指定端口号后会开启一个新的server,这样的缺点就是,如果以后想查看5038端口server的一系列操作,比如查看连接的设备也必须加 -P 5038,否则查看的只是5037的server连接的设备。 如果之前已经开启了5037的server,那么现在你的PC上现在已经有了两个server,这里注意,你的设备只能和其中一个server通信。

正式因为上面结构图的结构,才能使得adb能够通过wifi进行连接。

使用wi-fi连接的使用方法:

1.将你的Android设备和你的开发机器连接到同一个Wi-Fi网络环境下,记住是同一个。不是所有的无线节点都可以匹配,你也许需要使用支持adb的防火墙配置。(我将防火墙关闭了)

2.将你的设备和电脑通过USB连接

3.将你的手机设置成在端口5555监听TCP/ip连接(在PC上执行,端口号自己指定)

$ adb tcpip 5555

4.断开USB数据线

5.查看你的手机的IP地址(在手机连接的WiFi网络的心里了能看到,每个手机的配置不一样~)

6.通过指定IP地址进行连接 $ adb connect <device-ip-address>

7.看看效果吧,确定你的电脑是否已经连接上你的手机了

$ adb devicesList of devices attached
:5555 device复制代码

如果没有连接上

  • 确定连在同一个wifi环境下
  • 重试adb connect或重启adb server adb kill-server & adb start-server

熟悉Android Studio的人应该知道有一个叫做 的调试插件,里面用到的也是这些命令原理,刚开始我还觉得能自己开发一款Android Studio的插件很神奇,其实你打开那个链接琢磨琢磨,你也可以。里面用到了ddmlib这个jar包,文章的最后简要介绍一下(感兴趣的话可以好好研究。。)

ADB常用命令

语法:adb [-d|-e|-s <serialNumber>] <command>

如果你只连接一个物理设备,可以通过-d快速指定物理设备,如果你连接了只连接了一个模拟器,可以通过-e快速指定模拟器。

  • devices : 连接的设备列表,你可以看到serialNumber
  • help : 命令帮助
  • version : adb版本
  • :在屏幕上打印log,如果这个命令不会可以输入adb logcat --help查看怎么使用
  • bugreport : 打印dumpsys, dumpstate, logcat的信息,为了报告bug,类似adb bugreport > xxx.log
  • start-server : 开启一个adb server
  • kill-server : 关闭adb server
  • install  :安装apk(specified as a full path to an .apk file))
  • pull   : 从你设备的remote拷贝文件到你PC上的local
  • push   : 从你PC上的local拷贝文件到你设备的remote
  • forward   : 将你本地的特定端口的信息转发给你设备的remote端口上。 like this:

adb forward tcp:6100 tcp:7100    PC上所有6100端口通信数据将被重定向到手机端7100端口server上 adb forward tcp:6100 local:logd   PC上所有6100端口通信数据将被重定向到手机端UNIX类型socket上

  • get-serialno : 得到设备的序列号,其实就是devices的结果的前半部分
  • get-state : 得到设备的状态[offline, device, no device]
  • wait-for-device : 直到设备online之后才会继续执行,否则阻塞执行。like this:

adb wait-for-device install <app>.apk 安装apk需要设备启动之后才能执行,和其他adb命令配合使用

jdwp 和 ppp两个命令没搞清楚如何使用,欢迎知道的告诉我,互相学习,感谢 :)


adb shell

运行在android的设备上,命令的二进制文件在手机的/system/bin/...

语法:adb [-d|-e|-s <serialNumber>] shell <shell_command>

am

在shell命令下,你可以通过activity manager 工具(am)执行系统操作,包括开始一个activity, 强制关闭进程,广播intent,设置设备屏幕参数等。 语法是am <command>,eg : adb shell am start -a android.intent.action.VIEW

内容比较多,建议翻墙详细看,原文挺简单的,我就不翻译了 :)

和am搭配使用的有:

Comand Description
start [options] Start an  specified by 
startservice [options] Start the  specified by .
force-stop Force stop everything associated with  (the app's package name).
kill [options] Kill all processes associated with  (the app's package name). This command kills only processes that are safe to kill and that will not impact the user experience.

pm

在shell命令下,你可以通过package manager(pm)执行和包相关的操作。语法是pm <command>,eg : adb shell pm uninstall com.example.MyApp,和am类似,这里就不一一展开了,需要请看。

截图

像这样eg: $ adb shell screencap /sdcard/screen.png 你还可以这样,截屏后从手机copy一份。

$ adb shellshell@ $ screencap /sdcard/screen.pngshell@ $ exit$ adb pull /sdcard/screen.png复制代码

录屏

仅支持 Android 4.4 (API level 19)及以上

Note: Audio is not recorded with the video file. 仅仅是画面而已

还有很多参数可以设置,这里不展开 eg: $ adb shell screenrecord /sdcard/demo.mp4

其他

dumpsys [options]         meminfo 显示内存信息         cpuinfo 显示CPU信息         account 显示accounts信息         activity 显示所有的activities的信息         window 显示键盘,窗口和它们的关系         wifi 显示wifi信息         and so on复制代码

eg:adb shell dumpsys meminfo [packageName]

By the way....你可以在java代码中执行这些命令,并将结果写到文件中,然后将文件发送到你的服务器上进行分析~~

参考:

ADB扩展

这里只简单的说一些。 插件的源码下载下来后你可以看到里面有一个ddmlib的类库,它的位置在你的android-sdk下面的/sdk/tools/lib 目录下,这个目录下还有ddmuilib.jar,ddms.jar等。

那么这些工具有什么用呢?

通过这些工具你可以在你的代码中

1.创建ADB

AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();复制代码

2.获得ADB连接的设备

IDevice devices[] = bridge.getDevices();复制代码

3.操作设备

device.installPackage(path, true, args);  //device instance of IDevicedevice.uninstallPackage(pakagename);  复制代码

4.执行adb命令

device.executeShellCommand(cmd, receiver);// receiver extends MultiLineReceiver// cmd like "dumpsys meminfo [packageName]" adb shell command复制代码

是不是很酷?如果能够再深入下去应该能发掘更多有意思的东西,感兴趣的自己研究研究吧,东西挺多的 :)

可以参考 或直接阅读  的源代码

转载地址:http://wrdfl.baihongyu.com/

你可能感兴趣的文章
非常详细的/etc/passwd解释
查看>>
解决Xcode在debug时不在断点处停止的方法<转>
查看>>
令人眼前一亮的动态规划入门教程
查看>>
[Memcached] telnet命令
查看>>
CodeChef Little Elephant and Movies [DP 排列]
查看>>
【Java集合的详细研究3】Arrays类常用方法
查看>>
Linux下随机生成密码的命令总结
查看>>
Linux 网络子系统之网络协议接口层(一)
查看>>
Nginx配置小结
查看>>
学习一点Markdown的基本知识
查看>>
程序史记:从巴贝奇、爱达到图灵
查看>>
Solidworks工程图如何使用,替换图纸格式模板文件
查看>>
系统重装 如何转换GPT的磁盘格式为MBR或者反过来
查看>>
Window Location对象
查看>>
【Java面试题】44 java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?...
查看>>
Win10系列:JavaScript动画4
查看>>
A Deep Compositional Framework for Human-like Language Acquisition in Virtual Environment
查看>>
C#.NET的TabControl如何隐藏和显示页面
查看>>
发布/订阅
查看>>
Maven项目打包,Jar包不更新的问题
查看>>