adb ( 全称为Android Debug Bridge)是一个C/S 架构命令行工具,起到调试桥的作用,是连接Android手机与PC端的桥梁,方便我们在电脑上对手机进行操作。adb 命令可用于执行各种设备操作,如安装和调试应用。
ADB和Fastboo最新Google官方下载地址:https://developer.android.com/studio/releases/platform-tools?hl=zh-cn,或点击下面对应链接下载
Windows:https://dl.google.com/android/repository/platform-tools-latest-windows.zip?hl=zh-cn
Mac:https://dl.google.com/android/repository/platform-tools-latest-darwin.zip?hl=zh-cn
Linux:https://dl.google.com/android/repository/platform-tools-latest-linux.zip?hl=zh-cn
针对移动端 Android 的测试, 熟练使用adb命令, 将会为给 Android 测试带来很大的便利,其中很多命令也会用于自动化测试的脚本当中。
下面主要介绍,adb 和 adb shell 命令、linux 命令只列出,不详解。以上三个部分:
在配好环境变量的前提下,在命令窗口当中输入 adb help 或者直接输入 adb ,将会列出所有的选项说明及子命令。
下面正式开始介绍 adb 命令、adb shell 命令 ~ 坐稳扶好 ~ 发车了 ~~~
在开发或者测试的过程中,我们可以通过 adb 来管理多台设备,其一般的格式为:
adb [-e | -d | -s <设备序列号>] <子命令>
C:\Users\mkcshwzx>adb devices
List of devices attached
47e965af device
C:\Users\mkcshwzx>adb get-state
device设备的状态有 3 钟,device , offline , unknowndevice:设备正常连接offline:连接出现异常,设备无响应unknown:没有连接设备
一般在连接出现异常,使用 adb devices 未正常列出设备, 设备状态异常时使用 kill-server,然后运行 start-server 进行重启服务
adb logcat
打印log至命令窗口,Ctrl + C停止打印log
adb logcat -c
-c 清空所有的日志缓存信息
adb logcat -g
-g 查看日志缓冲区信息
adb logcat -t
-t 输出最近的几行日志, 输出完退出, 不阻塞;
例如:adb logcat -t 5
adb logcat -s
设置输出日志的标签, 只显示该标签的日志;
例如:adb logcat -s System.out
adb logcat -v time > D:\Logcat\logcat.log
-v 设置日志的输出格式, 注意只能设置一项
例如:日志保存到D:\Logcat\目录下
adb logcat -v time > D:\Logcat\logcat.log
adb logcat | grep wifi
过滤固定字符串 : 只要命令行出现的日志都可以过滤, 不管是不是标签
例如:adb shell | findstr wifi
说明:
管道符“|”:可以把标准的输入流与标准的输出流进行合并,或者把某个命令的标准输出流作为另一个命令的标准输入流。
exit退出shell。
由于grep为linux命令,运行单条adb shell 时并没有进入linux
shell环境,并不能用grep等其他linux命令,只能用window cmd的命令。在这里可以用findstr来代替grep,使用方法为
findstr/grep [keyword]
输出比较多,建议重定向到一个文件中
例如:adb bugreport > d:\bugreport.log
adb install test.apk
安装应用,这里的xx.apk是电脑上的路径,例如:adb shell instal E:/test.apk。
windows 下如果需要安装含有中文名的 apk ,需要对 adb 进行修改,百度可以找到做出修改的adb , 支持中文命令的 apk,请自行搜索
adb -s xxxxxxxx install xx.apk
指定序列号的设备安装。注意:xxxx 就是上面提到adb devices 中device前面展示的手机序列号。
adb install -r test.apk
-r 覆盖安装,保留存储数据
adb install -t test.apk
允许安装测试包
adb install -s test.apk
将应用程序安装到sd卡上
adb install -d test.apk
允许降级覆盖安装,忽略版本号
adb uninstall com.baidu.BaiduMap
卸载应用
adb uninstall -k com.baidu.BaiduMap
'-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存目录
注意权限,复制系统权限的目录下的文件,需要 root ,并且一般的 Android 机 root 之后并不能使用命令去复制,而需要在手机上使用类似于 RE 的文件浏览器,先对系统的文件系统进行挂载为可读写后,才能在手机上复制移动系统文件。
adb pull sdcard/pull.txt D:\
复制 Sdcard 下的 pull.txt 文件到 D 盘:
adb pull sdcard/pull.txt D:\name.txt
如果需要重命名为 name.txt:
adb push D:\push.txt sdcard/
推送 D 盘下的 push.txt 至 Sdcard:
可以直接已这两个命令获取 root 权限,并挂载系统文件系统为可读写状态
adb reboot edl
重启设备,进入线刷模式。端口为9008
adb reboot bootloader
bootloader , 重启设备,进入 fastboot 模式
adb reboot recovery
recovery , 重启设备,进入 recovery 模式,经常刷机的同学比较熟悉这个模式
adb forward tcp:8080 tcp :8082
执行该命令后所有发往宿主机 8080 端口的消息、数据都会转发到 Android 设备的 8082 端口上,因此可以通过远程的方式控制 Android 设备。
手机、PC处于相同的网络下,手机 root ,安装应用 adbWireless ,启动应用后点击界面中间的按钮
接着运行 adb connect 192.168.28.92 , 即可通过无线的方式连接手机,缺点是速度比较慢
如何区分 adb 命令和 adb shell 命令 。简单点讲,adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令。这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下,将整个 system/bin 目录复制了出来,然后一个一个的去试。
下面介绍一些常用的 adb shell 命令 (其中pm、am 命令比较庞大)
pm全称Package Manager , 可以用pm命令获取到一些安装在 Android 设备上得应用信息,直接运行 adb shell pm 可以获取到该命令的帮助信息
adb shell pm list package
不带任何选项:列出所有的应用的包名(不知道怎么找应用的包名的同学看这里)
adb shell pm list package -s
-s:列出系统应用
adb shell pm list package -3
-3:列出第三方应用
adb shell pm list package -f
-f:列出应用包名及对应的apk名及存放位置
adb shell pm list package -i
-i:列出应用包名及其安装来源,结果显示例子:
C:\Users\mkcshwzx>adb shell pm list package -i
package:com.sohu.inputmethod.sogou installer=null
adb shell pm list package -f -3 -i baidu 命令最后增加 FILTER:过滤关键字,可以很快查找自己想要的应用
例如:查找三方应用中百度的包名、apk存放位置、安装来源:
C:\Users\mkcshwzx>adb shell pm list package -f -3 -i baidu
package:/product/preload/Baidusearch/Baidusearch.apk=com.baidu.searchbox installer=null
package:/product/preload/BaiduMap/BaiduMap.apk=com.baidu.BaiduMap installer=null
adb shell pm path test.apk
例如:C:\Users\mkcshwzx>adb shell pm path com.baidu.searchbox
package:/product/preload/Baidusearch/Baidusearch.apk
后面可跟参数 -f (与 pm list package 中一样),以及 [TARGET-PACKAGE]
adb shell pm dump com.baidu.searchbox
显示太多,请自行输入命令查看
adb shell pm install xx.apk
这里的xx.apk是Android设备内存中的路径,必须是绝对路径。一般建议放在/sdcard/下或/data/local/tmp/路径下。
其实adb install xx.apk = adb push E:\xx.apk /data/local/tmp + adb shell pm install /data/local/tmp/xx.apk
例如:
C:\Users\mkcshwzx>adb push E:\ftp.apk /data/local/tmp
E:\ftp.apk: 1 file pushed, 0 skipped. 21.9 MB/s (2769612 bytes in 0.121s)C:\Users\mkcshwzx>adb shell pm install /data/local/tmp/ftp.apk
Success
adb shell pm install -r xx.apk
重新安装该程序,保存数据
adb shell pm install -t xx.apk
允许测试包
adb shell pm install -d xx.apk
允许降级覆盖安装
若 apk 存放于 PC 端,请使用 adb install 安装
若 apk 存放于 Android 设备上,请使用 pm install 安装
adb shell pm uninstall xx.apk
例如卸载安装的AndFTP应用:C:\Users\mkcshwzx>adb shell pm uninstall lysesoft.andftpSuccess
例如清除AndFTP应用数据:C:\Users\mkcshwzx>adb shell pm clear lysesoft.andftp
Success
am全称Activity Manager,可以用am命去模拟各种系统的行为,直接运行 adb shell am 可以获取到该命令的帮助信息。
adb shell am start com.baidu.BaiduMap
以启动百度地图为例
adb shell am start -S com.baidu.BaiduMap
-S 先停止目标应用,再启动
adb shell am start -W com.baidu.BaiduMap
-W 等待应用完成启动
adb shell am start -a android.intent.action.VIEW -d https://www.cnblogs.com/luzhuangzhi/
启动默认浏览器打开一个网页
adb shell am start -a android.intent.action.CALL -d tel:10086
启动拨号器拨打 10086
单元测试或者 Robotium 会用到
adb shell am monitor
例如:C:\Users\mkcshwzx>adb shell ammonitor
Monitoring activity manager... available commands:
(q)uit: finish monitoring
** Activity starting: lysesoft.andftp
例如:C:\Users\mkcshwzx>adb shell am force-stop lysesoft.andftp
这个命令可以向 Android 设备发送按键事件
adb shell input text test123456
前提先将键盘设置为英文键盘
adb shell input keyevent KEYCODE_HOME
模拟按下 Home 键 ,源码里面有定义:
public static final int KEYCODE_HOME = 3;
因此可以将命令中的 KEYCODE_HOME 替换为 3
可自行百度 keyevent 常用键列表
官方文档:https://developer.android.com/reference/android/view/KeyEvent
adb shell input tap 500 500
点击屏幕上坐标为 500 500 的位置
adb shell input swipe 900 500 100 500
从右往左滑动屏幕
adb shell input swipe 500 500 501 501 2000
模拟长按事件
其实就是在小的距离内,在较长的持续时间内进行滑动,最后表现出来的结果就是长按动作
adb shell screencap -p /sdcard/DCIM/screenTest.png
截屏图片,保存至 /sdcard/DCIM/ 目录下
adb shell screenrecord sdcard/record.mp4
执行命令后操作手机,ctrl + c 结束录制,录制视频保存至 sdcard目录下
执行 UI automation tests , 获取当前界面的控件信息
runtest是执行测试的关键命令,用来执行jar包的测试用例。
adb shell uiautomator dump
不加 [file] 选项时,默认存放在 sdcard 下
运行 adb shell ime 可以获取到该命令的帮助信息。
adb shell ime list -s
列出设备上的输入法
C:\Users\mkcshwzx>adb shell ime list -s
com.iflytek.inputmethod/.FlyIME
com.sohu.inputmethod.sogou/.SogouIME
com.android.inputmethod.latin/.LatinIME
com.android.inputmethod.pinyin/.PinyinIME
adb shell ime set com.iflytek.inputmethod/.FlyIME
选择输入法
获取设置设备屏幕分辨率,运行 adb shell wm 可以获取到该命令的帮助信息。
adb shell wm size
获取设备分辨率
adb shell wm size 720*1080
将设备分辨率设置为720*1080
adb shell wm size reset
重置分辨率
adb shell wm density
查看当前显示密度
adb shell wm density 320
将显示密度设置为320
adb shell wm density reset
重置显示密度
adb shell wm overscan 100,200,300,400
设置显示区域
adb shell wm overscan reset
重置显示区域
请参考官方文档:https://developer.android.com/studio/test/other-testing-tools/monkey?hl=zh-cn
运行adb shell monkey -help 输出简单的使用指南。
再此补充一个引号的用途:
场景1、在 PC 端执行 monkey 命令,将信息保存至 D 盘 monkey.log,会这么写:
adb shell monkey -p com.android.settings 5000 > D:\monkey.log
场景2、在 PC 端执行 monkey 命令,将信息保存至手机的 Sdcard,需要这么写:
adb shell "monkey -p com.android.settings 5000 > sdcard/monkey.log"
如果不加上引号肯定会报错,因为不加引号是写向了 PC 端当前目录的 sdcard 目录下,而非写向手机的 Sdcard。
在settings中,settings get用来获取信息,settings put用来写入信息,运行adb shell settings 可以获取到该命令的帮助信息。
adb shell settings get system screen_brightness_mode
获取亮度是否为自动获取
adb shell settings get system screen_brightness
获取当前亮度值
adb shell settings put system screen_brightness 200
更改亮度值(亮度值在0—255之间)
adb shell settings get system screen_off_timeout
获取屏幕休眠时间
adb shell settings put system screen_off_timeout 1800000
更改休眠时间,30分钟
adb shell settings get global auto_time
获取日期时间选项中通过网络获取时间的状态,1为允许、0为不允许
adb shell settings put global auto_time 0
更改日期状态,从1改为0
adb shell settings get global adb_enabled
获取USB调试状态,1为开启、0为关闭
adb shell settings put global adb_enabled 1
更改USB调试状态,从0改为1
adb shell settings get global wifi_on
获取Wi-Fi开关状态,1为开启、0为关闭
adb shell svc wifi enable
开启Wi-Fi
adb shell svc wifi disable
关闭Wi-Fi
adb shell settings get secure android_id
获取Android_id
adb shell dumpsys | findstr DUMP
在dumpsys后面可加上具体的服务名需要列出当前运行的服务
adb shell dumpsys display | findstr DisplayDeviceInfo
获取设备分辨率
adb shell dumpsys battery
获取设备电池信息
adb shell dumpsys cpuinfo
获取 cpu 信息
adb shell dumpsys meminfo
获取内存信息
adb shell dumpsys meminfo com.baidu.BaiduMap
后面加上包名,获取具体应用的内存信息
adb shell dumpsys activity
获取 Activity 信息,加上-h可以获取帮助信息
adb shell dumpsys activity top
获取当前界面的UI信息
adb shell dumpsys activity top | findstr ACTIVITY
获取当前界面的Activity
adb shell dumpsys package
获取 package 信息,加上-h可以获取帮助信息
adb shell dumpsys package com.baidu.BaiduMap
后面加上包名,获取某个包的信息
adb shell dumpsys notification
获取通知信息
adb shell dumpsys wifi
可以获取到当前连接的wifi名、搜索到的wifi列表、wifi强度等
adb shell dumpsys power
获取电源管理信息
adb shell dumpsys telephony.registry
获取电话信息
例如: mCallState值为0,表示待机状态、1表示来电未接听状态、2表示电话占线状态
mCallForwarding=false #是否启用呼叫转移
mDataConnectionState=2 #0:无数据连接 1:正在创建数据连接 2:已连接
mDataConnectionPossible=true #是否有数据连接
mDataConnectionApn= #APN名称 等
查看 Android 设备的参数信息,只运行 adb shell getprop,结果以 key : value 键值对的形式显示,如要获取某个 key 的值:
adb shell getprop ro.build.version.sdk
获取设备的 sdk 版本
adb shell getprop ro.product.model
查看设备型号
adb shell getprop ro.build.version.release
查看 Android 系统版本
adb -d shell getprop ro.product.brand
查看手机厂商名称
adb -d shell getprop ro.product.model
查看手机设备型号
adb shell getprop ro.build.version.incremental
查看版本号
adb shell cat /sys/class/net/wlan0/address
查看手机MAC地址
adb shell cat /proc/meminfo
查看手机内存信息
adb shell df
查看手机存储信息
adb shell tcpdump -i any -p -s 0 -w /data/123.pcap
抓取网络包
adb shell ip addr show wlan0
查看wlan0 (Wi-Fi) IP地址
操作你的 Android 设备,常用到的命令,只列出,不详解!
cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、ping、ps、rm、rmdir、top、touch、重定向符号 ">" ">>"、管道 "|"
拜拜ヾ(•ω•`)o
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/
如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程