Android Debug Bridge(adb)

有些话、适合烂在心里 提交于 2019-12-28 17:39:44

Adb google官方文档翻译,源文档地址如下

https://developer.android.google.cn/studio/command-line/adb

Android Debug Bridge(adb)

Android调试桥(adb)是一种多功能的命令行工具,可让您与设备进行通信。adb命令可促进各种设备操作,例如安装和调试应用程序,并提供对Unix shell的访问,您可使用该shell在设备上运行各种命令。它是一个客户端服务器程序,包括三个组件:

  • 客户端,发送命令。客户端在您的开发计算机上运行。您可以通过发出adb命令从命令行终端调用客户端。
  • 守护程序(adbd),它在设备上运行命令。守护程序在每个设备上作为后台进程运行。
  • 服务器,管理客户端和守护程序之间的通信。服务器在开发计算机上作为后台进程运行。

adb包含在Android SDK平台工具包中。您可以使用SDK Manager下载该软件包,然后将其安装在android_sdk/platform-tools/。或者,如果您需要独立的Android SDK平台工具包,则可以在此处下载

有关连接设备以在ADB上使用的信息,包括如何使用连接助手解决常见问题的信息,请参阅 在硬件设备上运行应用程序

adb 如何工作

启动adb客户端时,客户端首先检查是否已在运行adb服务器进程。如果没有,它将启动服务器进程。服务器启动时,它将绑定到本地TCP端口5037,并侦听从adb客户端发送的命令-所有adb客户端都使用端口5037与adb服务器进行通信。

然后,服务器建立与所有正在运行的设备的连接。它通过扫描5555至5585(前16个模拟器使用的范围)内的奇数端口来定位模拟器。服务器在其中找到adb守护程序(adbd)的地方,将建立与该端口的连接。请注意,每个模拟器都使用一对顺序端口-控制台连接使用偶数端口,adb连接使用奇数端口。例如:

Emulator1,console:5554
Emulator1,adb:5555
Emulator2,console:5556
Emulator2,adb:5557
and so on...

如图所示,在端口5555上连接到adb的模拟器与其控制台在端口5554上监听的模拟器相同。

服务器建立与所有设备的连接后,就可以使用adb命令访问这些设备。由于服务器管理与设备的连接并处理来自多个adb客户端的命令,因此您可以从任何客户端(或脚本)控制任何设备。

要将adb与通过USB连接的设备一起使用,必须在设备系统设置中“ **开发人员选项”**下启用 USB调试

在Android 4.2及更高版本上,默认情况下隐藏“开发人员选项”屏幕。要使其可见,请转到 **“设置”>“关于手机”,**然后点按“ 内部版本号”七次。返回上一个屏幕,在底部找到开发人员选项

在某些设备上,“开发人员选项”屏幕的位置或名称可能不同。

您现在可以使用USB连接设备。您可以验证您的设备已通过执行连接adb devicesandroid_sdk/platform-tools/目录。如果已连接,您将看到设备名称列为“设备”。

**注意:**当您连接运行Android 4.2.2或更高版本的设备时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的RSA密钥。该安全机制保护用户设备,因为它确保除非能够解锁设备并确认对话框,否则无法执行USB调试和其他adb命令。

有关通过USB连接到设备的更多信息,请阅读 在硬件设备上运行应用程序

通过Wi-Fi连接设备

