一、adb简介
adb(Android debug bridge),意为调试Android设备的桥梁。主要存放在sdk安装目录下的platform-tools文件夹中。可以管理、调试Emulator(模拟机)或Device(安卓真机)。adb是一个C/S架构的应用程序,由三部分组成:
- adb client:adb 客户端,在PC上运行。
- adb server:adb 服务端,在PC上运行。
- adb daemon:adbd 守护进程,在Emulator或Device上运行。
1、adb server与adb client的连接
当adb server启动时,会绑定到本地的5037(tcp)端口,通过此端口监听从adb client发来的信息。
2、adb server与adb daemon的连接
adb server与Emulator(或Device)连接时使用两个(一组)端口进行:
- 一个奇数的5555,先建立adb server与adbd的连接通信。
- 一个为偶数的5554,再建立与Emulator(或Device)的交互连接。
ps:adb server通过扫描5555—5585之间的奇数端口搜索adb daemon,进行adb连接;而用相应的偶数端口(奇数端口号-1,如5555对应5554)进行Emulator或Device实例的连接。也正因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。
3、adb连接逻辑图
4、adb架构图
二、adb安装
(1)下载adb安装包:http://adbshell.com/downloads
(2)将安装包解压到电脑自定义路径下。
(3)配置系统环境变量,例如:D:\Program Files\adb
(4)测试是否安装成功,cmd输入命令adb
查看adb版本。
三、adb基本用法
1、adb命令的基本语法adb [-d|-e|-s <serialNumber>] <command>
-d
指定当前唯一通过 USB 连接的 Android 设备为命令目标-e
指定当前唯一运行的模拟器为命令目标-s <serialNumber>
指定相应serialNumber号的设备/模拟器为命令目标
1
2
3
4
5
6
7 # 查看serialNumber
$ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
2、启动/停止adb serveradb start-server
:启动 adb serveradb kill-server
:停止 adb server
3、指定adb server网络端口adb -P <port> start-server
# 默认端口为5037
4、查看 adb 版本adb version
5、root权限adb root
:获取root权限adb unroot
: 解除root权限
四、设备连接管理
1、查询已连接设备/模拟器adb devices
输出格式为 [serialNumber] [state]。serialNumber即常说的SN,state 有如下几种:
- offline:表示设备未连接成功或无响应。
- device:设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
- no device:没有设备/模拟器连接。
2、连接设备的几种方式
(1)USB连接
1)硬件状态正常:包括Android设备处于正常开机状态,USB连接线和各种接口完好。
2)设备的开发者选项和USB调试模式已开启:「设置」-「开发者选项」-「Android 调试」。
3)设备驱动状态正常:在Linux和Mac OS X下没问题,在Windows下可能需要安装驱动。
4)通过USB线连接好电脑和设备后检查状态:adb devices。
(2)无线连接(需要借助USB线)
1)将Android设备与电脑连接到同一个局域网:比如连到同一个 WiFi。
2)将设备与电脑通过USB线连接:确保连接成功,可运行adb devices查看。
3)让设备在5555端口监听TCP/IP连接:adb tcpip 5555
。
4)断开USB连接。
5)查看设备的IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」;也可以在第4)步前使用命令adb shell ifconfig | grep Mask
查看。
6)通过IP地址连接设备:adb connect <device-ip-address>
7)查看连接状态:adb devices。
(3)无线连接(无需借助USB线)
1)开启root权限:可以借助root应用。
2)在Android设备上安装一个终端模拟器:提供一个终端模拟器下载地址https://jackpal.github.io/Android-Terminal-Emulator/
3)将Android设备与电脑连接到同一个局域网:比如连到同一个WiFi。
4)打开Android设备上的终端模拟器,在里面依次运行命令:su
setprop service.adb.tcp.port 5555
5)查看设备的IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」;也可以使用命令adb shell ifconfig | grep Mask
查看。
6)通过IP地址连接设备:adb connect <device-ip-address>
ps:有的设备,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第6)步之前需要重启adbd服务,在设备的终端模拟器上运行:restart adbd
,如果restart无效,可以尝试以下命令:stop adbd
start adbd
五、应用管理
1、查看应用列表adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
无
:所有应用-f
:显示应用关联的 apk 文件-d
:只显示 disabled 的应用-e
:只显示 enabled 的应用-s
:只显示系统应用-3
:只显示第三方应用-i
:显示应用的 installer-u
:包含已卸载应用FILTER
:包名包含 FILTER字符串
1
2
3
4
5 adb shell pm list packages #全部应用
adb shell pm list packages -s #系统应用
adb shell pm list packages -3 #第三方应用
adb shell pm list packages test #包含字符串的应用
adb shell pm list packages | grep test #grep过滤包含字符串的应用
2、安装APKadb install [-lrtsdg] <path_to_apk>
-l
:将应用安装到保护目录 /mnt/asec-r
:允许覆盖安装-t
:允许安装AndroidManifest.xml里application指定android:testOnly=”true”的应用-s
:将应用安装到 sdcard-d
:允许降级覆盖安装-g
:授予所有运行时权限
ps:adb install实际上分三步完成(必要时可以手动分步执行安装过程):
- push apk 文件到 /data/local/tmp。
- 调用 pm install 安装。
- 删除 /data/local/tmp 下的对应 apk 文件。
3、卸载APKadb uninstall [-k] <packagename>
- -k:卸载应用但保留数据和缓存目录。
也可以直接删除:
1
2
3 adb shell
cd data/app
rm <packagename>
4、清除应用数据与缓存adb shell pm clear <packagename>
1 adb shell pm clear com.test.mobile
5、查看前台Activityadb shell dumpsys activity activities | grep mFocusedActivity
6、查看正在运行的Servicesadb shell dumpsys activity services [<packagename>]
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
7、查看应用安装路径adb shell pm path <PACKAGE>
六、应用交互
应用交互主要是使用 am <command>
:
start [options] <INTENT>
:启动指定的 Activity startservice [options] <INTENT>
:启动指定的 Service broadcast [options] <INTENT>
:发送指定的广播 force-stop <packagename>
:停止相关的进程 stopservice <INTENT>
:停止Servicekill <PACKAGE>
:杀指定后台进程kill-all
:杀所有后台进程hang
:系统卡住restart
:重启bug-report
:创建bugreportdumpheap <pid> <file>
:进程pid的堆信息输出到filesend-trim-memory <pid><level>
:收紧进程的内存monitor
:监控
-a <ACTION>
:指定Intent action, 比如 android.intent.action.VIEW-n <COMPONENT>
:指定完整组件名,用于明确指定启动哪个Activity,如 com.example.app/.ExampleActivity-d <DATA_URI>
:指定Intent data URI-t <MIME_TYPE>
:指定Intent MIME Type-c <CATEGORY>
:指定Intent category,比如 android.intent.category.APP_CONTACTS-p <PACKAGE>
:指定包名,实现原理Intent.setPackage()-f <FLAGS>
:添加flags,实现原理Intent.setFlags(int ),紧接着的参数必须是int型
--esn <EXTRA_KEY>
:null 值(只有 key 名)-e | --es <EXTRA_KEY> <EXTRA_STRING_VALUE>
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>
:boolean 值--ei <EXTRA_KEY> <EXTRA_INT_VALUE>
:integer 值--el <EXTRA_KEY> <EXTRA_LONG_VALUE>
:long 值--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE>
:float 值--eu <EXTRA_KEY> <EXTRA_URI_VALUE>
:URI--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>
:component name--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]
:integer 数组--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]
:long 数组
1、启动Activityadb shell am start [options] <INTENT>
-D
: 允许调试功能-W
: 等待app启动完成,获得启动时间-R <COUNT>
: 重复启动Activity COUNT次-S
: 启动activity之前,先调用forceStopPackage()方法强制停止app–opengl-trace
: 运行获取OpenGL函数的trace–user <USER_ID> | current
: 指定用户来运行App,默认为当前用户–start-profiler <FILE>
: 启动profiler,并将结果发送到-P <FILE>
: 类似 –start-profiler,不同的是当app进入idle状态,则停止profiling–sampling INTERVAL
: 设置profiler 取样时间间隔,单位ms
1
2 adb shell am start -n com.tencent.mm/.ui.LauncherUI
adb shell am start -n -W com.tencent.mm/.ui.LauncherUI
2、启动Serviceadb shell am startservice [options] <INTENT>
1 adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
3、停止Serviceadb shell am stopservice [options] <INTENT>
4、发送广播adb shell am broadcast [options] <INTENT>
1 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:
android.net.conn.CONNECTIVITY_CHANGE
:网络连接发生变化android.intent.action.SCREEN_ON
:屏幕点亮android.intent.action.SCREEN_OFF
:屏幕熄灭android.intent.action.BATTERY_LOW
:电量低,会弹出电量低提示框android.intent.action.BATTERY_OKAY
:电量恢复了android.intent.action.BOOT_COMPLETED
:设备启动完毕android.intent.action.DEVICE_STORAGE_LOW
:存储空间过低android.intent.action.DEVICE_STORAGE_OK
:存储空间恢复android.intent.action.PACKAGE_ADDED
:安装了新的应用android.net.wifi.STATE_CHANGE
:WiFi连接状态发生变化android.net.wifi.WIFI_STATE_CHANGED
:WiFi 状态变为启用/关闭/正在启动/正在关闭/未知android.intent.action.BATTERY_CHANGED
:电池电量发生变化android.intent.action.INPUT_METHOD_CHANGED
:系统输入法发生变化android.intent.action.ACTION_POWER_CONNECTED
:外部电源连接android.intent.action.ACTION_POWER_DISCONNECTED
:外部电源断开连接android.intent.action.DREAMING_STARTED
:系统开始休眠android.intent.action.DREAMING_STOPPED
:系统停止休眠android.intent.action.WALLPAPER_CHANGED
:壁纸发生变化android.intent.action.HEADSET_PLUG
:插入耳机android.intent.action.MEDIA_UNMOUNTED
:卸载外部介质android.intent.action.MEDIA_MOUNTED
:挂载外部介质android.os.action.POWER_SAVE_MODE_CHANGED
:省电模式开启
5、强制停止应用adb shell am force-stop <packagename>
1 adb shell am force-stop com.test.mobile
6、收紧内存adb shell am send-trim-memory <pid> <level>
- pid: 进程 ID
- level: HIDDEN、RUNNING_MODERATE、BACKGROUND、 RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
1 adb shell am send-trim-memory 12345 RUNNING_LOW
七、文件管理
1、复制设备里的文件到电脑adb pull <设备里的文件路径> [电脑上的目录]
1
2 adb pull /sdcard/sr.mp4 ~/tmp/
#ps:设备上的文件路径可能需要root权限才能访问,如果你的设备已经root过,可以先使用 adb shell 和 su 命令在 adb shell 里获取 root 权限后,先 cp /path/on/device /sdcard/filename 将文件复制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc
2、复制电脑里的文件到设备adb push <电脑上的文件路径> <设备里的目录>
1
2 adb push ~/sr.mp4 /sdcard/
#ps:设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shell 和 su 在 adb shell 里获取 root 权限后,cp /sdcard/filename /path/on/device
八、查看日志
1、查看日志[adb] logcat [<option>] ... [<filter-spec>] ...
(1)选项解析:
-s
: 设置输出日志的标签, 只显示该标签的日志;-f
: 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;-r
: 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;-n
: 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;-v
: 设置日志的输出格式, 注意只能设置一项;-c
: 清空所有的日志缓存信息;-d
: 将缓存的日志输出到屏幕上, 并且不会阻塞;-t
: 输出最近的几行日志, 输出完退出, 不阻塞;-g
: 查看日志缓冲区信息;-b
: 加载一个日志缓冲区, 默认是 main, 下面详解;-B
: 以二进制形式输出日志;
(2)过滤项解析,格式 :
V
: Verbose (明细);D
: Debug (调试);I
: Info (信息);W
: Warn (警告);E
: Error (错误);F
: Fatal (严重错误);S
: Silent(Super all output) (最高的优先级, 可能不会记载东西);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 adb logcat -d -f /sdcard/log.txt #日志写入sdcard
adb logcat ActivityManager:I MyApp:D *:S # 按tag和级别过滤日志
adb logcat -c #清空日志
adb logcat -v time > C:\Users\test\Desktop\log.txt #日志写入电脑
# 设置日志的输出格式:
#brief格式(是默认的日志格式): 【优先级 / 标签 (进程ID) : 日志信息】
adb logcat -v brief
#process格式 : 【优先级 (进程ID) : 日志信息】
adb logcat -v process
#tag格式 : 【优先级 / 标签 : 日志信息】
adb logcat -v tag
#thread格式 : 【优先级 ( 进程ID : 线程ID) 标签 : 日志内容】
adb logcat -v thread
# raw格式 : 只输出日志信息, 不附加任何其他信息
adb logcat -v raw
#time格式 : 【日期 时间 优先级 / 标签 (进程ID) : 进程名称 : 日志信息】
adb logcat -v time
#long格式: 【[日期 时间 进程ID : 线程ID 优先级 / 标签] 日志信息】
adb logcat -v long
2、内核日志adb shell dmesg
九、查看设备信息
1、查看屏幕分辨率adb shell wm size
1
2
3
4
5 adb shell wm size
#输出信息
Physical size: 1080x1920 #屏幕分辨率原本是 1080px * 1920px
Override size: 480x1024 #当前被修改为 480px * 1024px,如果未修改过则不显示
2、查看屏幕密度adb shell wm density
1
2
3
4
5 adb shell wm density
#输出信息
Physical density: 480 #屏幕密度原来是 480dpi
Override density: 160 #当前被修改为 160dpi,如果未修改过则不显示
3、查看显示屏参数adb shell dumpsys window displays
1
2
3
4
5
6
7
8 adb shell dumpsys window displays
#输出信息
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false
#mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp
4、查看电池状况adb shell dumpsys battery
adb shell dumpsys batterystats
5、查看CPU信息adb shell cat /proc/cpuinfo
adb shell dumpsys cpuinfo | grep {PackageName}
adb shell top | grep {PackageName}
6、查看内存信息adb shell cat /proc/meminfo
adb shell dumpsys meminfo {PackageName}
adb shell top -d 刷新时间| grep {PackageName}
7、查看流量信息adb shell cat /proc/pid/net/dev
8、查看FPSadb shell dumpsys gfxinfo
1 adb shell dumpsys gfxinfo com.peng.cloudp.tv > test.txt #抓取数据后用表格进行分析
9、查看型号adb shell getprop ro.product.model
10、查看android_idadb shell settings get secure android_id
11、查看IMEI
(1)Android 4.4及以下版本可通过如下命令获取IMEI:adb shell dumpsys iphonesubinfo
(2)Android 5.0及以上版本通过其它方式获取了(需要 root 权限):
1
2
3 adb shell
su
service call iphonesubinfo 1
12、查看安卓系统版本adb shell getprop ro.build.version.release
13、查看IP地址adb shell ifconfig | grep Mask
有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:adb shell ifconfig wlan0
如果以上命令仍然不能得到期望的信息,可以试试以下命令:adb shell netcfg
14、查看Mac地址adb shell cat /sys/class/net/wlan0/address
这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过adb shell netcfg
15、更多硬件与系统属性adb shell cat /system/build.prop
- ro.build.version.sdk:SDK 版本
- ro.build.version.release:Android 系统版本
- ro.build.version.security_patch:Android 安全补丁程序级别
- ro.product.model:型号
- ro.product.brand:品牌
- ro.product.name:设备名
- ro.product.board:处理器型号
- ro.product.cpu.abilist:CPU 支持的 abi 列表[节注一]
- persist.sys.isUsbOtgEnabled:是否支持 OTG
- dalvik.vm.heapsize:每个应用程序的内存上限
- ro.sf.lcd_density:屏幕密度
输出里还包括一些其它有用的信息,它们也可通过 adb shell getprop <属性名>
命令单独查看。
16、查看连接过的WiFi密码adb shell
su
cat /data/misc/wifi/*.conf
ps:需要root权限
17、获取连接到的设备的序列号adb get-serialno
18、获取设备的连接状态adb -s {serialno} get-stat
19、等待设备连接成功adb wait-for-device
十、修改设置
1、修改分辨率adb shell wm size 480x1024
恢复原分辨率命令:adb shell wm size reset
2、修改屏幕密度adb shell wm density 160
恢复原屏幕密度命令:adb shell wm density reset
3、修改显示区域adb shell wm overscan 0,0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
恢复原显示区域命令:adb shell wm overscan reset
4、关闭USB调试模式adb shell settings put global adb_enabled 0
ps:用命令恢复不了了,关闭了USB调试,adb就连接不 Android设备了。
5、状态栏和导航栏的显示隐藏adb shell settings put global policy_control <key-values>
key:
immersive.full
:同时隐藏immersive.status
:隐藏状态栏immersive.navigation
:隐藏导航栏immersive.preconfirms
:?
value:
apps
:所有应用*
:所有界面packagename
:指定应用-packagename
:排除指定应用
1
2 adb shell settings put global policy_control immersive.full=*
adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
6、设置系统日期和时间
ps:需要root权限adb shell
su
(1)先设置系统的时区配置
cat /data/property/persist.sys.timezone
:查看当前时区配置文件setprop persist.sys.timezone GMT
:修改属性
(2)设置修改当前系统时间
date -s "yyyymmdd.[[[hh]mm]ss]"
System/bin/date -s "yyyymmdd.[[[hh]mm]ss]"
(3)查看是否生效date
1
2
3
4 date -s "20151116.120000"
date
#输出:Mon Nov 16 12:00:02 CST 2015
十一、设备控制
1、屏幕截图adb exec-out screencap -p > sc.png
-p
:指定保存文件为 png 格式-d display-id
:指定截图的显示屏编号(有多显示屏的情况下)
以上命令需要新版本adb,老版本请使用下边命令:adb shell screencap -p /sdcard/sc.png
adb pull /sdcard/sc.png
2、录制屏幕adb shell screenrecord /sdcard/test.mp4
--size WIDTHxHEIGHT
:视频的尺寸,比如 1280x720,默认是屏幕分辨率。--bit-rate RATE
:视频的比特率,默认是 4Mbps。--time-limit TIME
:录制时长,单位秒。--verbose
:输出更多信息
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。如果需要导出到电脑:adb pull /sdcard/test.mp4
3、重启设备adb reboot
4、设备关机adb shutdown
5、开启/关闭wifi
adb shell svc wifi enable
:开启wifiadb shell svc wifi disable
:关闭wifi
ps:需要root权限
6、模拟按键/输入adb shell input [<source>] <command> [<arg>...]
The sources are:
- mouse
- keyboard
- joystick
- touchnavigation
- touchpad
- trackball
- stylus
- dpad
- gesture
- touchscreen
- gamepad
The commands and default sources are:
- text
(Default: touchscreen) - keyevent [–longpress]
… (Default: keyboard) - tap
(Default: touchscreen) - swipe
[duration(ms)] (Default: touchscreen) - press (Default: trackball)
- roll
(Default: trackball)
ps:常用keycode键值表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #输入文本
adb shell input text hello
#滑动屏幕
adb shell input swipe 300 1000 300 500
#点击屏幕
adb shell input touchscreen tap 300 1000
#熄灭屏幕
adb shell input keyevent 223
#点亮屏幕
adb shell input keyevent 224
#电源键
adb shell input keyevent 26
#菜单键
adb shell input keyevent 82
#HOME键
adb shell input keyevent 3
#返回键
adb shell input keyevent 4
#增加音量
adb shell input keyevent 24
#降低音量
adb shell input keyevent 25
#静音
adb shell input keyevent 164
十二、挂载分区
1、简写命令adb remount
adb shell mount -o remount /system
2、mount命令详解mount [-r] [-w] [-o options] [-t type] device directory
-t vfstype
:指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:- 光盘或光盘镜像:iso9660
- DOS fat16文件系统:msdos
- Windows 9x fat32文件系统:vfat
- Windows NT ntfs文件系统:ntfs
- Mount Windows文件网络共享:smbfs
- UNIX(LINUX) 文件网络共享:nfs
-o options
:主要用来描述设备或档案的挂接方式。常用的参数有:- loop:用来把一个文件当成硬盘分区挂接上系统
- ro:采用只读方式挂接设备
- rw:采用读写方式挂接设备
- iocharset:指定访问文件系统所用字符集
- device:要挂接(mount)的设备。
- dir:设备在系统上的挂接点(mount point)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 # 需要root权限
adb shell
su
# 查看当前分区挂载情况
mount
# 找到/system的那一行
#/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
# 重新挂载
mount -o remount,rw /dev/block/mtdblock0 /system
#如果需要改回去ro
mount -o remount,ro /dev/block/mtdblock0 /system
十三、刷机相关
1、从Recovery重启到Androidadb reboot
2、重启到Recovery模式(卡刷)adb recovery
3、重启到Fastboot模式(线刷)adb reboot bootloader
4、通过sideload更新系统(属于卡刷)
(1)重启到 Recovery 模式。adb reboot recovery
(2)在设备的Recovery界面上操作进入Apply update-Apply from ADB。
ps:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。
(3)通过 adb 上传和更新系统。adb sideload <path-to-update.zip>
持续更新…
最后更新: 2018年05月11日 14:39