ADB原理,Wi-Fi连接,常用命令及拓展

Android 开发笔记 onGithub

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

本文按顺序主要讲解了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,据我理解应该是指 控制模拟器用的console连接)

像这样:

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

上一个结构图:

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

有可能有人会问: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 devices
List of devices attached
<device-ip-address>:5555 device
复制代码

如果没有连接上

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

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

ADB常用命令

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

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

  • devices : 连接的设备列表,你可以看到serialNumber
  • help : 命令帮助
  • version : adb版本
  • logcat [option] [filter-specs] :在屏幕上打印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

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搭配使用的有:

ComandDescription
start [options] Start an Activity specified by 
startservice [options] Start the Service 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 shell
shell@ $ screencap /sdcard/screen.png
shell@ $ 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

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代码中执行这些命令,并将结果写到文件中,然后将文件发送到你的服务器上进行分析~~

参考: Running Shell commands though java code on Android? writing dumpstate to file android

ADB扩展

这里只简单的说一些。 ADBWIFI 插件的源码下载下来后你可以看到里面有一个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 IDevice
device.uninstallPackage(pakagename);  
复制代码

4.执行adb命令

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

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

可以参考 使用ddmlib实现android 性能监控 或直接阅读 ADBWIFI 的源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Flow快速开发Teams小应用

继续我的上一篇博客&#xff0c;这篇继续介绍BUILD大会里的内容&#xff1a;Flow。 Flow是微软power平台的一个服务&#xff0c;通过简单的拖拽就可以完成一个业务逻辑的处理&#xff0c;现在Flow和Teams的结合十分紧密。我们来试一下。 先点击Teams左边的Flow菜单。 如果你的…

python正则中如何匹配汉字以及encode(‘utf-8’)和decode(‘utf-8’)的互转

正则表达式&#xff1a;  [\u2E80-\u9FFF]$ 匹配所有东亚区的语言   [\u4E00-\u9FFF]$ 匹配简体和繁体   [\u4E00-\u9FA5]$ 匹配简体   <input type"text" name"username" οnkeyup"valuevalue.replace([\u4E00-\u9FA5]$)"> 正则表…

【区块链】认识区块链的基本概念

2018年区块链技术风卷全球&#xff0c;似乎大家都在谈论区块链&#xff0c;那到底什么区块链&#xff0c;区块链到底能干什么&#xff0c;对普通人会有什么影响&#xff0c;很多人还是稀里糊涂&#xff0c;那么就谈谈我的一些理解吧&#xff0c;抛砖引玉欢迎探讨。 我是如何接触…

Java 分割、合并byte数组

场景&#xff1a;上传文件较大&#xff0c;把存放文件内容byte数组拆分成小的。下载的时候按照顺序合并。 起初觉得挺麻烦的&#xff0c;写完觉得挺简单。 切割&#xff1a; /*** 拆分byte数组* * param bytes* 要拆分的数组* param size* 要按几个组成一…

Java版本的Bot Framework SDK

微软为了鼓励Java开发人员开发bot&#xff0c;在上个月推出了Java的Bot SDK v4.6版本&#xff0c;目前还在Preview版本&#xff0c;相信不用多久就可以赶上其他版本了。 我的java还停留在 n 年前的水平&#xff0c;但是处于好奇&#xff0c;决定玩一下这套sdk。 这套sdk目前建…

jquery方法.serializeArray()获取name和value并转为json数组

jquery的.serializeArray()方法可以获取形如以下 [ {name: firstname, value: Hello}, {name: lastname, value: World}, ] name value组成的对象数组&#xff0c;如果我们想得到key为name,value为value的json对象&#xff0c;则如下转换&#xff1a; var m {}; $.each($(&quo…

Teams Bot 如何使用新的 System.Text.Json 库

我最近把 LuckyDraw的代码升级到了 .net core 3.1&#xff0c;当然我也很想使用最新的微软json库&#xff0c;System.Text.Json这个库的性能比之前Newtonsoft.Json速度更快&#xff0c;而且就我本人爱好来说&#xff0c;更加喜欢System.Text.Json的命名&#xff0c;之前一直觉得…

将Teams Template升级到dotnet core 3.1

为了方便开发者开发Teams应用&#xff0c;我在2018年做了dotnet c#的一套模板&#xff0c;这套模块一共有三种类型&#xff0c;一个是Teams OutgoingWebhook&#xff0c;一个是MessagingExtension&#xff0c;还有一个就是Tab。 今天特地去nuget上看了一下&#xff0c;下载量还…

