adb shell 命令

实践:

1、

当前用户

Users:
UserInfo{0:name:13} running

其中 **0 ** 表示 user Id, 这条记录表示当前正在运行的帐号的 user id 是0,用户名是 name。

 2、内核日志

dmesg

 3、

查看设置属性

getprop
setprop
setprop test 123
getprop test

 4、查内存

dumpsys meminfo
dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 98764184 Realtime: 98764184

Total PSS by process:
69,505K: system (pid 3089)

 5、执行命令

adb shell ls

acct               init.qcom.class_core.sh    res

bugreports         init.qcom.early_boot.sh    root

cache              init.qcom.factory.rc       sbin

charger            init.qcom.rc               sdcard

config             init.qcom.sh               seapp_contexts

d                  init.qcom.syspart_fixup.sh selinux_version

data               init.qcom.usb.rc           sepolicy

default.prop       init.qcom.usb.sh           service_contexts

dev                init.rc                    storage

etc                init.target.rc             sys

file_contexts.bin  init.usb.configfs.rc       system

firmware           init.usb.rc                tombstones

fstab.qcom         init.zygote32.rc           ueventd.qcom.rc

init               mnt                        ueventd.rc

init.class_main.sh oem                        vendor

init.environ.rc    persist                    verity_key

init.mdm.sh        proc

init.qcom.bms.sh   property_contexts

 

 

 

列出设备上的包

不使用参数:adb shell pm list packages,打印设备/模拟器上的所有软件包

 

使用-f参数:adb shell pm list packages -f,输出包和包相关联的文件

使用-d参数:adb shell pm list packages -d,只输出禁用的包。由于本机禁用没有,输出为空。

使用-e参数:adb shell pm list packages -e,只输出启用的包。

使用-s参数:adb shell pm list packages -s,只输出系统的包。

使用-3参数:adb shell pm list packages -3,只输出第三方的包。

使用-i参数:adb shell pm list packages -i,只输出包和安装信息(安装来源)。

使用-u参数:adb shell pm list packages -u,只输出包和未安装包信息(安装来源)

使用–user参数:adb shell pm list packages --user <USER_ID>,根据用户id查询用户的空间的所有包,USER_ID代表当前连接设备的顺序,从零开始:

使用-e参数且设置过滤条件:adb shell pm list packages -e "browser",只输出启用的包。

 


 

查看启动activity

adb shell dumpsys package 包名

 

 

 

版本
# getprop ro.build.version.release
getprop ro.build.version.release
7.1.2

CPU 硬件

# cat /proc/cpuinfo
cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 1
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 2
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 3
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

Hardware : Qualcomm Technologies, Inc MSM8909
Revision : 0000
Serial : 0000000000000000
Processor : ARMv7 Processor rev 5 (v7l)


以root权限重启adb服务
PS C:\Users\Administrator> adb root
adbd is already running as root
PS C:\Users\Administrator> adb shell
msm8909:/ # pm list users
pm list users
Users:
UserInfo{0:Owner:13} running
msm8909:/ #

 

 

查看设备连接状态

在终端中执行以下命令,查看设备是否成功连接:

  1. adb devices

如果设备连接成功,会显示设备的序列号。

安装 APK 文件

将需要安装的 APK 文件复制到 ADB 工具的目录下,然后使用以下命令安装 APK 文件:

  1. adb install app_name.apk

其中,app_name.apk 是需要安装的 APK 文件名。执行命令后,等待安装完成即可。

查看已安装的应用

使用以下命令查看已安装的应用:

  1. adb shell pm list packages

以上就是使用电脑上的 ADB 工具安装 APK 的教程,希望对您有所帮助。

 

 

Android 调试桥 (adb)  |  Android 开发者  |  Android Developers https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn

Android 调试桥 (adb)

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

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

adb 包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下。如果您需要独立的 Android SDK 平台工具软件包,请点击此处进行下载

如需了解如何通过 adb 连接设备以供使用,包括如何使用 Connection Assistant 来排查常见问题,请参阅在硬件设备上运行应用

adb 的工作原理

当您启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程已在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令。

注意:所有 adb 客户端均使用端口 5037 与 adb 服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接。

每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推。

如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。

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

在设备上启用 adb 调试

如要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 USB 调试(位于开发者选项下)。在 Android 4.2(API 级别 17)及更高版本中,开发者选项屏幕默认处于隐藏状态。如需将其显示出来,请启用开发者选项

现在,您已经可以通过 USB 连接设备了。您可以通过从 android_sdk/platform-tools/ 目录执行 adb devices 来验证设备是否已连接。如果已连接,您将看到设备名称以“设备”形式列出。

注意:当您连接搭载 Android 4.2.2(API 级别 17)或更高版本的设备时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的 RSA 密钥。这种安全机制可以保护用户设备,因为它可以确保用户只有在能够解锁设备并确认对话框的情况下才能执行 USB 调试和其他 adb 命令。

如需详细了解如何通过 USB 连接到设备,请参阅在硬件设备上运行应用

通过 Wi-Fi 连接到设备

注意:以下说明不适用于搭载 Android 11(API 级别 30)的 Wear 设备。如需了解详情,请参阅调试 Wear OS 应用指南。

Android 11(API 级别 30)及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。例如,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。

在开始使用无线调试功能之前,请执行以下操作:

  • 确保您的工作站和设备已连接到同一无线网络。

  • 确保您的设备搭载的是 Android 11(API 级别 30)或更高版本(针对手机),或者 Android 13(API 级别 33)或更高版本(针对 TV 和 WearOS)。如需了解详情,请参阅查看并更新 Android 版本

  • 确保您已安装最新版本的 Android Studio。您可以在此处下载。

  • 在您的工作站上,将 SDK 平台工具更新到最新版本。