adb通常通过USB与设备通信,但是您也可以在通过USB进行一些初始设置后通过Wi-Fi使用adb,如下所述。但是,如果您是为Wear OS开发的,则应参阅调试Wear OS应用程序的指南 ,其中包含有关将adb与Wi-Fi和蓝牙配合使用的特殊说明。

  1. 将您的Android设备和adb主机连接到可访问的通用Wi-Fi网络。注意并非所有接入点都适用;您可能需要使用其防火墙已正确配置为支持adb的访问点。

  2. 如果您要连接到Wear OS设备,请在与该设备配对的手机上关闭蓝牙。

  3. 用USB电缆将设备连接到主机。

  4. 设置目标设备以侦听端口5555上的TCP / IP连接。

    adb tcpip 5555

  5. 断开USB电缆与目标设备的连接。

  6. 查找Android设备的IP地址。例如,在Nexus设备上,您可以在设置 > 关于平板电脑 (或关于手机)> 状态 > IP地址上找到IP地址。或者,在Wear OS设备上,您可以在设置 > Wi-Fi设置 > 高级 > IP地址上找到IP地址

  7. 通过其IP地址连接到设备。

    adb connect device_ip_address

  8. 确认您的主机已连接到目标设备:

    $ adb devices
    List of devices attached
    device_ip_address:5555 device
    

您现在可以出发了!

如果adb连接曾经丢失:

  1. 确保您的主机仍连接到与Android设备相同的Wi-Fi网络。

  2. 通过adb connect再次执行该步骤来重新连接。

  3. 或者,如果这不起作用,请重置您的adb主机:

    adb kill-server
    

    然后从头开始。

查找设备

在发出adb命令之前,了解哪些设备实例连接到adb服务器很有帮助。您可以使用devices命令生成已连接设备的列表 。

adb devices -l

作为响应,adb为每个设备打印此状态信息:

  • 序列号:adb创建的字符串,用于通过其端口号唯一标识设备。这是一个示例序列号:emulator-5554
  • 状态:设备的连接状态可以是以下之一:
    • offline:设备未连接到adb或没有响应。
    • device:设备现在已连接到adb服务器。请注意,此状态并不表示Android系统已完全启动并可以运行,因为设备仍在启动时连接到adb。但是,启动后,这是设备的正常运行状态。
    • no device:未连接任何设备。
  • 说明:如果包含该-l选项,该devices 命令将告诉您设备是什么。当您连接了多个设备时,此信息很有用,以便您可以区分它们。

以下示例显示了devices命令及其输出。正在运行三个设备。列表中的前两行是模拟器,第三行是连接到计算机的硬件设备。

$ adb devices
List of devices attached
emulator-5556 device product:sdk_google_phone_x86_64 model:Android_SDK_built_for_x86_64 device:generic_x86_64
emulator-5554 device product:sdk_google_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86
0a388e93      device usb:1-1 product:razor model:Nexus_7 device:flo

模拟器没有被列出

adb devices命令具有特殊情况的命令序列,adb devices即使在桌面上可以看到模拟器,该序列也会导致运行中的模拟器不会显示在输出中。当满足以下所有条件时,会发生这种情况:

  1. adb服务器未运行,并且
  2. 您可以将emulator命令与-portor -ports选项一起使用,端口号介于5554和5584之间,并且
  3. 您选择的奇数端口不繁忙,因此可以在指定的端口号进行端口连接;如果繁忙,模拟器将切换到另一个满足2中要求的端口,然后
  4. 启动模拟器后,启动adb服务器。

避免这种情况的一种方法是让模拟器选择自己的端口,并且一次不要运行超过16个模拟器。另一种方法是始终使用emulator命令之前启动adb服务器 ,如以下示例中所述。

**示例1:**按照以下命令序列,该adb devices命令将启动adb服务器,但不会显示设备列表。

停止adb服务器,并按照显示的顺序输入以下命令。对于avd名称,请从系统中提供有效的avd名称。要获取avd名称列表,请输入emulator -list-avds。该emulator命令在android_sdk/tools目录中。

$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5555
$ adb devices

List of devices attached
* daemon not running. starting it now on port 5037 *
* daemon started successfully *

**示例2:**在以下命令序列中,adb devices显示设备列表,因为adb服务器首先启动。

要在adb devices输出中看到模拟器,请停止adb服务器,然后在使用emulator命令之后和使用adb devices命令之前 重新启动它,如下所示:

$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices

List of devices attached
emulator-5557 device

有关模拟器命令行选项的更多信息,请参见《使用命令行参数》

发送指令到特定的设备