【动态规划】cf1034C. Region Separation

质因数分解套路的复杂度分析的动态规划 题目大意 有一颗$n$个节点有点权的树&#xff0c;初始整棵树为$1$号区域&#xff0c;要求满足下列规则&#xff1a; 除非$i$是最后一个等级&#xff0c;否则每一个$i$级区域都要被分成至少两个$i1$级区域对于每种等级&#xff0c;每个点必…

阿里大鱼短信介入demo分享

下面是关于大鱼短信平台对接的例子&#xff0c;发短信的话&#xff0c;可以用这个&#xff0c;很好用 /*** 通过阿里短信接口发送短信验证码* ***/ public class SendSmsUtil {private static Logger logger Logger.getLogger(SendSmsUtil.class);/*** 生成验证码* return*/pu…

GraphAPI 1.0中新增加的Teams API

这篇继续介绍BUILD大会里的内容&#xff1a;两个新加入GraphAPI 1.0的关于Teams的API。 这两个新增api是关于在频道Channel里发送消息和回复消息的。实际上这两个api在beta版本中早就已经加入&#xff0c;上个月build大会中公布的只是把这两个api正式发布到1.0版本&#xff0c…

【数据结构】线性表(一):顺序列表

线性表(linear_list)是最常用且最简单的一种数据结构&#xff0c;简言之&#xff0c;一个线性表是n个数据元素的有序序列。 例如&#xff1a;&#xff08;a1 , ... , ai-1 , ai , ai1 , ... , an)&#xff1a;ai-1 是 ai 的直接前驱&#xff0c;ai1 是 ai 的直接后驱。 并且&am…

Python_XlrdXlwt

1 import xlrd 2 # \U 开始的字符被编译器认为是八进制 解决方法 r 3 objWB xlrd.open_workbook(rC:\Users\IBM\Desktop\S1\7月下旬入库表.xlsx) 4 # 索引号 objTable objWB.sheet_by_index(0) 5 objTable objWB.sheet_by_name(7月下旬入库表) 6 # 单元格3种读取方式 7 print…

校招需要看的书 巩固的知识

前言 感谢教练&#xff0c;学长们&#xff0c;队友&#xff0c;lollipop&#xff0c;猫哥&#xff0c;李哥&#xff0c;表哥&#xff0c;鸡哥&#xff0c;样样&#xff0c;咸糖&#xff0c;茗记&#xff0c;明沙&#xff0c;嘻&#xff0c;树佬(排名不分先后)等等太多太多的人的…

新的Teams API权限控制

这篇继续介绍BUILD大会里的内容&#xff1a;新的Teams API权限。这些新的权限让开发者可以更加细粒度的设置权限。 之前有些开发人员有问过我&#xff0c;为什么Graph API的权限这么多&#xff0c;为什么不针对Teams弄一个总的权限&#xff0c;这样不是更加简单吗&#xff1f;…

物料主数据(MM03)跳转函数

CP_08_MATERIAL_SHOW 使用感觉能使自己的代码显得更改高端些。 其中参数MTSTA_IMP的选值参照表T132。转载于:https://www.cnblogs.com/tangcy1110/p/9081380.html

二叉树的蛇形遍历 leetcode 103

给定一个二叉树&#xff0c;返回其节点值的锯齿形层次遍历。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 例如&#xff1a;给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回…

Teams Tab的Single Sign-On

在我写这篇文章的时候&#xff0c;这个SSO机制还是在 Developer Preview 阶段&#xff0c;可能在发布前还会有一些改进。不过我觉得这个功能很好&#xff0c;所以先和大家分享一下。 如果大家之前已经开发过Teams的tab应用&#xff0c;可能会发现如果你需要一个当前用户的toke…

vim编辑器的使用--转自MJ学长

一、引言 1. vim是一款功能强大的文本编辑器&#xff0c;如果使用熟练&#xff0c;将会有效帮助我们提高编辑文本、程序的效率。vim编辑器的上手使用门槛比较高&#xff0c;很多人怯于要记很多命令&#xff0c;往往在学习的初期阶段就望而却步。 2. vim的学习需要不断的练习、使…

算法引入

算法的概念&#xff1a; 解决问题的思路。 时间复杂度&#xff1a; 定义&#xff1a; 基本运算的执行数量。是算法效率的衡量的量。 计算准则&#xff1a; 基本操作&#xff1a;即只有常数项。复杂度认为1顺序&#xff0c;按照加法计算循环&#xff0c;按照乘法计算条件。按照最…