如需使用无线调试功能,您必须使用二维码或配对码将设备与工作站配对。您的工作站和设备必须连接到同一无线网络。如需连接到您的设备,请按以下步骤操作:

  1. 在您的设备上启用开发者选项

  2. 打开 Android Studio,然后从运行配置菜单中选择 Pair Devices Using Wi-Fi

    运行配置下拉菜单
    图 1. 运行配置菜单。

    系统会弹出 Pair devices over Wi-Fi 窗口,如图 2 所示。

    “Pair devices over Wi-Fi”弹出式窗口的屏幕截图
    图 2. 使用二维码或配对码配对设备的弹出式窗口。
  3. 在您的设备上,点按无线调试,然后配对您的设备:

    显示“无线调试”系统设置的 Pixel 手机的屏幕截图。
    图 3. Google Pixel 手机上的无线调试设置屏幕截图。
    1. 如需使用二维码配对设备,请选择使用二维码配对设备,然后扫描 Pair devices over Wi-Fi 弹出式窗口中提供的二维码(如图 2 所示)。

    2. 如需使用配对码配对设备,请从 Pair devices over Wi-Fi 弹出式窗口中选择 Pair device with pairing code。在您的设备上,选择使用配对码配对设备,并记下提供的 6 位数配对码。设备显示在 Pair devices over Wi-Fi 窗口中后,您可以选择 Pair,并输入设备上显示的 6 位数配对码。

      PIN 码输入示例的屏幕截图
      图 4. 6 位数配对码输入示例。
  4. 配对设备后,您可以尝试将应用部署到该设备。

    如需与其他设备配对,或在工作站上取消保存当前设备,请在设备上进入无线调试部分,在已配对的设备下点按工作站名称,然后选择取消保存

  5. 如果您想快速开启和关闭无线调试功能,可以利用快捷设置开发者图块进行无线调试(可在开发者选项 > 快捷设置开发者图块中找到)。

    Google Pixel 手机上的快捷设置开发者图块屏幕截图。
    图 5. 快捷设置开发者图块设置可让您快速开启和关闭无线调试功能。

使用命令行连接 Wi-Fi

另外,如果您想在不使用 Android Studio 的情况下,通过命令行连接到您的设备,请按以下步骤操作:

  1. 如前所述,在设备上启用开发者选项。

  2. 如前所述,在设备上启用无线调试

  3. 在工作站上,打开终端窗口并前往 android_sdk/platform-tools

  4. 选择 Pair device with pairing code,找到您的 IP 地址、端口号和配对码。记下设备上显示的 IP 地址、端口号和配对码。

  5. 在工作站的终端上,运行 adb pair ipaddr:port。请使用上述 IP 地址和端口号。

  6. 收到提示时,输入配对码,如下所示。

    通过命令行进行配对的屏幕截图。
    图 6. 表明设备已成功配对的消息。

解决无线连接问题

如果您通过无线方式连接到设备时遇到问题,不妨尝试通过以下问题排查步骤来解决问题。

检查您的工作站和设备是否满足前提条件

检查工作站和设备是否满足本部分开头列出的前提条件。

检查是否存在其他已知问题

下面列出了 Android Studio 中目前已知的无线调试问题及其解决办法:

  • 无法连接到 Wi-Fi:某些 Wi-Fi 网络(如企业 Wi-Fi 网络)可能会阻止点对点连接,并且不让您通过 Wi-Fi 进行连接。请尝试通过网线连接,或连接其他 Wi-Fi 网络。

  • “通过 Wi-Fi 使用 adb”的功能有时会自动关闭:如果设备切换 Wi-Fi 网络或断开网络连接,就可能会发生这种情况。如需解决此问题,请重新连接到网络。

通过 Wi-Fi 连接到设备(Android 10 及更低版本)

注意:以下说明不适用于搭载 Android 10(API 级别 29)或更低版本的 Wear 设备。如需了解详情,请参阅调试 Wear OS 应用指南。

一般情况下,adb 通过 USB 与设备进行通信,但您也可以通过 Wi-Fi 使用 adb。若要连接到搭载 Android 10(API 级别 29)或更低版本的设备,请通过 USB 执行以下初始步骤:

    1. 将 Android 设备和 adb 主机连接到同一 Wi-Fi 网络。

注意:并非所有接入点都适用。您可能需要使用防火墙已正确配置为支持 adb 的接入点。

  1. 使用 USB 线将设备连接到主机。
  2. 设置目标设备以监听端口 5555 上的 TCP/IP 连接:
     
    adb tcpip 5555
    
  3. 拔掉连接目标设备的 USB 线。
  4. 找到 Android 设备的 IP 地址。例如,对于 Nexus 设备,您可以在设置 > 关于平板电脑(或关于手机)> 状态 > IP 地址下找到 IP 地址。
  5. 通过 IP 地址连接到设备:
     
    adb connect device_ip_address:5555
    
  6. 确认主机已连接到目标设备:
     
    $ adb devices
    List of devices attached
    device_ip_address:5555 device
    

您的设备现已连接到 adb

如果与设备的 adb 连接断开:

  • 确保主机仍与 Android 设备连接到同一 Wi-Fi 网络。
  • 通过再次执行 adb connect 步骤重新连接。
  • 如果这样无法解决问题,请重置您的 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 输出中(即使在您的桌面上可以看到该模拟器)。当满足以下所有条件时,就会发生这种情况:

  • adb 服务器未在运行。
  • 您在使用 emulator 命令时,将 -port 或 -ports 选项的端口值设为 5554 到 5584 之间的奇数。
  • 您选择的奇数号端口处于空闲状态,因此可以与指定端口号的端口建立连接,或者该端口处于忙碌状态,模拟器切换到了符合第 2 条中要求的另一个端口。
  • 启动模拟器后才启动 adb 服务器。

避免出现这种情况的一种方法是让模拟器自行选择端口,并且每次运行的模拟器数量不要超过 16 个。另一种方法是始终先启动 adb 服务器,然后再使用 emulator 命令,如下例所示。

示例 1:在下面的命令序列中,adb devices 命令启动了 adb 服务器,但是设备列表未显示。