如果正在运行多个设备,则在发出adb命令时必须指定目标设备。要指定目标,请使用devices命令获取目标的序列号。获得序列号后,请将该 -s选项与adb命令一起使用以指定序列号。如果要发出很多adb命令,则可以将$ANDROID_SERIAL环境变量设置 为包含序列号。如果同时使用 -s$ANDROID_SERIAL,则-s覆盖 $ANDROID_SERIAL

在以下示例中,将获取已连接设备的列表,然后使用其中一个设备的序列号在该设备上安装该helloWorld.apk设备。

$ adb devices
List of devices attached
emulator-5554 device
emulator-5555 device

$ adb -s emulator-5555 install helloWorld.apk

**注意:**如果在多个设备可用时发出命令而未指定目标设备,则adb会生成错误。

如果您有多个可用的设备,但是只有一个是模拟器,请使用该-e选项将命令发送到模拟器。同样,如果有多个设备,但仅连接了一个硬件设备,请使用该-d选项将命令发送到硬件设备。

安装一个app

您可以使用adb通过以下install命令在模拟器或连接的设备上安装APK :

adb install path_to_apk

安装测试APK时,必须-tinstall命令中使用该选项。有关更多信息,请参见-t

有关如何创建可安装在模拟器/设备实例上的APK文件的更多信息,请参见“ 构建并运行您的应用程序”

请注意,如果您使用的是Android Studio,则无需直接使用adb在模拟器/设备上安装应用程序。相反,Android Studio会为您处理应用程序的打包和安装。

您可以使用该forward命令设置任意端口转发,该端口转发将特定主机端口上的请求转发到设备上的其他端口。下面的示例设置将主机端口6100转发到设备端口7100:

adb forward tcp:6100 tcp:7100

以下示例设置将主机端口6100转发到local:logd:

adb forward tcp:6100 local:logd

拷贝文件到一个设备(从设备中拷贝文件)

使用pullpush命令在设备之间复制文件。与install仅将APK文件复制到特定位置的 命令不同,使用pullpush命令可以将任意目录和文件复制到设备中的任何位置。

要复制一个文件或目录及其子目录设备,做到以下几点:

adb pull remote local

要将文件或目录及其子目录复制设备,请执行以下操作:

adb push local remote

用开发机器(本地)和设备(远程)上的目标文件/目录的路径替换localremote。例如:

adb push foo.txt /sdcard/foo.txt

停止adb 服务

在某些情况下,您可能需要终止adb服务器进程,然后重新启动它以解决问题(例如,如果adb不响应命令)。

要停止adb服务器,请使用adb kill-server命令。然后,您可以通过发出任何其他adb命令来重新启动服务器。

发送adb命令

您可以从开发计算机上的命令行或脚本发出adb命令。用法是:

adb [-d | -e | -s serial_number] command

如果仅运行一个模拟器或仅连接一个设备,则默认情况下将adb命令发送到该设备。如果有多个模拟器运行和/或多个设备连接,你需要使用-d-e-s 选项来指定该命令应针对目标设备。

您可以使用以下命令查看所有受支持的adb命令的详细列表:

adb --help

发送shell命令

您可以使用该shell命令通过adb发出设备命令,或启动交互式Shell。要发出单个命令,请使用如下shell命令:

adb [-d | -e | -s serial_number] shell shell_command

要在设备上启动交互式 shell,请使用以下shell命令:

adb [-d | -e | -s serial_number] shell

要退出交互式 shell,请按Control + D或键入exit

注意:Android Platform-Tools 23及更高版本中,adb的处理方式与ssh(1)命令相同 。这项更改解决了命令注入方面的许多问题, 现在可以安全地执行包含 shell 元字符的命令 ,例如 adb install Let\'sGo.apk。但是,此更改意味着对包含 shell 元字符的任何命令的解释也已更改。例如,该adb shell setprop foo 'a b'命令现在是错误的,因为单引号(')被本地shell吞没,并且设备看到 adb shell setprop foo a b。要使该命令起作用,请两次引用,一次对本地shell,一次对远程shell,与您的操作相同 ssh(1)。例如,adb shell setprop foo "'a b'"

