Android调试桥 (adb)
Android调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:
客户端,该组件发送命令。客户端在开发计算机上运行。您可以通过发出adb 命令从命令行终端调用客户端。
后台程序 A daemon (adbd),该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
服务器,该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。
放个自己理解画的图
adb有什么用
借助adb工具我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等等。其实简而言说,adb就是连接Android手机与PC端的桥梁,可以让用户在电脑上对手机进行全面的操作。
1)、快速更新设备或手机模拟器中的代码,如应用或Android 系统升级;
2)、在设备上运行shell命令;
3)、管理设备或手机模拟器上的预定端口;
4)、在设备或手机模拟器上复制或粘贴文件;
当然有好玩的用处
从别的文章中看到的。。。
有了这个工具,就可以在手机上做很多比较好玩的事情。比如前段时间比较火的微信小程序游戏“跳一跳”,利用adb进行截屏,opencv进行图像处理,自动“跳一跳”得高分。又比如一些自动点赞、刷票、打卡等小工具。
一些基础的adb命令
查看到连接的手机设备信息
adb devices
安装apk
mac 系统
首先 将文件拖入终端就可得地址
然后 adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡 就完成了。
启动Activity:
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-ccategory,-e 扩展数据,等)。
启动应用:
adb shell am start -n <package_name>/.<activity_class_name>
例如:adb shell am start -n yf.o2o.store/yf.o2o.store.activity.LoginActivity
让原本数据线连接的设备 变为无线:
保证手机和电脑处在同一个无线网络内
在USB连接的基础上,执行命令【adb tcpip 5555】
断开USB连接,执行命令【adb connect 设备ip地址:5555】
此时执行命令【adb devices】即可查看到连接的手机设备信息
就像git一样的 push 和pull命令
从本地复制文件到设备:
adb push
从设备复制文件到本地:
adb pull
运行adb 命令获取屏幕分辨率等信息:
模拟用户事件
文本输入:adb shell input text
例:手机端输出demo字符串,相应指令:adb shell input "demo".
键盘事件:input keyevent ,其中KEYCODE见本文结尾的附表
例:点击返回键,相应指令: input keyevent 4.
点击事件:input tap
例: 点击坐标(500,500),相应指令: input tap 500 500.
滑动事件:input swipe
例: 从坐标(300,500)滑动到(100,500),相应指令: input swipe 300 500 100 500.
例: 200ms时间从坐标(300,500)滑动到(100,500),相应指令: input swipe 300 500 100 500 200.
与应用交互
与应用交互主要是使用am <command>命令,常用的<command>如下:
command用途
start [options] <intent>启动<intent>指定的 Activity
startservice [options] <intent>启动<intent>指定的 Service
broadcast [options] <intent>发送<intent>指定的广播
force-stop <package-name>停止<package-name>相关的进程
Activity
adb shell am start -a android.settings.SETTINGS # 打开系统设置页面adb shell am start -a android.intent.action.DIAL -d tel:10086 # 打开拨号页面adb shell am start -n com.android.mms/.ui.ConversationList # 打开短信会话列表
Service
adb shell am startservice [options]
一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示,可以试试这个:
adb shell am startservice -n com.android.systemui/.SystemUIService
broadcast
向所有组件广播 BOOT_COMPLETED:
adb shell am broadcast [options] <INTENT>
只向 com.android.receiver.test/.BootCompletedReceiver 广播 BOOT_COMPLETED:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver
Android 日志
查看 Android 设备系统属性的基本命令格式是:
adb logcat [option] [filter-specs]复制代码
如果需要停止logcat日志打印,可以按Ctrl + C停止日志监控。
按级别过滤日志
按级别过滤日志的基本命令格式是:
adb logcat [filter-specs]复制代码
Android 的日志分为如下几个优先级(priority):
级别含义
*:V过滤只显示 Verbose 及以上级别(优先级最低)
*:D过滤只显示 Debug 及以上级别
*:I过滤只显示 Info 及以上级别
*:W过滤只显示 Warning 及以上级别
*:E过滤只显示 Error 及以上级别
*:F过滤只显示 Fatal 及以上级别
*:S过滤只显示 Silent 及以上级别(优先级最高,什么也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
adb logcat *:W复制代码
会将 Warning、Error、Fatal 和 Silent 日志输出。
(注:在 macOS 下需要给*:W这样以*作为 tag 的参数加双引号,如adb logcat "*:W",不然会报错no matches found: *:W。)
按 tag 和级别过滤日志
按 tag 和级别过滤日志的基本命令格式是:
adb logcat [tag:level] [tag:level] ...复制代码
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S复制代码
表示输出 tagActivityManager的 Info 以上级别日志,输出 tagMyApp的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
关于adbd
觉得adbd是个有趣的东西
就探索了一下
注:JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。它仅仅定义了数据传输的格式 ,Java 调试体系。
由于本人技术有限,详情在jdwp主讲页
关于这个方面,希望自己日后可以补充。
参考资料
https://juejin.im/post/5b5683bcf265da0f9b4dea96
https://developer.android.com/studio/command-line/adb