一. ADB简介
ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载 ADB Kits 。
二.ADB的作用和原理
ADB 是 Android SDK 里的一个工具, 用这个工具可以直接操作管理Android模拟器或者真实的Android设备。它的主要功能有:
- 在设备上运行Shell命令; 将本地APK软件安装至模拟器或Android设备;
- 管理设备或手机模拟器上的预定端口;
- 在设备或手机模拟器上复制或粘贴文件。
ADB是一个C/S架构的应用程序,由三部分组成:
- 运行在pc端的adb client:首先,“adb”程序尝试定位主机上的ADB服务器,如果找不到ADB服务器,“adb”程序自动启动一个ADB服务器。接下来,当设备的adbd和pc端的adb server建立连接后,adb client就可以向ADB servcer发送服务请求;
- 运行在pc端的adb server:该组件是后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止,ADB Server还需要将adb client的请求通过usb或者tcp的方式发送到对应的adbd上;运行在设备端的常驻进程adb daemon (adbd):程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接ADB服务器,并
且为运行在主机上的客户端提供一些服务;
总结来说,adb-client给adb-server发送一条指令,然后adb-server会转发给adbd,让adbd来执行指令。其中stetho-server是app启动的一个Thread用来接收客户端的连接请求。
三.基本用法
3.1 命令语法
adb命令的基本语法:
adb [-d|-e|-s ]
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s] 这一部分,直接使用 adb。
如果有多个设备/模拟器连接,则需要为命令指定目标设备,下表是指定目标设备的命令选项:
参数 | 含义 |
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s | <serial-number> 指定相应设备序列号的设备/模拟器为命令目标 |
在多个设备/模拟器连接的情况下较常用的是 -s <serial-number> 参数,serial-number是指设备的设备序列号,可以通过 adb devices 命令获取。
3.2 启动和停止
启动 adb server 命令:
adb start-server
一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。
停止 adb server 命令:
adb kill-server
3.3 查看 adb 版本
adb version
3.4以 root 权限运行 adbd
如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 adb xxx 执行。这时可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令。
adb root
如果要恢复 adbd 为非 root 权限的话,可以使用 adb unroot 命令。
如果要恢复 adbd 为非 root 权限的话,可以使用 adb unroot 命令。
3.5 查询已连接的设备/模拟器列表
adb devices
输出格式为 [serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:
offline —— 表示设备未连接成功或无响应。
device —— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
no device —— 没有设备/模拟器连接。
四.应用管理
4.1 查看应用列表
查看应用列表的基本命令格式:
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages 的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:
参数 | 显示列表 |
无 | 所有应用 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
<FILTER> | 包名包含 <FILTER> 字符串 |
显示第三方应用:
4.2 安装apk
命令格式:
adb install [-lrtsdg] <path_to_apk>
adb install 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下:
参数 | 含义 |
-l | 将应用安装到保护目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
-s | 将应用安装到 sdcard |
-d | 允许降级覆盖安装 |
-g | 授予所有运行时权限 |
安装应用宝:
adb install 实际是分三步完成:
- push apk 文件到 /data/local/tmp。
- 调用 pm install 安装。
- 删除 /data/local/tmp 下的对应 apk 文件。
所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。
4.3 卸载apk
命令:
adb uninstall [-k] <packagename>
<packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录。
卸载应用宝:
4.4 清除应用数据与缓存
命令:
adb shell pm clear <packagename>
这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
清除应用宝缓存数据:
adb shell pm clear com.tencent.android.qqdownloader
五.查看日志
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
5.1Android 日志
命令格式:
[adb] logcat [<option>] ... [<filter-spec>] ...
常用用法如:按级别过滤日志
Android 的日志分为如下几个优先级(priority):
- V —— Verbose(最低,输出得最多)
- D —— Debug
- I —— Info
- W —— Warning
- E —— Error
- F—— Fatal
- S —— Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
adb logcat *:W
会将 Warning、Error、Fatal 和 Silent 日志输出。
日志格式:
可以用 adb logcat -v <format> 选项指定日志输出格式。format可以是:brief、process、tag、time
抓取日志到D盘log文件夹下的log.txt文件中。Ctrl+c结束日志抓取。
清空日志:
adb logcat -c
5.2内核日志
命令:
adb shell dmesg
中括号里的 [91021.469501] 代表内核开始启动后的时间,单位为秒。
通过内核日志我们可以做一些事情,比如衡量内核启动时间:在系统启动完毕后的内核日志里找到 Freeing init memory 那一行前面的时间。
六.命令汇总
常用:
- adb devices 查看手机设备
- adb install packsge(包路径)安装包
- adb install -r packages(保留数据及缓存文件安装新包)
- adb uninstall package (卸载包)
- adb kill-server 关闭adb服务
- adb start-server 启动adb服务
- adb shell pm list packages 查看手机里面所有包名
- adb shell pm list packages -3查看手机里面所有第三方包名
- adb shell /system/bin/screencap -p /sdcard/xx.png 截频并保存文件在手机上为xx.Png
- adb pull /sdcard/xx.png D:/xx.png 将手机xx.png文件保存到D盘文件下
- adb push D:/xx.text /adcard/xx.text 将电脑文件导入手机
- adb shell pm clear com.ablesky.ui.activity 清除缓存数据
- adb shell am start -n com.ablesky.ui.activity/com.ablesky.activity.SplashActivity 启动应用
- adb shell am force-stop com.ablesky.simpleness.activity 强制停止运行程序
- adb logcat 查看日志
- adb logcat > D:\log.txt 将日志打印到电脑上
- netstat -aon|findstr "5037" 查看被占用端口对应的PID
- tasklist /fi “PID eq PID号” 查看端口号对应的进程
- taskkill /pid 2027 /f 杀掉某进程
- adb shell ps查看进程列表
- 查看进程列表:adb shell ps
- adb shell ps -x [PID] 查看指定进程状态
- adb shell service list 查看后台services信息
- am start -a android.intent.action.VIEW -d 联想_lenovo笔记本电脑_平板电脑_手机_台式机_服务器_外设数码_联想官网 启动一个activity去打开网站
- adb shell monkey -p 包名 100 指定APP产生随机事件100次
- adb shell monkey -p 包名 -v -v 100 指定APP产生随机事件100次并发送详细的activity信息
进阶:
- 获取手机系统信息( CPU,厂商名称等)
adb shell "cat /system/build.prop | grep "product""
- 获取手机系统版本
adb shell getprop ro.build.version.release
- 获取手机系统api版本
adb shell getprop ro.build.version.sdk
- 获取手机设备型号
adb -d shell getprop ro.product.model
- 获取手机厂商名称
adb -d shell getprop ro.product.brand
- 获取手机的序列号,有两种方式
adb get-serialno
adb shell getprop ro.serialno
- 获取手机的IMEI,有三种方式,由于手机和系统的限制,不一定获取到
adb shell dumpsys iphonesubinfo其中Device ID即为IMEI号
adb shell getprop gsm.baseband.imei
service call iphonesubinfo 1(此种方式,需要自己处理获取的信息得到)
- 获取手机mac地址
adb shell cat /sys/class/net/wlan0/address
- 获取手机内存信息
adb shell cat /proc/meminfo
获取手机存储信息
adb shell df
- 获取手机内部存储信息:
魅族手机: adb shell df /mnt/shell/emulated
其他: adb shell df /data
获取sdcard存储信息:
adb shell df /storage/sdcard
- 获取手机分辨率
adb shell "dumpsys window | grep mUnrestrictedScreen"
- 获取手机物理密度
adb shell wm density
- 获取手机包名
查看指定apk的包名:aapt dump badging +包的全路径
查看所有apk包名:adb shell pm list package -f
- 控制系统的默认设置
adb shell settings get <System, Secure, Global>
adb shell settings get system screen_brightness 获取当前亮度
adb shell settings put system screen_brightness 150 修改系统亮度
adb shell settings get secure default_input_method 获取系统默认输入法
adb shell settings get global auto_time 获取是否允许自动获取网络时间