ADB,全名Android Debug Bridge,是Android提供的一个通用的调试工具,是一个C/S架构的命令行工具,通过这个工具,使得我们的PC能够和Android设备来进行通信。
adb包含三个部分:
a. Client端:运行在开发机器中,用来发送adb命令,比如电脑
b. Daemon守护进程:运行在调试设备,比如手机、模拟器中,用来接收并执行adb命令
c. Server端:运行在开发机器中,用来管理Client端和手机端Daemon之间的通信。
当在电脑命令行窗口中输入adb 命令时,会先执行adb客户端,客户端拿到命令之后,会发送给adb服务端,server再将命令传给Daemon,最后在手机上执行。假如在手机上安装一个应用,会有一个返回信息,会将信息传递给adb服务器,adb 在给客户端,最后显示在命令行。
总结:
a.client端将命令发送给server端
b.server端会将命令发送给daemon端
c.daemon端进行执行
d.将执行结果,返回给server端
e.server端将结果再返回给client端
验证adb 是否安装成功
adb help
或者
adb --help
会出现adb的版本和帮助信息
查看adb版本
adb version
重启手机
重启到 Recovery 模式
adb reboot recovery
从 Recovery 重启到 Android
adb reboot
重启到 Fastboot 模式
adb reboot bootloader
adb devices : 查看电脑是否连接设备
#查看连接的设备
adb devices
或者
adb devices -l
#查看设备连接状态
adb get-state
使用该指令将返回设备状态信息,该状态信息包含三种
以 root 权限运行 adbd
adb root
开启或者关闭服务
adb start-server:开启adb服务
adb kill-server:关掉adb服务
指定 adb server 的网络端口
adb -P <port> start-server
ADB的默认端口为 5037
adb install :安装
第一种情况:当只有一台设备时
a. adb install apk路径
b. adb install -r :覆盖原来安装的软件,并保留数据
c. adb install-multiple demo1.apk demo2.apk
d. adb install -t demo1.apk : 如果在安装中,遇到Failure [INSTALL_FAILED_TEST_ONLY installPackageLI],则使用该命令
e. adb install -d demo.apk :允许版本代码升级
f. adb install -g demo.apk :授权所有运行时权限
第二种情况:当有多台设备时,使用-s 序列号 进行指定设备
adb -s 序列号 install apk路径
adb uninstall :卸载
#packagename是应用包名
#包名问开发或自己去查询
adb uninstall [-k]<packagename>
-k表示卸载应用但保留数据和缓存文件
adb unstall demo.apk
卸载设备中的应用,并希望保留配置和缓存文件
adb -s 序列号 shell pm uninstall -k 包名
adb pull : 将移动设备中的文件传送到PC上
adb pull 移动设备路径 PC路径
adb push :将PC中的文件传送到移动设备端
adb push PC路径 移动设备路径
adb push PC路径 /sdcard/
截图保存到电脑
adb exec-out screencap -p > sc.png
如果 adb 版本较老,无法使用 exec-out 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:
先截图保存到设备里:
adb shell screencap -p /sdcard/sc.png
然后将 png 文件导出到电脑
adb pull /sdcard/sc.png C:\Users\Administrator\Desktop
可以使用 adb shell screencap -h 查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:
参数 | 含义 |
---|---|
-p | 指定保存文件为 png 格式 |
-d display-id | 指定截图的显示屏编号(有多显示屏的情况下) |
实测如果指定文件名以 .png 结尾时可以省略 -p 参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。
另外一种一行命令截图并保存到电脑的方法:
Linux 和 Windows
adb shell screencap -p | sed "s/\r$//" > sc.png
Mac OS X
adb shell screencap -p | gsed "s/\r$//" > sc.png
这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 sed for Windows 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。
而在 Mac 下使用系统自带的 sed 命令会报错:
sed: RE error: illegal byte sequence
需要安装 gnu-sed,然后使用 gsed 命令:
brew install gnu-sed
录制屏幕以 mp4 格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
如果需要导出到电脑:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数 | 含义 |
---|---|
–size WIDTHxHEIGHT | 视频的尺寸,比如 1280x720,默认是屏幕分辨率。 |
–bit-rate RATE | 视频的比特率,默认是 4Mbps。 |
–time-limit TIME | 录制时长,单位秒。 |
–verbose | 输出更多信息。 |
注:需要 root 权限。
adb shell
su
cat /data/misc/wifi/*.conf
注:需要 root 权限。
adb shell
su
date -s 20160823.131500
表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。
注:需要 root 权限。
开启 WiFi:
adb root
adb shell svc wifi enable
关闭 WiFi:
adb root
adb shell svc wifi disable
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
adb shell monkey -p <packagename> -v 500
表示向 指定的应用程序发送 500 个伪随机事件。
#查看日志,ctrl+c结束
adb logcat
#如果使用logcat不指定输出哪个缓冲区的日志,则默认输出main和system的日志
#如果要指定,则
adb logcat -b
#例如指定main缓冲区:adb logcat -b main
#指定输出到文件(格式自己搞)
adb logcat -b main > d:\log.txt
adb logcat -c:清理日志
注意:logcat是实时日志
adb logcat >/Users/xxxx/demo.log
或者
adb -s 序列号 logcat >/Users/xxxx/demo.log
可查看手机四个缓冲区日志, 包括radio, system, main, event
可以看到main和system的日志信息
日志等级,优先级从低到高分为以下几种:
V——Verbose(最低等级,开发调试中的一些详细信息,仅在开发中使用,不可再发布产品中)
D——Debug(调试,用于调试的信息,可以在发布产品中关闭,比较常见)
I——info(信息,一般提示性的信息)
W——Warning(警告)
E——Error(错误,已经出现可影响运行的错误,比如应用crash时输出的日志)
在 E级别中可以搜索这个关键字:fatal exception
ANR全名Application Not Responding,也就是应用无响应当操作在一段时间内系统无法处理时,系统层面会弹出ANR对话框
在日志中查询:ANR in
在查到ANR in 之后 上一行会有
查看日志常用的参数
adb logcat -v time 打印时间
adb logcat -v color 使用不同的颜色来显示每个优先级
adb logcat -f <filename> 将日志输出到文件(文件存在手机上),例如,adb logcat -f /sdcard/log.log
adb logcat > log.log 保存日志到PC上
adb logcat -c 清理已存在的日志
adb logcat *:W 打印Warning以上级别的日志
adb logcat ActivityManager:D '*:S' 过滤tag 为ActivityManager,level为Debug及以上级别的日志(S表示无记载silent,最高优先级,绝不输出任何内容)
输出更多日志内容
#包含logcat日志、功耗、cpu等信息日志
adb bugreport
adb connect ip:port
adb tcp:port tcp:port
adb reboot bootloader
Android系统是基于Linux系统开发的,支持常见的Linux命令,这些命令都保存在手机/system/bin文件中,shell 是 linux 系统的字符交互界面。
$ adb shell ls
或者
$ adb shell
ls
# -s 进入指定设备shell
adb -s 127.0.0.1:62001 shell
#退出adb shell
exit
#进入adb shell后有两种状态显示:#代表有root权限,$代表没有root权限
root@android:/ #
shell@mx4:/ $
如果在操作过程中出现没有权限的问题,则需要切换root用户
su root
备注:root用户是系统中唯一的超级管理员,它具有等同于操作系统的权限。一些需要root权限的应用,譬如广告阻挡,卸载系统预装App是需要root权限的。可问题在于root比windows的系统管理员的能力更大,足以把整个系统的大部分文件删掉,导致系统完全毁坏,不能再次使用。所以,用root进行不当的操作是相当危险的,轻微的可以死机,严重的甚至不能开机。所以,在Unix、Linux及Android中,除非确实需要,一般情况下都不推荐使用root。
adb shell ps
adb shell top
adb shell df
adb shell settings get secure android_id
#获取手机型号
adb shell getprop | grep product
adb shell getprop ro.product.model
#获取手机序列号
adb get-serialno
#获取系统版本号
adb shell getprop ro.build.version.release
首先我们先看一下使用adb查看Android手机信息的指令
#获取手机名称
NAME = 'adb shell getprop ro.product.model'
#获取手机版本
VERSION = 'adb shell getprop ro.build.version.release'
#获取手机厂商
PRODUCER = 'adb shell getprop ro.product.brand'
如果我们忘记具体系统属性的名字,我们可以使用grep进行过滤,比如:
adb shell getprop | grep product
那么我们在用python写自动化测试的时候应该这样使用:
import os
deviceName = os.popen('adb shell getprop ro.product.model').read()
print(deviceName)
platformVersion = os.popen('adb shell getprop ro.build.version.release').read()
print(platformVersion)
device = os.popen('adb shell getprop ro.product.name ').read()
print(device)
这样我们就实现了自动化获取手机信息
adb shell dumpsys battery
描述信息:
Current Battery Service state: // 当前电池服务状态
AC powered: false // 交流供电,false表示没有使用AC电源供电
USB powered: true // true表示使用USB电源供电
Wireless powered: false // false表示没使用无线电源
Max charging current: 500000 // 最大充电电流
Max charging voltage: 4713000 // 最大充电电压
Charge counter: 29000 // 电荷计数器??
status: 2 // 电池状态: 2:正充电;3:没插充电器;4:不充电; 5:电池充满
health: 2 // 电池健康状态:2:良好; 3:过热; 4:无用的; 5:超压; 7:温度过低
present: true // 电池是否安装在机身
level: 42 // 电池百分比
scale: 100 //满电量时电池百分比为100%(不确定是否正确)
voltage: 3868 // 电池电压
temperature: 330 // 电池温度,单位是0.1摄氏度
technology: Li-ion // 电池类型为锂电池
adb shell dumpsys battery set ac/usb/wireless 1
adb shell dumpsys battery set status 2
adb shell dumpsys battery set status 1
adb shell dumpsys battery set level 100
adb shell dumpsys battery unplug
adb shell dumpsys battery reset
获取整个设备的电量消耗信息: adb shell dumpsys batterystats | more
获取某个apk的电量消耗信息: adb shell dumpsys batterystats com.Package.name | more
由于输出信息太多,可使用命令more 或者 less 分篇查看
电量监控脚本
使用adb命令查询电量信息,使用split分隔,取出需要的信息
# 通过adb devices 查看手机device
device=''
# 获取当前时间
date_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# adb命令查询电量
adb_msg = os.popen('adb -s %s shell dumpsys battery'%device)
phone_msg = adb_msg.buffer.read().decode(encoding='utf-8')
print('phone_msg:%s'%phone_msg)
# 分隔返回的信息,取出是否充电状态
status = (phone_msg.split('status:')[1]).split('health:')[0].strip()
status_ch = '是' if status == '2' else "否"
# 分隔返回的信息,取出电量
level = (phone_msg.split('level:')[1]).split('scale:')[0].strip()
print('status:%s,status_ch:%s,level:%s'%(status,status_ch,level))
content = "当前时间:%s, 手机编号:%s, 是否在充电:%s, 剩余电量:%s %s \n"%(date_now,p_num,status_ch,level,"%")
print(content)
使用adb命令查询内存信息,使用split分隔出所需要的信息,添加到txt文档,循环输出
// An highlighted block
import os,time
now = time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime()) # 获取当前时间
class mem():
while True:
now2 = time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime()) # 获取当前时间
a = os.popen('adb shell dumpsys meminfo com.cnsj.cuiniaopad')
b = a.buffer.read().decode(encoding='utf8')
meminfo = float((((b.split('TOTAL ')[1]).split('App Su')[0]).split(' ')[0]))
MB = meminfo / 1024
if 'No process found for: com.cnsj.cuiniaopad' in b:
break
# print(meminfo)
# print(b)
c = os.popen('adb shell dumpsys meminfo')
d = c.buffer.read().decode(encoding='utf8')
e = d.split('Other mtrack')[1]
zong = (e.split('Total RAM: ')[1]).split('K ')[0]
sheng = e.split('Free RAM: ')[1].split('K ')[0]
yong = e.split('Used RAM: ')[1].split('K ')[0]
qita = (e.split('Lost RAM: ')[1].replace(' ', '')).split('K')[0]
zong1 = float(zong.replace(',', '')) / 1024
sheng1 = float(sheng.replace(',', '')) / 1024
yong1 = float(yong.replace(',', '')) / 1024
qita1 = float(qita.replace(',', '')) / 1024
jilu = '当前时间:' + now2 + ' 占用系统内存:%.2fMB 总内存:%.2fMB 剩余内存:%.2fMB 可用内存:%.2fMB 其他内存:%.2fMB' % (MB, zong1, sheng1, yong1, qita1)
print(jilu)
data = open(r'D:\Test_python\automation1_0\Pad0_2\log_screen_html\meminfo' + '/' + now + r"_meminfo.txt", 'a+',encoding="utf-8")
print(jilu,file=data)
time.sleep(10)
adb shell dumpsys wifi
由于该指令输出的信息很多,所以在此加入参数,当输出信息在显示满一页的时候就暂停输出
如果想再继续输出,则需要按空格键继续显示下页内容。按“Q”停止显示后续输出信息。
adb shell dumpsys wifi | more
adb shell dumpsys power
含义:可以判断手机是否处于锁屏状态
根据关键信息进行查询,仅输出屏幕关闭时间的设置信息
windows设置:
adb shell dumpsys power | findstr "mScreenOffTimeoutSetting"
Linux设置:
adb shell dumpsys power | grep "mScreenOffTimeoutSetting"
#查看当前活动的包的信息
adb shell dumpsys activity
#查看正在运行的包名
adb shell dumpsys window | findstr mCurrentFocus
这个也行(查到包名和当前的活动):
adb shell dumpsys activity | find "mFocusedActivity"
#获取com.eg.android.AlipayGphoneRC应用的耗电情况
adb shell dumpsys batterystats com.eg.android.AlipayGphoneRC
adb shell dumpsys window displays
adb shell dumpsys iphonesubinfo
$ adb shell dumpsys telephony.registry
(1)“mCallState”:表示呼叫状态。0,表示待机;1,表示来电尚未接听;2,表示电话占线。
(2)“mCallIncomingNumber”:表示最近一次来电的电话号码。
(3)“mServiceState”:表示服务状态。0,表示正常使用;1,表示电话没有连接任何电信运营网络;2,表示只能拨打紧急呼叫号码;3,表示电话已关机。
(4)“mSignalStrength”:表示信号强度信息。
(5)“mMessageWaiting”:表示是否在等待无线电信息。
(6)“mCallForwarding”:表示是否启用了呼叫转移。
(7)“mDataActivity”:表示无线数据通话情况。0,表示未通话;1,表示正在接收IP PPP信号;2,表示正在发送IP PPP信号;3,表示正在发送和接收IP PPP信号。
(8)“mDataConnectionState”:表示无线数据连接情况。0,表示无数据连接;1,表示正在创建数据连接;2,表示已连接;3,表示挂起状态,已经创建好连接,但IP数据通信暂无法使用。
(9)“mDataConnectionPossible”:表示是否有数据连接。
(10)“mDataConnectionReason”:表示数据连接的原因。
(11)“mDataConnectionApn”:表示APN(Access Point Name),接入点名称。
(12)“mDataConnectionLinkProperties”:表示数据连接的链路属性。
(13)“mDataConnectionLinkCapabilities”:表示数据链路连接的能力。
(14)“mCellLocation”:表示基站的相关信息。
(15)“registrations”:表示登记记录计数。
1)查看当前系统CPU使用情况:
# 获取的是一段时间的均值
adb shell dumpsys cpuinfo
2)进程占用情况
adb shell top
adb shell top | grep "包名" —— 查看某个包的一些性能
adb shell top -d 1 |grep "包名"
3)内存使用情况
adb shell dumpsys meminfo
获取CPU信息
adb shell cat /proc/cpuinfo
clflush:64 CPU是64位的处理器
processor:1 逻辑处理器的ID
cpu MHz cpu的主频
physical id : 0 物理cpu的ID (如果都是0表示就1个物理cpu)
cpu cores cpu的逻辑个数
model name cpu型号
查看cpu运行情况
#-t显示进程名称;-s按指定行排序;-n在退出前刷新几次;-d刷新间隔;-m显示最大数量
adb shell top -m 10 -s cpu
am 全称为Activity Manager ,可以使用am去模拟各种系统的行为
adb shell am start com.taobao.taobao/com.taobao.tao.TBMainActivity
强制停止应用
adb shell am force-stop <packagename>
启动app
#com.ss.android.ugc.aweme:抖音包名
#.account.white.login.DYLoginActivity:登录活动
adb shell am start -n com.ss.android.ugc.aweme/.account.white.login.DYLoginActivity
获取启动时间 adb shell am start -W 包名/界面名
➜ ~ adb shell am start -W com.qiniu.pili.droid.shortvideo.effect.demo/com.qiniu.pili.droid.shortvideo.demo.activity.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.effect.demo/com.qiniu.pili.droid.shortvideo.demo.activity.MainActivity }
Status: ok
Activity: com.qiniu.pili.droid.shortvideo.effect.demo/com.qiniu.pili.droid.shortvideo.demo.activity.MainActivity
ThisTime: 289
TotalTime: 289
WaitTime: 311
Complete
以毫秒为单位
点击图标然后松开,这个时间是系统时间(分配内存和CPU的时间),应用application等待资源启动的时间
ThisTime:为界面启动耗时
TotalTime:应用自身启动耗时=ThisTime + 应用application等资源启动时间
WaitTime:系统启动耗时=TotalTime + 系统资源启动时间
pm全称为package manager ,可以使用pm命令模拟Android行为或者查询设备上的应用。
列出所有的包名
adb shell pm list packages
列出通过第三方安装的包
adb shell pm list packages -3
包名包含某字符串的应用,比如要查看包名包含字符串 huawei 的应用列表
adb shell pm list packages huawei
#列出系统apk路径和包名
adb shell pm list package -s
找到 apk 的位置
$ adb shell pm path com.tence01.mm
package:/data/app/com.tence01.mm-1.apk
#清除应用数据及缓存
adb shell pm clear 包名
adb shell wm size
adb shell wm density
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
adb shell wm size 480x1024
表示将分辨率修改为 480px * 1024px。
adb shell wm size reset
adb shell wm density 160
表示将屏幕密度修改为 160dpi。
adb shell wm density reset
adb shell wm overscan 0,0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
adb shell wm overscan reset
adb shell settings put global adb_enabled 0
用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。
去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。
setprop persist.internet.adb.enable 1
该方法当次设置有效,重启后无效
setprop service.adb.tcp.port 5555
adb push init.rc sdcard
该方法是设置后,放到手机int.rc文件中,但是现在 The init.rc script resides in within the RAMDisk attached to the boot image. 所有重启也是无效的。
提取手机boot.img,修改default.prop中的配置重新打包刷回,应该是可以的,但是太折腾。
最佳方案:
setprop persist.adb.tcp.port 5555
应该就是在 /data/property目录下创建了persist.adb.tcp.port文件,内容为端口号,需要su。手机重启后,adb无线调试自动开启。
相关文档:https://developer.android.com/reference/android/view/KeyEvent
1.打开“指针位置” 设置
设置——开发者选项——指针位置
2.执行 adb shell input 命令
C:\Users\enmonster>adb shell input
Usage: input [<source>] <command> [<arg>...]
The sources are:
dpad
keyboard
mouse
touchpad
gamepad
touchnavigation
joystick
touchscreen
stylus
trackball
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
tmode <tmode>
- 模拟点击事件
adb shell input tap x坐标 y坐标
adb shell input tap 528 1539
- 输入文本
首先需要把光标移到输入框,然后执行以下命令
adb shell input text zengzengzeng
- 模拟滑动事件
adb shell swip <起点x> <起点y> <终点x> <终点y> <滑动时长>
adb shell input swipe 528 1539 528 1300 2000
2000为滑动时间,单位是毫秒
- 返回键
adb shell input keyevent 4
- 返回home键(置应用于后台)
adb shell input keyevent 3
- 音量放大
adb shell input keyevent 24
- 音量缩小
adb shell input keyevent 25
adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能
keycode | 含义 |
---|---|
3 | HOME 键 |
4 | 返回键 |
5 | 打开拨号应用 |
6 | 挂断电话 |
24 | 增加音量 |
25 | 降低音量 |
26 | 电源键 |
27 | 拍照(需要在相机应用里) |
64 | 打开浏览器 |
82 | 菜单键 |
85 | 播放/暂停 |
86 | 停止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移动光标到行首或列表顶部 |
123 | 移动光标到行末或列表底部 |
126 | 恢复播放 |
127 | 暂停播放 |
164 | 静音 |
176 | 打开系统设置 |
187 | 切换应用 |
207 | 打开联系人 |
208 | 打开日历 |
209 | 打开音乐 |
210 | 打开计算器 |
220 | 降低屏幕亮度 |
221 | 提高屏幕亮度 |
223 | 系统休眠 |
224 | 点亮屏幕 |
231 | 打开语音助手 |
276 | 如果没有 wakelock 则让系统休眠 |
adb shell ifconfig | grep Mask
在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:
adb shell ifconfig wlan0
如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用):
adb shell netcfg
adb shell cat /sys/class/net/wlan0/address
输出示例:
f8:a9:d0:17:42:4d
这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 adb shell netcfg 命令来查看。
设备的更多硬件与系统属性可以通过如下命令查看:
adb shell cat /system/build.prop
启用 SELinux
adb root
adb enable-verity
禁用 SELinux
adb root
adb shell setenforce 0
启用 dm_verity
adb root
adb enable-verity
禁用 dm_verity
adb root
adb disable-verity