发送模拟器控制台命令

每个正在运行的虚拟设备都提供一个控制台,让您可以查询和控制模拟设备环境。例如,您可以在应用程序在模拟器上运行时使用控制台来管理端口重定向、网络特性和电话事件。

以下命令要求您已经运行了模拟器。有关运行模拟器的更多信息,请参阅 在 Android 模拟器上运行应用程序从命令行启动模拟器

启动和停止控制台会话

要从终端窗口访问控制台并输入命令,请使用 telnet 连接到控制台端口并提供您的身份验证令牌。每次控制台显示 OK 时,它都已准备好接受命令。没有典型的提示。

要连接到正在运行的虚拟设备的控制台

  1. 打开终端窗口并输入以下命令
  2. telnet localhost console-port

    模拟器窗口标题在单独窗口中运行时会列出控制台端口号,但在工具窗口中运行时不会列出。例如,使用控制台端口 5554 的模拟器的窗口标题可能是 Pixel8_API_34:5554。此外,adb devices 命令会打印正在运行的虚拟设备及其控制台端口号的列表。有关更多信息,请参阅 查询设备

    注意: 模拟器在端口 5554 到 5585 上监听连接,并且只接受来自 localhost 的连接。

  3. 控制台显示 OK 后,输入 auth auth_token 命令。
  4. 在您输入 控制台命令 之前,模拟器控制台需要身份验证。auth_token 必须与您主目录中 .emulator_console_auth_token 文件的内容匹配。

    如果该文件不存在,则 telnet localhost console-port 命令会创建该文件,其中包含一个随机生成的认证令牌。要禁用身份验证,请从 .emulator_console_auth_token 文件中删除令牌,或者如果该文件不存在,则创建一个空文件。

  5. 连接到控制台后,输入 控制台命令
  6. 输入 helphelp commandhelp-verbose 以查看控制台命令列表并了解特定命令。

  7. 要退出控制台会话,请输入 quitexit

以下是一个示例会话

$ telnet localhost 5554
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in
'/Users/me/.emulator_console_auth_token'
OK
auth 123456789ABCdefZ
Android Console: type 'help' for a list of commands
OK
help-verbose
Android console command help:
    help|h|?         Prints a list of commands
    help-verbose     Prints a list of commands with descriptions
    ping             Checks if the emulator is alive
    automation       Manages emulator automation
    event            Simulates hardware events
    geo              Geo-location commands
    gsm              GSM related commands
    cdma             CDMA related commands
    crash            Crashes the emulator instance
    crash-on-exit    Simulates crash on exit for the emulator instance
    kill             Terminates the emulator instance
    restart          Restarts the emulator instance
    network          Manages network settings
    power            Power related commands
    quit|exit        Quits control session
    redir            Manages port redirections
    sms              SMS related commands
    avd              Controls virtual device execution
    qemu             QEMU-specific commands
    sensor           Manages emulator sensors
    physics          Manages physical model
    finger           Manages emulator finger print
    debug            Controls the emulator debug output tags
    rotate           Rotates the screen clockwise by 90 degrees
    screenrecord     Records the emulator's display
    fold             Folds the device
    unfold           Unfolds the device
    multidisplay     Configures the multi-display
    nodraw           turn on/off NoDraw mode. (experimental)
    resize-display   resize the display resolution to the preset size
    virtualscene-image  customize virtualscene image for virtulscene camera
    proxy            manage network proxy server settings
    phonenumber      set phone number for the device


try 'help <command>' for command-specific help
OK
exit
Connection closed by foreign host.

模拟器命令参考

下表描述了模拟器控制台命令及其参数和值

表 1. 模拟器控制台命令

通用命令 描述
avd {stop|start|status|name} 查询、控制和管理虚拟设备,如下所示
  • stop:停止设备执行。
  • start:启动设备执行。
  • status:查询虚拟设备状态,可以是 runningstopped
  • name:查询虚拟设备名称。
avd snapshot {list|save name|load name|delete name} 在快照中保存和恢复设备状态,如下所示
  • list:列出所有已保存的快照。
  • save name:将快照保存为 name
  • load name:加载指定的快照。
  • delete name:删除指定的快照。

以下示例将快照保存为 firstactivitysnapshot