Android提供了大多数常用的Unix命令行工具。有关可用工具的列表,请使用以下命令:

adb shell ls /system/bin

可通过--help参数为大多数命令提供帮助。许多shell命令由toybox提供 。适用于所有toybox命令的一般帮助可通过访问toybox --help

另请参阅Logcat命令行工具,该工具可用于监视系统日志。

调用activity manager (am)

在adb shell中,您可以使用活动管理器(am)工具发出命令以执行各种系统操作,例如启动 activitiy,强制停止process,广播意图,修改设备屏幕属性等等。在 shell 中时,语法为:

am command

您也可以直接从adb发出活动管理器命令,而无需输入远程shell。例如:

adb shell am start -a android.intent.action.VIEW

**表2.**可用的活动管理器命令

命令 描述
start [options] intent 通过指定的 intent 启动一个 Activity
有关意图参数,请参见 规范
选项有:
-D:启用调试。
-W:等待启动完成。
--start-profiler file:启动分析器并将结果发送到 file
-P file:类似于--start-profiler,但是当应用程序空闲时,分析将停止。
-R count:重复活动启动count 时间。在每次重复之前,最重要的活动将完成。
-S:在开始活动之前,强制停止目标应用程序。
--opengl-trace:启用OpenGL功能跟踪。
--user user_id | current: 指定以哪个用户身份运行;如果未指定,则以当前用户身份运行。
startservice [options] intent 通过指定的 intent 启动一个 service
有关意图参数,请参见 规范
选项有:
--user user_id | current: 指定以哪个用户身份运行;如果未指定,则以当前用户身份运行。
force-stop package 强制停止与package(应用程序的程序包名称)关联的所有内容。
kill [options] package 终止与package (应用程序的程序包名称)关联的所有进程。该命令仅杀死可以安全杀死并且不会影响用户体验的进程。
选项有:
--user user_id | all |current: 指定要杀死的进程的用户;所有用户(如果未指定)
kill-all** 杀死所有后台进程。
broadcast [options] intent 发出广播意图。
有关意图参数,请参见 规范
选项有:
--user user_id | all | current: 指定发送给哪个用户;如果未指定,则发送给所有用户。
instrument [options] component 开始使用Instrumentation实例进行监视 。通常,目标component 是表格。 test_package/runner_class
选项有:
-r:打印原始结果(否则解码 report_key_streamresult)。与使用 [-e perf true]产生的性能测量的原始输出。
-e name value:将参数设置namevalue。对于runner,常见形式是。-e testrunner_flag value[,value…]
-p file:将概要分析数据写入file
-w:等待 instrumentation 完成后再返回。测试 runner 必需。
--no-window-animation:运行时关闭窗口动画。
--user user_id | current: 指定运行哪个用户工具;当前用户(如果未指定)。
profile start process file 启动事件探查器process,将结果写入file
profile stop process 停止分析器process
dumpheap [options] process file 转储堆process,写入file
选项有:
--user [user_id | current]:提供进程名称时,指定要转储的进程的用户;如果未指定,则使用当前用户。
-n:转储本机堆而不是托管堆。
set-debug-app [options] package 将应用设置package为调试。
选项有:
-w:在应用启动时等待调试器。
--persistent:保留此值。
clear-debug-app 使用清除软件包先前的设置以进行调试set-debug-app
monitor [options] 开始监视崩溃或ANR。
选项有:
--gdb:在崩溃/ ANR的给定端口上启动gdbserv。
screen-compat {on | off} package 控制屏幕兼容模式package
display-size [reset | widthxheight] 覆盖设备显示大小。此命令通过使用大屏幕设备模仿小屏幕分辨率,有助于跨不同屏幕尺寸测试您的应用,反之亦然。
例:
am display-size 1280x800
to-uri intent 将给定的意图规范打印为URI。
有关意图参数,请参见 规范
to-intent-uri intent 将给定的意图规范打印为intent:URI。
有关意图参数,请参见 规范
``
`` ``

