当前位置:   article > 正文

Android adb说明与详解

android adb

Android adb 说明与详解

Android Debug Bridge(ADB)是一个非常有用的工具,它可以帮助开发人员在Android设备和计算机之间进行通信,以便在设备上进行调试、测试和安装应用程序。

1. 安装ADB

在使用ADB之前,您需要安装Android SDK。安装完SDK后,您可以在SDK目录的platform-tools目录中找到ADB。

2. 连接设备

现在,使用USB线将Android设备连接到计算机上。打开终端或命令提示符(CMD)并输入以下命令来检查设备是否成功连接:

adb devices
  • 1

如果设备已成功连接,将会显示设备的标识符。

>> adb devices
List of devices attached
O6Q74AR6QG      device
192.168.9.66:5555       device
  • 1
  • 2
  • 3
  • 4

输出说明:

  • O6Q74AR6QG192.168.9.66:5555 表示为
  • device表示设备连接状态(device:设备已连接;offline:设备未连接成功或无响应;no device:没有设备、模拟器连接)

3. 设备管理

使用ADB命令可以执行各种设备管理操作。以下是一些常见的命令示例:

  • 为命令指定目标设备(在多个设备同时连接的情况下)
adb [-d|-e|-s <serialNumber>] <command>
  • 1
参数含义
-d指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e指定当前唯一运行的 wifi连接的Android设备/模拟器 为命令目标
-s <serialNumber>指定相应 serialNumber 号的设备/模拟器为命令目标

- 启动/停止

启动 adb server 命令

adb start-server
  • 1

停止 adb server 命令

adb kill-server
  • 1

- 查看ADB版本

adb version
  • 1

- 以root权限运行adbd

adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行;所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 adb xxx 执行。这时可以 adb shell 然后 su 后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
命令

adb root
  • 1

成功后的输入内容:restarting adbd as root,之后再执行adb shell,命令行提示符应该是变成#
部分手机或高版本的手机是无法通过 adb root 命令让adbd以root权限执行,会提示 adbd cannot run as root in production builds
相对应的,如果要回复adbd为非root权限的话,可以使用 adb unroot 命令。

- 指定 adb server 的网络端口

adb -P <port> start-server
  • 1

默认端口为5037

- 设备连接管理

  • 查询已经连接的设备/模拟器
  • USB连接
  • 无线连接连接(Android11及以上)
    Android 11 及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。
    官方文档
    具体操作步骤可自行查询。
  • 无线连接连接
    命令
    adb connect <device-ip-address>
    
    • 1
    连接成功提示 connected to 192.168.9.65:5555 ,连接失败提示 cannot connect to 192.168.9.69:5555: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (10060)
    连接失败的处理方式:
    1. 通过USB连接设备,并确认连接成功后,执行 adb tcpip 5555 让设备在 5555 端口监听TCP/IP连接,断开USB连接后重新通过 adb connect <device-ip-address> 连接设备
    2. 在设备端安装一个终端模拟器 ,安装后打开模拟器,依次执行 su setprop service.adb.tcp.port 5555 stop adbd start adbd 命令,之后直接通过ip地址直接连接

- 安装应用

adb install <path_to_apk>
#命令格式
adb install [-lrtsdg] <path_to_apk>
  • 1
  • 2
  • 3

将应用安装到设备上。<path_to_apk>是APK文件的路径。
参数说明: -l 将应用安装到包含目录/mnt/asec ; -r 允许覆盖安装; -t 允许安装AndroidManifest.xml里application指定 android:testOnly="true" 的应用; -s 将应用安装到sdcard ; -d 允许降级覆盖安装; -g 授予所有运行时权限; --abi abi-identifier 为特定 ABI 强制安装 apk,abi-identifier 可以是 armeabi-v7a、arm64-v8a、v86、x86_64 等;
adb install 内部原理简介与步骤说明:

  1. push apk文件到 /data/local/tmp
  2. 调用 pm install 安装
  3. 删除 /data/local/tmp 下对应的apk文件