avd snapshot save firstactivitysnapshot
fold 如果设备是可折叠的并且当前处于展开状态,则折叠设备以显示其较小的屏幕配置。
unfold 如果设备是可折叠的并且当前处于折叠状态,则展开设备以显示其较大的屏幕配置。
kill 终止虚拟设备。
ping 检查虚拟设备是否正在运行。
rotate 以 45 度增量逆时针旋转 AVD。
使模拟器崩溃 描述
crash 在应用程序执行期间使模拟器崩溃。
crash-on-exit 当应用程序退出时,使模拟器崩溃。
调试标签 描述
debug tags ...

启用或禁用来自模拟器特定部分的调试消息。 tags 参数必须是执行 emulator -help-debug-tags 时显示的调试标签列表中的值。有关 -help-debug-tags 选项的更多信息,请参见 常用选项 表格。

以下示例启用 radio 标签

debug radio
端口重定向 描述
redir list 列出当前的端口重定向。
redir add protocol:host-port:guest-port 添加新的端口重定向,如下所示
  • protocol:必须是 tcpudp
  • host-port:要在主机上打开的端口号。
  • guest-port:要在模拟器上将数据路由到的端口号。
redir del protocol:host-port 删除端口重定向。
  • protocol:必须是 tcpudp
  • host-port:要在主机上打开的端口号。
地理位置 描述

通过向模拟器发送 GPS 定位,设置运行在模拟器中的应用程序报告的地理位置。

虚拟设备运行后,您可以立即发出以下 geo 命令之一。模拟器通过创建模拟位置提供程序来设置您输入的位置。此提供程序响应应用程序设置的位置监听器,并将位置提供给 LocationManager。任何应用程序都可以通过调用 LocationManager.getLastKnownLocation("gps") 查询位置管理器以获取模拟设备的当前 GPS 定位。

geo fix longitude latitude [altitude] [satellites] [velocity] 向模拟器发送简单的 GPS 定位。以十进制度数指定 longitudelatitude。使用 1 到 12 之间的数字来指定用于确定位置的 satellites 数量,并以米为单位指定 altitude,以节为单位指定 velocity
geo nmea sentence 将 NMEA 0183 语句发送到模拟设备,就好像它是从模拟 GPS 调制解调器发送的。 sentence 以 '$GP' 开头。目前只支持 '$GPGGA' 和 '$GPRCM' 语句。以下示例是一个 GPGGA(全球定位系统定位数据)语句,用于获取 GPS 接收机的时钟、位置和定位数据
geo nmea $GPGGA ,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx
伪造硬件事件 描述
event types 列出所有伪造事件类型。对于具有代码的事件,右侧将列出代码数量(括号内)。

event types
event <type> can be an integer or one of the following aliases:
    EV_SYN
    EV_KEY    (405 code aliases)
    EV_REL    (2 code aliases)
    EV_ABS    (27 code aliases)
    EV_MSC
    EV_SW     (4 code aliases)
    EV_LED
    EV_SND
    EV_REP
    EV_FF
    EV_PWR
    EV_FF_STATUS
    EV_MAX
OK
        

event send types [types ...] 发送一个或多个伪造事件类型。
event codes type 列出指定伪造事件类型的事件代码。
event send type[:code]:[value] [...] 发送一个或多个伪造事件,并带有可选代码和代码值。

要准确地发现要发送的事件,您可以在手动按下模拟器上的按钮时使用 adb 命令。

以下是在按下电源按钮时生成的事件

adb shell getevent -lt

/dev/input/event12: EV_KEY       KEY_POWER            DOWN
/dev/input/event12: EV_SYN       SYN_REPORT           00000000
/dev/input/event12: EV_KEY       KEY_POWER            UP
/dev/input/event12: EV_SYN       SYN_REPORT           00000000
      
例如,要模拟长按电源按钮,请发送两个 EV_KEY 事件以进行键按下和键抬起
event send EV_KEY:KEY_POWER:0
OK
event send EV_KEY:KEY_POWER:1
OK
      

event text message 发送模拟按键的字符字符串。消息必须是 UTF-8 字符串。Unicode 帖子会根据当前设备键盘进行反向映射,不支持的字符会静默丢弃。
电源状态控制 描述
power display 显示电池和充电器状态。
power ac {on|off} 将交流充电状态设置为 onoff
power status {unknown|charging|discharging|not-charging|full} 根据指定更改电池状态。
power present {true|false} 设置电池存在状态。
power health {unknown|good|overheat|dead|overvoltage|failure} 设置电池健康状态。
power capacity percent 将剩余电池容量状态设置为 0 到 100 的百分比。
网络连接状态 描述
network status 检查网络状态以及当前延迟和速度特性。
network delay latency