更多 intent 指定参数

对于带有intent参数的活动管理器命令,可以使用以下选项指定意图:

显示所有

-a action

指定意图操作,例如android.intent.action.VIEW。您只能声明一次。

-d data_uri

指定意图数据URI,例如content://contacts/people/1。您只能声明一次。

-t mime_type

指定意图MIME类型,例如image/png。您只能声明一次。

-c category

指定意图类别,例如android.intent.category.APP_CONTACTS

-n component

使用包名称前缀指定组件名称以创建明确的意图,例如com.example.app/.ExampleActivity

-f flags

将标记添加到意图中,如所支持 setFlags()

--esn extra_key

添加一个额外的空值。URI意图不支持此选项。

-e | --es extra_key extra_string_value

将字符串数据添加为键值对。

--ez extra_key extra_boolean_value

将布尔数据添加为键值对。

--ei extra_key extra_int_value

将整数数据添加为键值对。

--el extra_key extra_long_value

将长数据添加为键值对。

--ef extra_key extra_float_value

将浮点数据添加为键值对。

--eu extra_key extra_uri_value

将URI数据添加为键值对。

--ecn extra_key extra_component_name_value

添加一个组件名称,该名称将被转换并作为ComponentName对象传递。

--eia extra_key extra_int_value[,extra_int_value...]

添加一个整数数组。

--ela extra_key extra_long_value[,extra_long_value...]

添加多头数组。

--efa extra_key extra_float_value[,extra_float_value...]

添加一个浮点数数组。

--grant-read-uri-permission

包括标志FLAG_GRANT_READ_URI_PERMISSION

--grant-write-uri-permission

包括标志FLAG_GRANT_WRITE_URI_PERMISSION

--debug-log-resolution

包括标志FLAG_DEBUG_LOG_RESOLUTION

--exclude-stopped-packages

包括标志FLAG_EXCLUDE_STOPPED_PACKAGES

--include-stopped-packages

包括标志FLAG_INCLUDE_STOPPED_PACKAGES

--activity-brought-to-front

包括标志FLAG_ACTIVITY_BROUGHT_TO_FRONT

--activity-clear-top

包括标志FLAG_ACTIVITY_CLEAR_TOP

--activity-clear-when-task-reset

包括标志FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

--activity-exclude-from-recents

包括标志FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

--activity-launched-from-history

包括标志FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

--activity-multiple-task

包括标志FLAG_ACTIVITY_MULTIPLE_TASK

--activity-no-animation

包括标志FLAG_ACTIVITY_NO_ANIMATION

--activity-no-history

包括标志FLAG_ACTIVITY_NO_HISTORY

--activity-no-user-action

包括标志FLAG_ACTIVITY_NO_USER_ACTION

--activity-previous-is-top

包括标志FLAG_ACTIVITY_PREVIOUS_IS_TOP

--activity-reorder-to-front

包括标志FLAG_ACTIVITY_REORDER_TO_FRONT

--activity-reset-task-if-needed

包括标志FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

--activity-single-top

包括标志FLAG_ACTIVITY_SINGLE_TOP

--activity-clear-task

包括标志FLAG_ACTIVITY_CLEAR_TASK

--activity-task-on-home

包括标志FLAG_ACTIVITY_TASK_ON_HOME

--receiver-registered-only

包括标志FLAG_RECEIVER_REGISTERED_ONLY

--receiver-replace-pending

包括标志FLAG_RECEIVER_REPLACE_PENDING

--selector

需要使用-d-t选项来设置意图数据和类型。

URI component package

如果没有上述选项之一,则可以直接指定URI,程序包名称和组件名称。当参数不合格时,如果该参数包含“:”(冒号),则该工具将认为该参数是URI。如果参数包含“ /”(正斜杠),则假定参数是组件名称;否则,假定参数为程序包名称。

调用 package manager (pm)