- 卸载应用

adb uninstall [-k] <package_name>
  • 1

卸载指定包名的应用, <package_name> 表示应用的包名, -k 参数可选,表示卸载应用但保留数据和缓存目录

- 查看应用列表

#查询所有应用
adb shell pm list packages
#查询应用列表的基本命令格式
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
  • 1
  • 2
  • 3
  • 4

列出设备上安装的所有应用程序。
参数说明: -f 显示所有关联的apk文件; -d 只显示disabled的应用; -e 只显示enabled的应用; -s 只显示系统应用; -3 只显示第三方应用; -i 显示引用的install; -u 包含已卸载应用; <FILTER> 包名包含 <FILTER> 字符串

- 查看前台Activity

命令

adb shell dumpsys activity activities | grep mResumedActivity
  • 1

输出示例:

$ dumpsys activity activities | grep mResumedActivity
    mResumedActivity: ActivityRecord{94e5bd4 u0 net.facelib.eam/.MainActivity t934}
  • 1
  • 2

其中 net.facelib.eam/.MainActivity 就是当前处于前台的Activity。
在 Windows 下以上命令可能不可用,可以尝试 adb shell dumpsys activity activities | findstr mResumedActivityadb shell "dumpsys activity activities | grep mResumedActivity"

- 查看正在运行的Services

命令

adb shell dumpsys activity services [<packagename>]
  • 1

<packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
<packagename> 不一定要给出完整的包名,比如运行 adb shell dumpsys activity services org.zhan,那么包名 org.zhan.demo1org.zhan.demo2org.zhan 等相关的 Services 都会列出来

- 查看应用详细信息

命令

adb shell dumpsys package <packagename>
  • 1

输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
<packagename> 表示应用包名

- 查看应用安装路径

命令

adb shell pm path <PACKAGE>
  • 1

输出应用安装路径

- 导出应用数据

adb backup -apk -shared -all -f <path_to_backup.ab>
  • 1

将设备上的应用数据备份为<path_to_backup.ab>文件。

- 文件传输

adb push <local_filepath> <device_filepath>
  • 1

将本地文件复制到设备上。

adb pull <device_filepath> <local_filepath>
  • 1

将设备上的文件复制到本地

- 截屏

adb shell screencap <device_filepath>
adb pull <device_filepath> <local_filepath>
  • 1
  • 2

进行设备截屏,并将截屏图像从设备复制到本地计算机。

- 启动应用/调起Activity

adb shell am start [options] <INTENT>
#启动系统的设置界面
adb shell am start -n com.android.settings/.Settings
  • 1
  • 2
  • 3

[options]参数的选项

参数含义
-a <ACTION>指定 action,比如 android.intent.action.VIEW
-c <CATEGORY>指定 category,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT>指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity

- 强行停止应用

命令

adb shell am force-stop <packagename>
adb shell am force-stop net.facelib.eam
  • 1
  • 2

- 调起/停止Service

#调起Service命令
adb shell am startservice [options] <INTENT>
# adb shell am startservice -n net.facelib.eam/net.facelib.eam.service.ServiceBack
#停用Service命令
adb shell am stopservice [options] <INTENT>
# adb shell am stopservice -n net.facelib.eam/net.facelib.eam.service.ServiceBack
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

- 发送广播

命令

adb shell am broadcast [options] <INTENT>
# 向设备上所有的组件广播,发送 BOOT_COMPLETED 设备启动完毕 的广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

# 向设备中指定的组件广播,只向 net.facelib.eam.module/.receiver.BootBroadcastReceiver 广播 BOOT_COMPLETED
adb shell am broadcast -a android.net.wifi.WIFI_STATE_CHANGED -n net.facelib.eam.module/net.facelib.eam.module.receiver.NetWorkStateReceiver
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