更改模拟网络延迟。

模拟器允许您模拟各种网络延迟级别,以便您可以在更接近实际运行条件的环境中测试您的应用程序。您可以在模拟器启动时设置延迟级别或范围,或者可以使用控制台在应用程序在模拟器中运行时更改延迟。

网络 latency 的格式如下所示之一(数字为毫秒)

网络延迟格式

  • gprs:GPRS,使用 150 毫秒的最小延迟和 550 毫秒的最大延迟。
  • edge:EDGE/EGPRS,使用 80 毫秒的最小延迟和 400 毫秒的最大延迟。
  • umts:UMTS/3G,使用 35 毫秒的最小延迟和 200 毫秒的最大延迟。
  • none:无延迟。
  • num:模拟以毫秒为单位的指定延迟。
  • min:max:模拟指定的延迟范围。

要在模拟器启动时设置延迟,请使用 -netdelay 模拟器选项 以及支持的 latency 值,如前面的 网络延迟格式 列表中所列。以下是一些示例

emulator -netdelay gprs
emulator -netdelay 40,100

要在模拟器运行时更改网络延迟,请连接到控制台并使用 netdelay 命令以及前面 网络延迟格式 列表中支持的 latency 值。

network delay gprs
network delay 40 100
network speed speed 模拟器允许您模拟各种网络传输速率。

您可以在模拟器启动时设置传输速率或范围,或者可以使用控制台在应用程序在模拟器中运行时更改速率。

网络 speed 的格式如下所示之一(数字为千比特/秒)

网络速度格式

  • gsm:GSM/CSD,使用 14.4 的上传速度和 14.4 的下载速度。
  • hscsd:HSCSD,使用 14.4 的上传速度和 43.2 的下载速度。
  • gprs:GPRS,使用 40.0 的上传速度和 80.0 的下载速度。
  • edge:EDGE/EGPRS,使用 118.4 的上传速度和 236.8 的下载速度。
  • umts:UMTS/3G,使用 128.0 的上传速度和 1920 的下载速度。
  • hsdpa:HSDPA,使用 348.0 的上传速度和 14,400.0 的下载速度。
  • lte:LTE,使用 58,000 的上传速度和 173,000 的下载速度。
  • evdo:EVDO,使用 75,000 的上传速度和 280,000 的下载速度。
  • full:无限速度,但取决于您计算机的连接速度。
  • num:以千比特/秒为单位设置用于上传和下载的精确速率。
  • up:down:分别以千比特/秒为单位设置上传和下载的精确速率。

要在模拟器启动时设置网络速度,请使用 -netspeed 模拟器选项 以及支持的 speed 值,如前面的 网络速度格式 列表中所列。以下是一些示例

emulator -netspeed gsm @Pixel_API_26
emulator -netspeed 14.4,80 @Pixel_API_26

要在模拟器运行时更改网络速度,请连接到控制台并使用 network speed 命令以及前面 网络速度格式 列表中支持的 speed 值。

network speed 14.4 80
network capture {start|stop} file 将数据包发送到文件。以下列表描述了参数和参数值
  • start file:开始将数据包发送到指定文件。
  • stop file:停止将数据包发送到指定文件。
电话模拟 描述
Android 模拟器包含自己的 GSM 和 CDMA 模拟调制解调器,允许您在模拟器中模拟电话功能。例如,使用 GSM,您可以模拟来电以及建立和终止数据连接。使用 CDMA,您需要提供订阅源和首选漫游列表。Android 系统处理模拟电话的方式与处理真实电话的方式完全相同。模拟器不支持通话音频。
gsm {call|accept|cancel|busy} phonenumber 以下为 gsm 参数的描述:
  • call: 模拟来自 phonenumber 的来电。
  • accept: 接受来自 phonenumber 的来电,并将通话状态更改为 active。只有当通话的当前状态为 waitingheld 时,才能将通话状态更改为 active
  • cancel: 终止来自 phonenumber 的来电或拨往 phonenumber 的外呼。
  • busy: 关闭拨往 phonenumber 的外呼,并将通话状态更改为 busy。只有当通话的当前状态为 waiting 时,才能将通话状态更改为 busy