停止 adb 服务器,然后按照所示顺序输入以下命令。对于 AVD 名称,请提供系统中有效的 AVD 名称。如需获取 AVD 名称列表,请输入 emulator -list-avdsemulator 命令位于 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 命令时必须指定目标设备。如需指定目标设备,请按以下步骤操作:

  1. 使用 devices 命令获取目标设备的序列号。
  2. 获得序列号后,结合使用 -s 选项与 adb 命令来指定序列号。
    1. 如果您要发出很多 adb 命令,可以将 $ANDROID_SERIAL 环境变量设为包含序列号。
    2. 如果您同时使用 -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 选项将命令发送至该硬件设备。

安装应用

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

 
adb install path_to_apk

安装测试 APK 时,必须在 install 命令中使用 -t 选项。如需了解详情,请参阅 -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

如果您尝试确定发送到设备上指定端口的内容,上述做法可能会非常有用。系统会将收到的所有数据写入系统日志记录守护程序,并显示在设备日志中。

将文件复制到设备以及从设备复制文件

您可以使用 pull 和 push 命令将文件复制到设备或从设备复制文件。与 install 命令(仅将 APK 文件复制到特定位置)不同,使用 pull 和 push 命令可将任意目录和文件复制到设备中的任何位置。

如需从设备中复制某个文件或目录(及其子目录),请使用以下命令:

 
adb pull remote local

如需将某个文件或目录(及其子目录)复制到设备,请使用以下命令:

 
adb push local remote

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

 
adb push myfile.txt /sdcard/myfile.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 提供了大多数常见的 Unix 命令行工具。如需查看可用工具的列表,请使用以下命令:

 
adb shell ls /system/bin

对于大多数命令,都可通过 --help 参数获得命令帮助。许多 shell 命令都由 toybox 提供。对于所有 toybox 命令,都可通过 toybox --help 获得适用的一般性帮助。