以下是部分系统预定义广播与正常触发时机:

action触发时机
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_CHANGEDWiFi 状态变为启用/关闭/正在启动/正在关闭/未知
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省电模式开启

- 模拟按键/输入

命令

adb shell input [<source>] <command> [<arg>...]

# 模拟按键 HOME 键
adb shell input keyevent 3

# 模拟文本输入
adb shell input text hello,world

# 模拟点击
adb shell input tap 600 600

# 模拟滑动 input swipe [duration(ms)]    (从 100 100 经历300毫秒滑动到 200 200)
adb shell input swipe 100 100 200 200 300 

# 模拟长按操作    (在 100 100 位置长按 1000毫秒)
adb shell input swipe 100 100 100 100  1000 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

模拟长按屏幕

# 命令 input swipe <x1> <y1> <x2> <y2> [duration(ms)]

# 模拟长按操作    (在 200 300 位置长按 1000毫秒)
adb shell input swipe 200 300 200 300  1000 
  • 1
  • 2
  • 3
  • 4

x1,y1x2,y2 分别是两个坐标,duration 是从 x1,y1 处滑动到 x2,y2 处规定的时间。为什么滑动可以模拟长按呢:只要我们两个坐标之间的差值足够小,还在当前这个按钮的范围内,android系统就会认为我们进行了长按某个按钮的操作,当然这只能模拟虚拟按钮,因为实体键我们是没法获取到它的坐标的。

模拟长按按键

# 命令 input keyevent --longpress <键值>

# 模拟长按HOME键
input keyevent --longpress KEYCODE_HOME
  • 1
  • 2
  • 3
  • 4

那这种长按的方式有什么缺点呢:长按时间太短。比如我们要模拟长按电源键呼出关机菜单或者长按切换应用键呼出分屏(android7.0新功能),这种方式长按时间太短。只适用与拖动选择时一开始的长按情况.

keycode含义
3HOME键
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 则让系统休眠

- 查看日志

Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log
命令格式:

[adb] logcat [<option>] ... [<filter-spec>] ...

  • 1
  • 2