gsm {data|voice} state 命令 data state 用于更改 GPRS 数据连接的状态,命令 data voice state 用于更改 GPRS 语音连接的状态,具体如下:
  • unregistered: 无可用网络。
  • home: 处于本地网络,非漫游状态。
  • roaming: 处于漫游网络。
  • searching: 正在搜索网络。
  • denied: 仅限紧急呼叫。
  • off: 与 unregistered 相同。
  • on: 与 home 相同。
gsm hold 将通话状态更改为 hold。只有当通话的当前状态为 activewaiting 时,才能将通话状态更改为 hold
gsm list 列出所有来电和外呼及其状态。
gsm status 报告当前 GSM 语音/数据状态。值与 voicedata 命令中描述的值相同。
gsm signal {rssi|ber} 更改在接下来的 15 秒更新中报告的信号强度 (rssi) 和误码率 (ber)。以下列出了参数及其值的描述:
  • rssi 范围为 0 到 31,以及 99 表示未知。
  • ber 范围为 0 到 7,以及 99 表示未知。
gsm signal-profile num 设置信号强度配置文件。 num 是 0 到 4 之间的数字。
cdma ssource source 设置当前 CDMA 订阅源,其中 source 是一个基于网络的允许列表,包含 CDMA 运营商的订阅者及其值,具体如下:
  • nv: 从非易失性 RAM 读取订阅。
  • ruim: 从可移除用户身份模块 (RUIM) 读取订阅。
cdma prl_version version 转储当前首选漫游列表 (PRL) 版本。版本号用于包含系统选择和获取过程中使用信息的 PRL 数据库。
管理模拟器上的传感器 描述
这些命令与 AVD 中可用的传感器有关。除了使用 sensor 命令外,您还可以查看和调整模拟器中 **虚拟传感器** 屏幕中 **加速度计** 和 **其他传感器** 选项卡的设置。
sensor status 列出所有传感器及其状态。以下是如何使用 sensor status 命令的示例输出:
sensor get sensor-name 获取 sensor-name 的设置。以下是如何获取加速度传感器的值的示例:
sensor get acceleration
acceleration = 2.23517e-07:9.77631:0.812348

用冒号 (:) 分隔的 acceleration 值指的是虚拟传感器的 x、y 和 z 坐标。

sensor set sensor-name value-x:value-y:value-z 设置 sensor-name 的值。以下是如何将加速度传感器设置为用冒号分隔的 x、y 和 z 值的示例:
sensor set acceleration 2.23517e-07:9.77631:0.812348
SMS 模拟 描述
sms send sender-phone-number textmessage 生成模拟的传入 SMS。以下列出了参数及其值的描述:
  • sender-phone-number: 包含一个任意的数字字符串。
  • textmessage: SMS 消息。

以下是如何向 4085555555 电话号码发送消息“hi there”的示例:

sms send 4085555555 hi there

控制台将 SMS 消息转发到 Android 框架,该框架将其传递到模拟器上处理 SMS 的应用程序(例如“信息”应用程序)。如果您传递 10 个数字,该应用程序会将其格式化为电话号码。更长或更短的数字字符串将按您发送的方式显示。

指纹模拟 描述
finger touch fingerprint-id 模拟手指触摸传感器。
finger remove 模拟手指移除。

有关如何使用这些命令的说明,请参阅以下关于 指纹模拟和验证 的部分。

指纹模拟和验证

图 1. 指纹身份验证屏幕。

使用 finger 命令模拟和验证应用程序的指纹身份验证。您需要 SDK 工具 24.3 或更高版本以及 Android 6.0(API 级别 23)或更高版本。

要模拟和验证指纹身份验证,请按照以下步骤操作:

  1. 如果您还没有指纹 ID,请在模拟器中注册新的指纹,方法是选择 **设置** > **安全** > **指纹**,然后按照注册说明进行操作。
  2. 将应用程序设置为接受 指纹身份验证。完成此设置后,设备将显示指纹身份验证屏幕。
  3. 当您的应用程序显示指纹身份验证屏幕时,转到控制台并输入 finger touch 命令以及您创建的指纹 ID。这将模拟手指触摸。
  4. 然后,输入 finger remove 命令来模拟手指移除。

    您的应用程序应做出响应,就像用户触摸然后从指纹传感器上移开手指一样。