在adb shell中,您可以使用包管理器(pm)工具发出命令,以对设备上安装的应用包执行操作和查询。在 shell 中时,语法为:

pm 命令

您也可以直接从adb发出软件包管理器命令,而无需输入远程shell。例如:

adb shell pm卸载 com.example.MyApp

**表3.**可用的软件包管理器命令。

命令 描述
list packages [options] filter 打印所有软件包,仅打印软件包名称中包含文本的软件包filter
选项:
-f:请参阅其关联文件。
-d:过滤以仅显示禁用的软件包。
-e:过滤以仅显示已启用的软件包。
-s:过滤以仅显示系统软件包。
-3:过滤以仅显示第三方软件包。
-i:请参阅安装程序以获取软件包。
-u:还包括已卸载的软件包。
--user user_id:要查询的用户空间。
list permission-groups 打印所有已知的权限组。
list permissions [options] group 打印所有已知的权限,可以选择仅打印中的权限group
选项:
-g:按组进行组织。
-f:打印所有信息。
-s: 简短的摘要。
-d:仅列出危险的权限。
-u:仅列出用户将看到的权限。
list instrumentation [options] 列出所有测试包。
选项:
-f:列出测试包的APK文件。
target_package:仅列出此应用的测试包。
list features 打印系统的所有功能。
list libraries 打印当前设备支持的所有库。
list users 打印系统上的所有用户。
path package 打印给定APK的路径package
install [options] path 将软件包(由指定path)安装到系统中。
选项:
-r:重新安装现有应用程序,并保留其数据。
-t:允许安装测试APK。当您仅运行或调试应用程序或使用Android Studio Build> Build APK命令时,Gradle会生成测试APK 。如果APK是使用开发者预览版SDK构建的(如果targetSdkVersion是字母而不是数字),则在安装测试APK时,必须 在命令中包含该 -t选项install
-i installer_package_name:指定安装程序包名称。
--install-location location:使用以下值之一设置安装位置:
- 0:使用默认安装位置
- 1:安装在内部设备存储上
- 2:在外部媒体上安装
-f:在内部系统内存上安装软件包。
-d:允许版本代码降级。
-g:授予应用清单中列出的所有权限。
--fastdeploy:仅通过更新已更改的APK部分来快速更新已安装的软件包。
uninstall [options] package 从系统中删除软件包。
选项:
-k:删除软件包后,保留数据和缓存目录。
clear package 删除与包关联的所有数据。
enable package_or_component 启用给定的包或组件(写为“包/类”)。
disable package_or_component 禁用给定的包或组件(写为“包/类”)。
disable-user [options] package_or_component 选项:
--user user_id:要禁用的用户。
grant package_name permission 向应用授予权限。在运行Android 6.0(API级别23)及更高版本的设备上,该权限可以是应用清单中声明的任何权限。在运行Android 5.1(API级别22)及更低版本的设备上,必须是应用程序定义的可选权限。
revoke package_name permission 撤消应用程序的权限。在运行Android 6.0(API级别23)及更高版本的设备上,该权限可以是应用清单中声明的任何权限。在运行Android 5.1(API级别22)及更低版本的设备上,必须是应用程序定义的可选权限。
set-install-location location 更改默认安装位置。位置值:
- 0:自动:让系统决定最佳位置。
- 1:内部:安装在内部设备存储上。
- 2:外部:在外部媒体上。
**注意:**这仅用于调试;使用此方法可能会导致应用程序崩溃以及其他不良行为。
get-install-location 返回当前安装位置。返回值:
- 0 [auto]:让系统决定最佳位置
- 1 [internal]:安装在内部设备存储上
- 2 [external]:安装在外部媒体上
set-permission-enforced permission [true | false] 指定是否应强制执行给定的权限。
trim-caches desired_free_space 修剪缓存文件以达到给定的可用空间。
create-user user_name 使用给定的名称创建一个新用户,并user_name打印该用户的新用户标识符。
remove-user user_id 删除具有给定用户的用户,并user_id删除与该用户相关联的所有数据
get-max-users 打印设备支持的最大用户数。