例如命令 adb logcat *.W 会将 Warning、Error、Fatal 和 Silent 日志输出。(注: 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W

按级别过滤日志
Android 的日志分为如下几个优先级(priority):

  • V —— Verbose(最低,输出得最多)
  • D —— Debug
  • I —— Info
  • W —— Warning
  • E —— Error
  • F —— Fatal
  • S —— Silent(最高,啥也不输出)
    按某级别过滤日志则会将该级别及以上的日志输出。

安tag和级别过滤日志

adb logcat facelib:I MyApp:D *:S
# 配置日志输出格式    样式: 07-13 18:00:53.440 D/AudioHardwareTiny(  231): close device
adb logcat -v time facelib:I
  • 1
  • 2
  • 3

- 查看设备信息

1. 设备型号

adb shell getprop ro.product.model
  • 1

2. 设备电池状况

adb shell dumpsys battery
  • 1

3. 设备屏幕分辨率

adb shell wm size
  • 1

4. 设备屏幕密度(dpi)

adb shell wm density
  • 1

5. 设备显示屏参数

adb shell dumpsys window displays
  • 1

6. 设备的 android_id

adb shell settings get secure android_id
  • 1

7. 设备IMEI

adb shell dumpsys iphonesubinfo
  • 1

8. 设备的Android系统版本

adb shell getprop ro.build.version.release
  • 1

9. 设备IP地址

adb shell ifconfig | grep Mask
# 获取网络相关的所有数据
adb shell ifconfig
  • 1
  • 2
  • 3

10. 设备Mac地址

adb shell cat /sys/class/net/wlan0/address
  • 1

11. 设备CPU信息

adb shell cat /proc/cpuinfo
  • 1

12. 设备内存信息

adb shell cat /proc/meminfo
  • 1

其中,MemTotal 就是设备的总内存,MemFree 是当前空闲内存

13. 部分硬件与系统属性

设备的更多硬件与系统属性可以通过如下命令查看
  • 1
adb shell cat /system/build.prop
  • 1
属性名含义
ro.build.version.sdkSDK 版本
ro.build.version.releaseAndroid 系统版本
ro.build.version.security_patchAndroid 安全补丁程序级别
ro.product.model型号
ro.product.brand品牌
ro.product.name设备名
ro.product.board处理器型号
ro.product.cpu.abilistCPU 支持的 abi 列表[节注一]
persist.sys.isUsbOtgEnabled是否支持 OTG
dalvik.vm.heapsize每个应用程序的内存上限
ro.sf.lcd_density屏幕密度

节注一:
一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,可以通过 adb shell cat /system/build.prop | grep ro.product.cpu.abi 这样试试:

- 查看连接过的WIFI信息

命令(注: 需要root权限)

adb shell
su
cat /data/misc/wifi/*.conf

# 返回样式
network={
        ssid="618a"
        psk="88888888"
        key_mgmt=WPA-PSK
        priority=1331
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ssid 是我们在WLAN设置里看到的名称, psk 为密码,key_mgmt 为安全加密方式。

- 设置系统日期和时间

命令(注: 需要root权限)

adb shell 
su
date -s 20230714.101000
  • 1
  • 2
  • 3

表示将系统日期和时间更改为 2023年7月14日 10点10分00秒

- 重启设备

命令

adb reboot
  • 1

- 检测设备是否已经root

命令

adb shell
su
  • 1
  • 2

此时命令行提示符为 $ 则表示没有root权限,为 # 则表示已root。

- 使用Monkey进行压力测试

命令

adb shell monkey -p <packagename> -v 500
  • 1

表示想 <packagename> 指定的应用程序发送500个伪随机事件
Monkey的详细用法参考官方文档

- 开启/关闭WIFI

命令(注: 需要root权限)

#开启WIFI
adb root
adb shell svc wifi enable

#关闭WIFI
adb root
adb shell svc wifi disable
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

若执行成功,输出为空,若未取得root权限执行此命令,则输出 killed 表示执行失败。

- 重启设备

命令

# 重启设备
adb reboot

# 重启设备到 Recovery 模式
adb reboot recovery

# 从 Recovery 重启到 Android
adb reboot

# 重启设备到 Fastboot 模式
adb reboot bootloader
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

- 查看进程

命令

adb shell ps
  • 1

输出示例

USER      PID   PPID  VSIZE  RSS   WCHAN            PC  NAME
root      1     0     8140   1688  SyS_epoll_ 0009052c S /init
root      2     0     0      0       kthreadd 00000000 S kthreadd
root      3     2     0      0     smpboot_th 00000000 S ksoftirqd/0
......
system    23205 230   1687996 72596 SyS_epoll_ b36e97a4 S com.android.gallery3d
system    23228 230   1026800 67864 SyS_epoll_ b36e97a4 S com.android.keychain
system    23676 230   1118908 152028 SyS_epoll_ b36e97a4 S com.android.settings
......
u0_a8     29390 230   1029132 71316 SyS_epoll_ b36e97a4 S android.process.media
u0_a86    29399 230   1804772 212588 SyS_epoll_ b36e97a4 S net.facelib.eam
......
root      30527 29383 4544   2044           0 a7b86938 R ps
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

各列表的含义:

列名含义
USER所属用户
PID进程ID
PPID父进程ID
NAME进程名

- 其它命令

命令功能
cat显示文件内容
cd切换目录
chmod改变文件的存取模式/访问权限
df查看磁盘空间使用情况
grep过滤输出
kill杀死指定PID的进程
ls列举目录内容
mount挂载目录的查看和管理
mv移动或重命名文件
ps查看正在运行的进程
rm删除文件
top查看进程的资源占用情况
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/318819
推荐阅读
相关标签
  

闽ICP备14008679号