在 Android 平台工具 23 及更高版本中,adb 处理参数的方式与 ssh(1) 命令相同。这项变更解决了很多命令注入方面的问题,同时让安全执行包含 shell 元字符的命令(如 adb install Let\'sGo.apk)成为可能。此外,这项变更还意味着,对包含 shell 元字符的所有命令的解释也发生了变化。

例如,adb shell setprop key 'value' 现在会返回错误,因为单引号 (') 会被本地 shell 消去,设备看到的是 adb shell setprop key value。如需使该命令正常运行,请引用两次,一次用于本地 shell,另一次用于远程 shell,与处理 ssh(1) 的方法相同。例如 adb shell setprop key 'value

另请参阅 Logcat 命令行工具,该工具对监控系统日志很有用。

调用 activity 管理器

在 adb shell 中,您可以使用 activity 管理器 (am) 工具发出命令以执行各种系统操作,如启动 activity、强行停止进程、广播 intent、修改设备屏幕属性,等等。

在 shell 中,相应的 am 语法为:

 
am command

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

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

表 1. 可用的 activity 管理器命令

命令说明
start [optionsintent 启动由 intent 指定的 Activity

请参阅 intent 参数的规范

具体选项包括:

  • -D:启用调试功能。
  • -W:等待启动完成。
  • --start-profiler file:启动性能分析器并将结果发送至 file
  • -P file:类似于 --start-profiler,但当应用进入空闲状态时剖析停止。
  • -R count:重复启动 activity count 次。在每次重复前,将完成顶层 activity。
  • -S:在启动 activity 前,强行停止目标应用。
  • --opengl-trace:启用 OpenGL 函数的跟踪。
  • --user user_id | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
startservice [optionsintent 启动由 intent 指定的 Service

请参阅 intent 参数的规范

具体选项包括:

  • --user user_id | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
force-stop package 强行停止与 package 关联的所有进程。
kill [optionspackage 终止与 package 关联的所有进程。此命令仅终止可安全终止且不会影响用户体验的进程。

具体选项包括:

  • --user user_id | all | current:指定要终止哪个用户的进程。如果未指定,则终止所有用户的进程。
kill-all 终止所有后台进程。
broadcast [optionsintent 发出广播 intent。

请参阅 intent 参数的规范

具体选项包括:

  • [--user user_id | all | current]:指定要发送给哪个用户;如果未指定,则发送给所有用户。
instrument [optionscomponent 使用 Instrumentation 实例启动监控。通常情况下,目标 component 采用 test_package/runner_class 格式。

具体选项包括:

  • -r:输出原始结果(否则,对 report_key_streamresult 进行解码)。与 [-e perf true] 结合使用可生成性能测量的原始输出。
  • -e name value:将参数 name 设为 value。 对于测试运行程序,通用格式为 -e testrunner_flag value[,value...]
  • -p file:将剖析数据写入 file
  • -w:等待插桩完成后再返回。测试运行程序需要使用此选项。
  • --no-window-animation:运行时关闭窗口动画。
  • --user user_id | current:指定以哪个用户身份运行插桩。如果未指定,则以当前用户身份运行。
profile start process file 启动 process 的性能分析器,将结果写入 file
profile stop process 停止 process 的性能分析器。
dumpheap [optionsprocess file 转储 process 的堆,写入 file

具体选项包括:

  • --user [user_id | current]:提供进程名称时,指定要转储的进程的用户。如果未指定,则使用当前用户。
  • -n:转储原生堆,而非托管堆。
set-debug-app [optionspackage 设置要调试的应用 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

display-density dpi 替换设备显示密度。此命令支持使用低密度屏幕模仿高密度屏幕环境(反之亦然),对于在不同密度的屏幕上测试应用非常有用。

示例:
am display-density 480

to-uri intent 以 URI 的形式输出给定的 intent 规范。

请参阅 intent 参数的规范

to-intent-uri intent 以 intent: URI 的形式输出给定的 intent 规范。

请参阅 intent 参数的规范

intent 参数的规范

对于采用 intent 参数的 activity 管理器命令,您可以使用以下选项指定 intent:

全部显示

调用软件包管理器 (pm)

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

在 shell 中,相应的 pm 语法为:

 
pm command

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

 
adb shell pm uninstall com.example.MyApp

表 2. 可用的软件包管理器命令

命令说明
list packages [optionsfilter 输出所有软件包,或者视需要仅输出软件包名称包含 filter 中文字的软件包。

具体选项:

  • -f:查看关联文件。
  • -d:进行过滤以仅显示已停用的软件包。
  • -e:进行过滤以仅显示已启用的软件包。
  • -s:进行过滤以仅显示系统软件包。
  • -3:进行过滤以仅显示第三方软件包。
  • -i:查看软件包的安装程序。
  • -u:包括已卸载的软件包。
  • --user user_id:要查询的用户空间。
list permission-groups 输出所有已知的权限组。
list permissions [optionsgroup 输出所有已知的权限,或者视需要仅输出 group 中的权限。

具体选项:

  • -g:按组进行整理。
  • -f:输出所有信息。
  • -s:简短摘要。
  • -d:仅列出危险权限。
  • -u:仅列出用户将看到的权限。
list instrumentation [options] 列出所有测试软件包。

具体选项:

  • -f:列出测试软件包的 APK 文件。
  • target_package:仅列出此应用的测试软件包。
list features 输出系统的所有功能。
list libraries 输出当前设备支持的所有库。
list users 输出系统中的所有用户。
path package 输出给定 package 的 APK 的路径。
install [optionspath 将软件包(通过 path 指定)安装到系统。

具体选项:

  • -r:重新安装现有应用,并保留其数据。
  • -t:允许安装测试 APK。仅当您运行或调试了应用或者使用了 Android Studio 的 Build > Build APK 命令时,Gradle 才会生成测试 APK。如果是使用开发者预览版 SDK 构建的 APK,那么安装测试 APK 时必须在 install 命令中包含 -t 选项
  • -i installer_package_name:指定安装程序软件包名称。
  • --install-location location:使用以下某个值设置安装位置:
    • 0:使用默认安装位置。
    • 1:在设备内部存储空间中安装。
    • 2:在外部介质上安装。
  • -f:在内部系统内存上安装软件包。
  • -d:允许版本代码降级。
  • -g:授予应用清单中列出的所有权限。
  • --fastdeploy:通过仅更新已更改的 APK 部分来快速更新安装的软件包。
  • --incremental:仅安装 APK 中启动应用所需的部分,同时在后台流式传输剩余数据。如要使用此功能,您必须为 APK 签名,创建一个 APK 签名方案 v4 文件,并将此文件放在 APK 所在的目录中。只有部分设备支持此功能。此选项会强制 adb 使用该功能,如果该功能不受支持,则会失败,并提供有关失败原因的详细信息。附加 --wait 选项,可等到 APK 完全安装完毕后再授予对 APK 的访问权限。

    --no-incremental 可阻止 adb 使用此功能。

uninstall [optionspackage 从系统中移除软件包。

具体选项:

  • -k:移除软件包后保留数据和缓存目录。
  • --user user_id:指定要为哪位用户移除软件包。
  • --versionCode version_code:仅在应用具有给定的版本代码时卸载。
clear package 删除与软件包关联的所有数据。
enable package_or_component 启用给定的软件包或组件(写为“package/class”)。
disable package_or_component 停用给定的软件包或组件(写为“package/class”)。
disable-user [optionspackage_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 输出设备支持的最大用户数。
get-app-links [options] [package]

输出给定 package 的域名验证状态,如果未指定软件包,则输出所有软件包的域名验证状态。状态代码的定义如下:

  • none:没有为此域名记录任何内容
  • verified:域名已成功通过验证
  • approved:强行批准了域名,通常是通过执行 shell 命令来实现的
  • denied:强行拒绝了域名,通常是通过执行 shell 命令来实现的
  • migrated:从旧响应流程中保留的验证状态
  • restored:从用户数据恢复流程中保留的验证状态
  • legacy_failure:旧版验证程序拒绝了域名,原因未知
  • system_configured:设备配置自动批准了域名
  • >= 1024:设备验证程序专属的自定义错误代码

具体选项包括:

  • --user user_id:包括用户选择的域名。涵盖所有域名,而不仅仅是执行 autoVerify 的域名。
reset-app-links [options] [package]

重置给定软件包的域名验证状态,如果未指定任何软件包,则重置所有软件包的域名验证状态。

  • package:要重置的软件包,如果使用“all”,则重置所有软件包

具体选项包括:

  • --user user_id:包括用户选择的域名。涵盖所有域名,而不仅仅是执行 autoVerify 的域名。
verify-app-links [--re-verify] [package]

广播给定 package 的域名验证请求,如果未指定软件包,则发送所有软件包的域名验证请求。仅当软件包之前未记录响应时发送该请求。

  • --re-verify:即使软件包已记录响应也发送
set-app-links [--package packagestate domains

手动设置软件包的域名状态。仅当软件包将域名声明为 autoVerify 时,此命令才能正常运行。此命令不会针对无法应用的域名报告失败。

  • --package package:要设置的软件包,如果使用“all”,则设置所有软件包
  • state:要为域名设置的代码。有效值为:
    • STATE_NO_RESPONSE (0):按未记录过任何响应的情况进行重置。
    • STATE_SUCCESS (1):将域名视为已成功通过域名验证代理的验证。请注意,域名验证代理可以覆盖此设置。
    • STATE_APPROVED (2):将域名视为一律批准,防止域名验证代理更改状态。
    • STATE_DENIED (3):将域名视为一律拒绝,防止域名验证代理更改状态。
  • domains:要更改的域名的列表(以空格分隔),如果使用“all”,则更改所有域名。
set-app-links-user-selection --user user_id [--package packageenabled domains

手动设置主机用户针对软件包选择的域名的状态。仅当软件包声明相应域名时,此命令才能正常运行。此命令不会针对无法应用的域名报告失败。

  • --user user_id:要更改哪位用户所做的选择
  • --package package:要设置的软件包
  • enabled:是否批准域名
  • domains:要更改的域名的列表(以空格分隔),如果使用“all”,则更改所有域名
set-app-links-user-selection --user user_id [--package packageenabled domains

手动设置主机用户针对软件包选择的域名的状态。仅当软件包声明相应域名时,此命令才能正常运行。此命令不会针对无法应用的域名报告失败。

  • --user user_id:要更改哪位用户所做的选择
  • --package package:要设置的软件包
  • enabled:是否批准域名
  • domains:要更改的域名的列表(以空格分隔),如果使用“all”,则更改所有域名
set-app-links-allowed --user user_id [--package packageallowed

切换软件包的自动验证链接处理设置。

  • --user user_id:要更改哪位用户所做的选择
  • --package package:要设置的软件包,如果使用“all”,则设置所有软件包;如果未指定任何软件包,则重置软件包
  • allowed:值为 true 时,表示允许软件包打开自动验证链接;值为 false 时,表示不允许这么做
get-app-link-owners --user user_id [--package packagedomains

为给定用户输出特定域名的所有者(按优先级从低到高的顺序排列)。

  • --user user_id:要查询的用户
  • --package package:(可选)同时针对软件包声明的所有域名输出结果;如果使用“all”,则针对所有软件包声明的所有域名输出结果
  • domains:要查询的域名的列表(以空格分隔)

调用设备政策管理器 (dpm)

为便于您开发和测试设备管理应用,请向设备政策管理器 (dpm) 工具发出命令。您可以使用该工具控制使用中的管理员应用,或更改设备上的政策状态数据。

 

在 shell 中,相应的 dpm 语法为:

 
dpm command

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

 
adb shell dpm command

表 3. 可用的设备政策管理器命令

命令说明
set-active-admin [optionscomponent 将 component 设为活动管理。

具体选项包括:

  • --user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
set-profile-owner [optionscomponent 将 component 设为活跃管理员,并将其软件包设为现有用户的个人资料所有者。

具体选项包括:

  • --user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
  • --name name:指定简单易懂的组织名称。
set-device-owner [optionscomponent 将 component 设为活跃管理员,并将其软件包设为设备所有者。

具体选项包括:

  • --user user_id:指定目标用户。您也可以传递 --user current 以选择当前用户。
  • --name name:指定简单易懂的组织名称。
remove-active-admin [optionscomponent 停用活跃管理员。应用必须在清单中声明 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 语法为:

 
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 命令是一个用于录制设备(搭载 Android 4.4 [API 级别 19] 及更高版本)显示屏的 shell 实用程序。该实用程序将屏幕 activity 录制为 MPEG-4 文件。您可以使用此文件创建宣传视频或培训视频,或将其用于调试或测试。

在 shell 中,使用以下语法:

 
screenrecord [options] filename

如需从命令行使用 screenrecord,请输入以下命令:

 
adb shell screenrecord /sdcard/demo.mp4

按 Ctrl+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 的设备上录制视频。
  • 某些设备可能无法以它们的本机显示分辨率进行录制。如果在录制屏幕时出现问题,请尝试使用较低的屏幕分辨率。
  • 不支持在录制时旋转屏幕。如果在录制期间屏幕发生了旋转,则部分屏幕内容在录制时将被切断。

表 4. 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) 会收集已安装应用的执行配置文件,这些配置文件用于优化应用性能。您可以检查收集的配置文件,了解在应用启动期间,系统频繁执行了哪些方法和使用了哪些类。

注意:您必须拥有对文件系统的 root 权限(例如在模拟器上),才能检索执行配置文件的文件名。

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

 
adb shell cmd package dump-profiles package

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

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

重置测试设备

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

 
adb shell cmd testharness enable

使用 testharness 恢复设备时,设备会自动将允许通过当前工作站调试设备的 RSA 密钥备份在一个持久性位置。也就是说,在重置设备后,工作站可以继续调试设备并向设备发出 adb 命令,而无需手动注册新密钥。

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

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

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

sqlite

sqlite3 可启动用于检查 SQLite 数据库的 sqlite 命令行程序。它包含用于输出表格内容的 .dump 以及用于输出现有表格的 SQL CREATE 语句的 .schema 等命令。您也可以从命令行执行 SQLite 命令,如下所示:

 
$ adb -s emulator-5554 shell
$ sqlite3 /data/data/com.example.app/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions

注意:您必须拥有对文件系统的 root 权限(例如在模拟器上),才能访问 SQLite 数据库。

如需了解详情,请参阅 sqlite3 命令行文档

 ADB 命令大全 - 知乎 https://zhuanlan.zhihu.com/p/89060003

常用命令用于速查,都是经常需要用到的,没有接触过adb命令从第二节开始看,对每个命令有详细解释。

1. 常用命令:

adb devices #查看连接设备

adb -s cf27456f shell # 指定连接设备使用命令

adb install test.apk # 安装应用

adb install -r demo.apk #安装apk 到sd 卡:

adb uninstall cn.com.test.mobile #卸载应用,需要指定包

adb uninstall -k cn.com.test.mobile #卸载app 但保留数据和缓存文件

adb shell pm list packages #列出手机装的所有app 的包名

adb shell pm list packages -3 #列出除了系统应用的第三方应用包名

adb shell pm clear cn.com.test.mobile #清除应用数据与缓存

adb shell am start -ncn.com.test.mobile/.ui.SplashActivity #启动应用

adb shell dumpsys package #包信息Package Information

adb shell dumpsys meminfo #内存使用情况Memory Usage

adb shell am force-stop cn.com.test.mobile #强制停止应用

adb logcat #查看日志

adb logcat -c #清除log 缓存

adb reboot #重启

adb get-serialno #获取序列号

adb shell getprop ro.build.version.release #查看Android 系统版本

adb shell top -s 10 #查看占用内存前10 的app

adb push <local> <remote> #从本地复制文件到设备

adb pull <remote> <local> #从设备复制文件到本地

adb bugreport #查看bug 报告

adb help #查看ADB 帮助

2.1 连接设备

adb [-d|-e|-s <serialNumber>] <command>

连接指定设备

参数:

-d 指定当前唯一通过USB 连接的Android 设备为命令目标

-e 指定当前唯一运行的模拟器为命令目标

-s <serialNumber> 指定相应serialNumber 号的设备/模拟器为命令目标

command 为所需对设备执行的命令

示例:

$adb devices
List of devices attached
cf263b7f device
emulator-5554 offline
192.168.1.6:5555 device
$adb -s cf263b7f #连接cf264b8f 设备

adb devices 查看已连接的设备信息, 上面已经连接3台设备。

2.2 查看信息

2.2.1 查看版本设备

adb version 查看adb 版本信息

adb devices 查看adb 连接设备

示例:

$adb devices
List of devices attached
1226959f device
3426422f offline

注意:offline 表示设备未连接成功或无响应,device 设备已连接

adb shell getprop ro.product.model 查看设备型号

adb get-serialno 获取设备序列号

adb bugreport 查看bug 报告

adb logcat 查看日志

adb shell wm size 查看屏幕分辨率

adb shell wm density 查看屏幕密度

 

2.2.2 查看应用信息

adb shell pm list packages 列出手机装的所有app 的包名

adb shell pm list packages -s 列出系统应用的所有包名

adb shell pm list packages -3 列出除了系统应用的第三方应用包名

adb shell pm list packages | find "test" win 列出手机装带有的test的包

adb shell pm list packages | grep ‘test’ linux 列出手机装带有的test的包

adb shell cat /sys/class/net/wlan0/address 获取MAC 地址, 根据系统版本参数可能不同

adb shell getprop ro.build.version.release 查看Android 系统版本

adb shell dumpsys activity services [<packagename>] 查看正在运行的Services

<packagename> 参数不是必须的,指定<packagename> 表示查看与某个包名相关的Services,不指定表示查看所有Services。

<packagename> 不一定要给出完整的包名,比如运行adb shell dumpsys activity services org.zhihu,那么包名org.zhihu.demo1、org.zhihu.demo2 和org.zhihu 等相关的Services 都会列出来。

2.3 app 安装和卸载

2.3.1 app 安装:

adb install <apkfile> 参数apkfile 为.apk 文件名称

adb install -r test.apk 保留数据和缓存文件,重新安装apk

adb install -s test.apk 安装apk 到sd 卡

 

2.3.2 app 卸载

adb uninstall <package> 参数package 为软件包名称

示例:

$adb uninstall cn.com.test.mobile
 
#  卸载app 但保留数据和缓存文件
$adb uninstall -k ccn.com.test.mobile 

2.4 启动停止服务

adb start-server

启动adb 服务,基本不会用到,因为只要设备连接正确,会自动启动adb server

adb kill-server

停止adb server

adb -P <port> start-server

指定adb server 的网络端口port (默认为5037)启动服务

2.5 与应用交互

adb shell pm clear <packagename>

清除应用数据与缓存

示例:

$adb shell pm clear cn.com.test.mobile

adb shell am force-stop <packagename>

强制停止应用

示例:强制停止微信

$adb shell am force-stop com.tencent.mm

adb shell am <command>

command 命令详解

command 用途
start [options] <INTENT> 启动 <INTENT> 指定的 Activity
startservice [options] <INTENT> 启动 <INTENT> 指定的 Service
broadcast [options] <INTENT> 发送 <INTENT> 指定的广播
force-stop <packagename> 停止 <packagename> 相关的进程

<INTENT> 参数很灵活,和写 Android 程序时代码里的 Intent 相对应,用于决定 intent 对象的选项如下:

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

2.5.1 启动 Activity

adb shell am start [options] <INTENT>

示例:

 #指定完整 component 名,用于明确指定启动哪个Activity
$adb shell am start -n <COMPONENT>  
#表示调起微信主界面
$adb shell am start -n com.tencent.mm/.ui.LauncherUI  

2.5.2 启动 Service

adb shell am startservice [options] <INTENT>

示例: 表示调起微信的某 Service。

$adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService

2.5.3 发送广播

可以向所有组件广播,也可以只向指定组件广播。

adb shell am broadcast [options] <INTENT>

示例:

#向所有组件广播 BOOT_COMPLETED (开机广播)
$adb shell am broadcast -a android.intent.action.BOOT_COMPLETED   
#如:只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:
$adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver

系统预定义的广播:

Android 系统预定义广播

2.5.4 强制停止应用

adb shell am force-stop <packagename>

示例:

 # 查询出包名
$adb shell pm list packages 
.....
# 强制停止微信
$adb shell am force-stop com.tencent.mm

2.6 文件管理

2.6.1 复制设备里的文件到电脑

adb pull <设备里的文件路径> [电脑上的目录]

示例:

$adb pull /sdcard/abc.mp4  ~/tmp/
小技巧:设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用 adb shell 和 su 命令在 adb shell 里获取 root 权限后,先 cp /path/on/device /sdcard/filename 将文件复制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc。

2.6.2 复制电脑里的文件到设备

adb push <电脑上的文件路径> <设备里的目录>

示例:

$adb push  e:/ss.au3  /data/local/tmp/
小技巧:设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shell 和 su 在 adb shell 里获取 root 权限后,cp /sdcard/filename /path/on/device

2.7 使用ADB命令模拟按键/输入

adb shell input keyevent <keycode>

keycode位操作参数,不同的 keycode 能实现不同的功能

完整的功能见:

keycode 能实现不同的功能,对应的编码如下:

keycode 列表

示例:

$adb shell input keyevent 26  #电源键
$adb shell input keyevent 82  #菜单键
$adb shell input keyevent 3  #HOME 键
$adb shell input keyevent 4 #返回键
$adb shell input keyevent 24 #增加音量
$adb shell input keyevent 25 #降低音量
$adb shell input keyevent 164 #静音
$adb shell input keyevent 85  #播放/暂停
$adb shell input keyevent 86 #停止播放
$adb shell input keyevent 87 #播放下一首
$adb shell input keyevent 88 #播放上一首
$adb shell input keyevent 126 #恢复播放
$adb shell input keyevent 127 #暂停播放
$adb shell input keyevent 224 #点亮屏幕
$adb shell input keyevent 223 #熄灭屏幕
$adb shell input swipe 300 1000 300 500  #滑动解锁,向上滑动手势解锁
#参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标 
$adb shell input text hello #焦点处于某文本框时输入文本

2.8 查看日志

2.8.1 Android 日志

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

按级别过滤日志

按某级别过滤日志则会将该级别及以上的日志输出,Android 日志的优先级如下:

V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出)

示例:输出W之上的日志,W,E,F,S

$adb logcat *:W

按 tag 和级别过滤日志

<filter-spec> 可以由多个 <tag>[:priority] 组成

示例:输出 tag ActivityManager 的 I 以上级别日志,输出tag MyApp的D 以上级别日志,及其它 tag 的 S 级别日志(即屏蔽其它 tag 日志)。

$adb logcat ActivityManager:I MyApp:D *:S

日志格式

adb logcat -v <format>

指定日志输出格式

示例:

$adb logcat -v <format>  指定日志输出格式
$adb logcat -v brief   #默认格式,<priority>/<tag>(<pid>): <message>
$adb logcat -v process #<priority>(<pid>) <message>
$adb logcat -v tag  #<priority>/<tag>: <message>
$adb logcat -v raw  #<message>
$adb logcat -v time  #<datetime> <priority>/<tag>(<pid>): <message>
$adb logcat -v threadtime #<datetime> <pid> <tid> <priority> <tag>: <message>
$adb logcat -v long  #[ <datetime> <pid>:<tid> <priority>/<tag>:] <message>
$adb logcat -v long ActivityManager:I *:S  #指定格式可与上面的过滤同时使用

清空日志

$adb logcat -c

2.8.2 内核日志

$adb shell dmesg  

查看内核日志

2.9 查看设备信息

2.9.1 型号

$adb shell getprop ro.product.model

2.9.2 电池状况

$adb shell dumpsys battery

2.9.3 屏幕分辨率

$adb shell wm size

2.9.4 屏幕密度

$adb shell wm density

2.9.5 显示屏参数

$adb shell dumpsys window displays

2.9.6 android_id

$adb shell settings get secure android_id

2.9.7 IMEI

$adb shell dumpsys iphonesubinfo
#而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):
adb shell
su
$service call iphonesubinfo 1

2.9.8 Android 系统版本

$adb shell getprop ro.build.version.release

2.9.9 IP 地址

$adb shell ifconfig | find Mask$adb shell ifconfig wlan0 #设备连着 WiFi,可以使用如下命令来查看局域网 IP
$adb shell netcfg # 上面两个无结果可以用这个,查看网络连接状态

2.9.10 Mac 地址

$adb shell cat /sys/class/net/wlan0/address # 设备不同可能地址不同

2.9.11 CPU 信息

$adb shell cat /proc/cpuinfo

2.9.12 内存信息

$adb shell cat /proc/meminfo

2.9.13更多硬件与系统属性

$adb shell cat /system/build.prop

adb shell getprop <属性名>

也可以

$adb shell cat /system/build.prop | grep ro.product.cpu.abi
$adb shell cat /system/build.prop | find ro.product.cpu.abi

2.10 修改设置

修改设置之后,运行恢复命令仍然不太正常,可以运行 adb reboot 重启设备或手动重启。

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。

2.10.1分辨率

adb shell wm size 480x1024 #将分辨率修改为 480px * 1024px

adb shell wm size reset #恢复原分辨率

2.10.2屏幕密度

adb shell wm density 160 #屏幕密度修改为 160dpi

adb shell wm density reset #恢复原屏幕密度

2.10.3显示区域

adb shell wm overscan 0,0,0,100

# 四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 100px留白

adb shell wm overscan reset #恢复显示区域

2.10.4 关闭 USB 调试模式

adb shell settings put global adb_enabled 0

使用命令无法恢复调试模式,只能通过手动

2.10.5 状态栏和导航栏的显示隐藏

adb shell settings put global policy_control <key-values>

<key-values> 可由如下几种键及其对应的值组成,格式为 <key1>=<value1>:<key2>=<value2>

key 键对应的值

这些键对应的值可则如下值用逗号组合

示例:

# 设置在所有界面下都同时隐藏状态栏和导航栏
$adb shell settings put global policy_control immersive.full=*

# 设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏。
$adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3

2.11 实用功能

2.11.1屏幕截图

adb exec-out screencap -p > img.png # 老版本无exec-out命令,只适合于新版的截图

adb shell screencap -p /sdcard/img.png # 老版本截图先保存在设备端

adb pull /sdcard/img.png # 通过pull拷贝到本地

screencap 参数:

参数 含义

-p 指定保存文件为 png 格式

-d display-id 指定截图的显示屏编号(有多显示屏的情况下)

2.11.2录制屏幕

# 默认录制时间和最长录制时间都是180s

adb shell screenrecord /sdcard/filename.mp4

screenrecord 参数:

参数 含义

--size WIDTHxHEIGHT 视频的尺寸,比如 1280x720,默认是屏幕分辨率。

--bit-rate RATE 视频的比特率,默认是 4Mbps。

--time-limit TIME 录制时长,单位秒。

--verbose 输出更多信息。

2.11.3 重新挂载 system 分区为可写

注:需要 root 权限

/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写。

步骤:

1.进入 shell 并切换到 root 用户权限。

$adb shell
$su

2.查看当前分区挂载情况。

$mount
输出如下
.....
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mtdblock0 /system ext4 ro,seclabel,relatime,data=ordered 0 0
.......

找到其中我们关注的带 /system 的那一行:

3.重新挂载。

$mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system

2.11.4 查看连接过的 WiFi 密码

注:需要 root 权限

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

2.11.5设置系统日期和时间

注:需要 root 权限

$adb shell
$su
$date -s 20190531.131600  #将系统日期和时间更改为 2019 年 05 月 31 日 13 点 16 分 00 秒。

2.11.6 重启手机

$adb reboot

2.11.7 检测设备是否已 root

$adb shell
$su

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

2.11.8 使用 Monkey 进行压力测试

Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

# 向 <packagename> 指定的应用程序发送 500 个伪随机事件
$adb shell monkey -p <packagename> -v 500

monkey 官方文档 

2.11.9 开启/关闭 WiFi

注:需要 root 权限

开启 WiFi:

$adb root
$adb shell svc wifi enable

关闭 WiFi:

$adb root
$adb shell svc wifi disable

2.12刷机相关命令

注:不要随便操作,没实验过无法保证成功

2.12.1重启到 Recovery 模式

$adb reboot recovery

2.12.2从 Recovery 重启到 Android

$adb reboot

2.12.3重启到 Fastboot 模式

$adb reboot bootloader

2.12.4通过 sideload 更新系统

如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。

以 Recovery 模式下更新为例:

1.重启到 Recovery 模式。

$adb reboot recovery

2.在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。

注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。

3.通过 adb 上传和更新系统。

$adb sideload <path-to-update.zip>

2.13 更多 adb shell 命令

2.13.1查看进程

adb shell ps

2.13.2查看实时资源占用情况

adb shell top

top命令参数如下:

使用方法: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]

-m num 最多显示多少个进程
-n num 刷新多少次后退出
-d num 刷新时间间隔(单位秒,默认值 5)
-s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
-t 显示线程信息
-h 显示帮助文档

2.13.3其它

 指出一个参数错误,
-r:重新安装现有应用,保留其数据。

而不是“安装到sd卡”

指定安装位置则是另一个参数,

--install-location location:使用以下某个值来设置安装位置:
0:使用默认安装位置。
1:在内部设备存储上安装。
2:在外部介质上安装。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

启动流程

建议的设备启动流程如下所示:

启动时验证流程图 1. 启动时验证流程

适用于 A/B 设备的流程

如果设备使用的是 A/B 系统,则启动流程略有不同。必须先使用启动控件 HAL 将要启动的槽位标记为 SUCCESSFUL然后再更新回滚保护 (Rollback Protection) 元数据。

如果平台更新失败(未标记为 SUCCESSFUL),A/B 堆栈便会回退至仍具有先前 Android 版本的另一槽位。不过,如果已设置回滚保护元数据,之前的版本会因回滚保护而无法启动。

将启动时验证状态传达给用户

确定设备的启动状态后,您需要将该状态传达给用户。如果设备没有任何问题,则会继续运行,而不显示任何内容。启动时验证问题分为以下几类:

  • 黄色:针对设有自定义信任根的已锁定设备的警告屏幕
  • 橙色:针对未锁定设备的警告屏幕
  • 红色 (eio):针对 dm-verity 损坏的警告屏幕
  • 红色 (no os found):未找到有效的操作系统

具有自定义信任根的已锁定设备

黄色屏幕示例:

黄色设备警告屏幕

如果设备处于已锁定状态,已设置自定义的信任根,并且映像已使用该自定义信任根进行签名,则会在每次启动时显示黄色屏幕。黄色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭,但设备可能会调暗或关闭显示屏以防烧屏。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

您的设备加载了不同的操作系统。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停

已解锁的设备

橙色屏幕示例:

橙色设备警告屏幕

如果设备处于已解锁状态,则会在每次启动时显示橙色屏幕。橙色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭(设备可能会根据需要调暗和/或关闭显示屏,以防出现烧屏或类似问题)。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

引导加载程序已解锁,无法保证软件完整性。攻击者可能可以获取设备上存储的所有数据。请勿在此设备上存储任何敏感数据。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停。

dm-verity 损坏

红色 eio 屏幕示例:

红色 eio 设备警告屏幕

如果找到 Android 的有效版本,并且设备当前处于 eio dm-verity 模式,则会显示红色 eio 屏幕。用户需要按电源按钮才能继续。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

注意:系统可能会在显示此屏幕后显示其他警告屏幕。例如,如果设备处于 UNLOCKED 状态,则之后会显示橙色屏幕。

建议采用的文本:

您的设备已损坏。该设备不可信任,并且可能无法正常工作。

请在其他设备上访问此链接以了解详情:

g.co/ABH

power_settings_new 按电源按钮即可继续。

找不到有效的操作系统

红色屏幕示例:

红色损坏设备警告屏幕

如果找不到有效的 Android 版本,屏幕会显示红色。设备无法继续启动。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

找不到有效的操作系统。设备无法启动。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可关机。

解锁确认

屏幕示例:

解锁设备警告屏幕

显示一个解锁确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing unlock 命令。初始选中的是“不解锁”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

建议采用的文本:

如果您解锁引导加载程序,则可以在此手机上安装自定义操作系统软件。自定义操作系统未经过与原始操作系统相同级别的测试,可能会导致您的手机和已安装的应用停止正常工作。使用自定义操作系统无法保证软件完整性,因此在引导加载程序处于解锁状态时存储在手机上的所有数据都可能面临风险。

为防止他人未经授权访问您的个人数据,解锁引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否解锁引导加载程序,然后按电源按钮即可继续。

解锁

解锁引导加载程序。

不解锁

不解锁引导加载程序并重启手机。

锁定确认

显示一个锁定确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing lock 命令。初始选中的是“不锁定”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

文本:

如果您锁定引导加载程序,则无法在此手机上安装自定义操作系统软件。为防止他人未经授权访问您的个人数据,锁定引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否锁定引导加载程序,然后按电源按钮即可继续。

锁定

锁定引导加载程序。

不锁定

不锁定引导加载程序并重启手机。

将启动时验证状态传达给 Android

屏幕示例:

锁定确认设备警告屏幕

引导加载程序通过内核命令参数或 bootconfig(从 Android 12 开始)将启动时验证状态传达给 Android。它会将 androidboot.verifiedstate 选项设置为以下其中一个值:

  • green:如果设备处于 LOCKED 状态且未使用可由用户设置的信任根
  • yellow:如果设备处于LOCKED状态且使用了可由用户设置的信任根
  • orange:如果设备处于UNLOCKED状态

androidboot.veritymode 选项设置为 eio 或 restart,具体取决于启动加载程序在处理 dm-verity 错误时所处的状态。如需了解详情,请参阅处理验证错误

posted @ 2023-09-19 16:43  papering  阅读(2783)  评论(0编辑  收藏  举报