调用 device policy manager (dpm)

为了帮助您开发和测试设备管理(或其他企业)应用程序,可以向设备策略管理器(dpm)工具发出命令。使用该工具控制活动的管理应用程序或更改设备上策略的状态数据。在 shell 中时,语法为:

dpm command

您也可以直接从adb发出设备策略管理器命令,而无需输入远程shell:

adb shell dpm command

**表4.**可用的设备策略管理器命令

命令 说明
set-active-admin [options] component 将组件设置为 Active Admin。
具体选项包括:
--user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
set-profile-owner [options] component 将组件设置为 Active Admin,并将其软件包设置为现有用户的配置文件所有者。
具体选项包括:
--user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
--name name:指定简单易懂的组织名称。
set-device-owner [options] component 将组件设置为 Active Admin,并将其软件包设置为设备所有者。
具体选项包括:
--user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
--name name:指定简单易懂的组织名称。
remove-active-admin [options] component 停用 Active Admin。应用必须在清单中声明 android:testOnly。该命令还会移除设备所有者和配置文件所有者。
具体选项包括:
--user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
clear-freeze-period-record 清除设备的之前设置的系统 OTA 更新冻结期记录。在开发管理冻结期的应用时,这有助于避免设备存在调度方面的限制。请参阅管理系统更新
在搭载 Android 9.0(API 级别 28)或更高版本的设备上受支持。
force-network-logs 强制系统让任何现有网络日志随时可供 DPC 检索。如果有可用的连接或 DNS 日志,则 DPC 会收到 onNetworkLogsAvailable() 回调。请参阅网络活动日志
此命令有调用频率限制。在搭载 Android 9.0(API 级别 28)或更高版本的设备上受支持。
force-security-logs 强制系统向 DPC 提供任何现有安全日志。如果有可用的日志,则 DPC 会收到 onSecurityLogsAvailable() 回调。请参阅记录企业设备活动
此命令有调用频率限制。在搭载 Android 9.0(API 级别 28)或更高版本的设备上受支持。

截屏

screencap命令是一个Shell实用程序,用于获取设备显示的屏幕快照。在 shell 中时,语法为:

screencap filename

screencap从命令行使用,请键入以下内容:

adb shell screencap /sdcard/screen.png

这是一个示例屏幕快照会话,使用adb shell捕获屏幕快照,并使用 pull命令从设备下载文件:

 $ adb shell
    shell@ $ screencap /sdcard/screen.png
    shell@ $ exit
    $ adb pull /sdcard/screen.png

录制视频

screenrecord命令是一个Shell实用程序,用于记录运行Android 4.4(API级别19)及更高版本的设备的显示。该实用程序将屏幕活动记录到MPEG-4文件中。您可以使用此文件来创建宣传视频或培训视频,或者用于调试和测试。

在 shell 程序中,使用以下语法:

 screenrecord [options] filename

screenrecord从命令行使用,请键入以下内容:

adb shell screenrecord /sdcard/demo.mp4

通过按Control + C(在Mac上为Command + C)停止屏幕录制;否则,录制会在三分钟或由设置的时间限制时自动停止--time-limit

要开始录制设备屏幕,请运行screenrecord命令以录制视频。然后,运行pull命令以将视频从设备下载到主机。这是一个录制会话示例:

 $ adb shell
    shell@ $ screenrecord --verbose /sdcard/demo.mp4
    (press Control + C to stop)
    shell@ $ exit
    $ adb pull /sdcard/demo.mp4

screenrecord实用程序可以以您请求的任何受支持的分辨率和比特率进行记录,同时保留设备显示屏的纵横比。该实用程序默认以原始显示分辨率和方向进行记录,最长为三分钟。

screenrecord实用程序的局限性:

  • 音频未与视频文件记录在一起。
  • 视频记录不适用于运行Wear OS的设备。
  • 某些设备可能无法以其原始显示分辨率进行记录。如果屏幕录制遇到问题,请尝试使用较低的屏幕分辨率。
  • 不支持在录制过程中旋转屏幕。如果在录制过程中屏幕确实旋转,则录制过程中某些屏幕被切掉。

表5. screenrecord选项

选项 说明
–help 显示命令语法和选项
–size widthxheight 设置视频大小:1280x720。默认值是设备的本机显示分辨率(如果支持);如果不支持,则使用 1280x720。为获得最佳效果,请使用设备的 Advanced Video Coding (AVC) 编码器支持的大小。
–bit-rate rate 设置视频的视频比特率(以 MB/秒为单位)。默认值为 4Mbps。您可以增加比特率以提升视频品质,但这么做会导致视频文件变大。下面的示例将录制比特率设为 6Mbps:
screenrecord --bit-rate 6000000 /sdcard/demo.mp4
–time-limit time 设置最大录制时长(以秒为单位)。默认值和最大值均为 180(3 分钟)。
–rotate 将输出旋转 90 度。此功能处于实验阶段。
–verbose 在命令行屏幕显示日志信息。如果您不设置此选项,则该实用程序在运行时不会显示任何信息

读取应用的 ART 配置文件

从Android 7.0(API级别24)开始,Android运行时(ART)收集已安装应用程序的执行配置文件,这些配置文件用于优化应用程序性能。您可能需要检查收集的配置文件,以了解确定哪些方法经常执行以及在应用程序启动期间使用了哪些类。

要生成配置文件信息的文本形式,请使用以下命令:

    adb shell cmd package dump-profiles package

要检索生成的文件,请使用:

adb pull /data/misc/profman/package.txt

重置测试设备

如果您在多个测试设备上测试应用程序,则在两次测试之间重置设备可能很有用,例如,删除用户数据并重置测试环境。您可以使用testharnessadb shell命令对运行Android 10(API级别29)或更高版本的测试设备执行出厂重置 ,如下所示。

adb shell cmd testharness enable

使用还原设备时testharness,设备会自动备份RSA密钥,该密钥可在持久位置中通过当前工作站进行调试。也就是说,在重置设备后,工作站可以继续调试并向设备发出adb命令,而无需手动注册新密钥。

此外,为了帮助您更轻松,更安全地继续测试您的应用,使用 testharness还原设备还会更改以下设备设置:

  • 设备会设置某些系统设置,因此不会出现初始设备设置向导。也就是说,设备进入一种状态,您可以从中快速安装,调试和测试您的应用程序。
  • 设定:
    • 禁用锁屏
    • 禁用紧急警报
    • 禁用帐户自动同步
    • 禁用自动系统更新
  • 其他:
    • 禁用预装的安全应用程序

如果您的应用需要检测并适应testharness 命令的默认设置,则可以使用 。 ActivityManager.isRunningInUserTestHarness()

其他shell命令

如需所有可用 shell 程序的列表,请使用以下命令:

adb shell ls /system/bin

大多数命令都提供帮助说明。

下表列出了一些比较常用的 adb shell 命令。

表 6. 一些其他 adb shell 命令

Shell 命令 说明
dumpsys 将系统数据转储到屏幕。要详细了解此命令行工具,请阅读 dumpsys
dumpstate 将状态转储到文件。
logcat [option]… [filter-spec]… 启用系统和应用日志记录,并将输出显示到屏幕上。另请参阅 Logcat 命令行工具
dmesg 将内核调试消息输出到屏幕。
start 启动(重启)设备。
stop 停止执行设备。
sqlite3 启动 sqlite3 命令行程序。
sqlite3 工具包含用于输出表格内容的 .dump 以及用于输出现有表格的 SQL CREATE 语句的 .schema 等命令。您也可以随时执行 SQLite 命令。
SQLite3 数据库存储在文件夹 /data/data/package_name/databases/ 中。
例如:
$ adb -s emulator -5554 shelll
$ sqlite3 /data/data/com.example.app/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions

要了解详情,请参阅[sqlite3 命令行文档](
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!