发送模拟器控制台命令

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

以下命令要求您有正在运行的模拟器。如需详细了解如何运行模拟器,请参阅在 Android 模拟器上运行应用从命令行启动模拟器

启动和停止控制台会话

如需访问控制台并输入命令,请从终端窗口中使用 telnet 连接到控制台端口,并提供您的身份验证令牌。每当控制台显示 OK 时,表明它已可以开始接受命令。它没有通常那种提示符。

如需连接到正在运行的虚拟设备的控制台,请执行以下操作:

  1. 打开终端窗口并输入以下命令:

    telnet localhost console-port
    

    模拟器窗口标题会列出在单独的窗口中运行时的控制台端口号,而不是在工具窗口中运行时的控制台端口号。例如,使用控制台端口 5554 的模拟器的窗口标题可以是 Pixel8_API_34:5554。此外,adb devices 命令也会输出正在运行的虚拟设备及其控制台端口号的列表。如需了解详情,请参阅查询设备

    注意:模拟器会监听端口 5554 到 5585 上的连接,并且仅接受来自本地主机的连接。

  2. 控制台显示 OK 后,输入 auth auth_token 命令。

    在您可以输入控制台命令之前,模拟器控制台会要求您进行身份验证。auth_token 必须与主目录中 .emulator_console_auth_token 文件的内容相符。

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

  3. 连接到控制台后,输入控制台命令

    输入 helphelp commandhelp-verbose 可查看控制台命令的列表并了解特定的命令。

  4. 如要退出控制台会话,请输入 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  (ethernet and cellular only)
    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.

即发即弃命令

如果您不需要会话保持打开状态,请使用 adb emu 快捷键,该快捷键会执行命令并立即将控制权返回给调用 shell:

adb emu command commandParameter

使用 adb emu 进行调用会连接到可用的模拟器。如果您同时运行多个模拟器,则必须传入目标模拟器的序列号:

adb -s emulator-serial emu command commandParameter

模拟器命令参考

以下列表介绍了模拟器控制台命令及其参数和值:

常规命令

  • avd {stop| start| status| name} 查询、控制和管理虚拟设备,具体说明如下:

    • stop:停止设备的执行。
    • start:开始设备的执行。
    • status:查询虚拟设备状态,可以是 running 或 stopped。
    • name:查询虚拟设备名称。
  • avd snapshot {list| save name| load name| delete name} 利用快照保存和恢复设备状态,具体说明如下:

    • list:列出所有已保存的快照。
    • 保存名称:将快照另存为指定名称。
    • load name:加载指定快照。
    • delete name:删除指定快照。

    以下示例以 firstactivitysnapshot 作为名称保存快照:

    avd snapshot save firstactivitysnapshot
    
  • fold:折叠设备以显示其较小的屏幕配置(如果设备可折叠且当前处于展开状态)。

  • 展开:展开设备以显示其较大的屏幕配置(如果设备可折叠且当前处于折叠状态)。

  • kill:终止虚拟设备。

  • ping:检查虚拟设备是否正在运行。

  • 旋转:以 45 度的增量逆时针旋转 AVD。

使模拟器崩溃

  • crash:在应用执行过程中使模拟器崩溃。

  • crash-on-exit:在应用退出时使模拟器崩溃。

调试标记

  • 调试标记 …:启用或停用来自模拟器特定部分的调试消息。“tags”参数的值必须来自执行 emulator -help-debug-tags 时显示的调试标记列表中。如需详细了解 -help-debug-tags 选项,请参阅常用选项表格。以下示例启用了 radio 标记:

    debug radio
    

端口重定向

  • redir list:列出当前端口重定向。

  • redir add protocol:host-port:guest-port 添加新的端口重定向,具体说明如下:

    • 协议:必须是 tcp 或 udp。
    • host-port:要在主机上打开的端口号。
    • guest-port:要在模拟器上将数据传输到的端口号。
  • redir del protocol:host-port 删除端口重定向。

    • 协议:必须是 tcp 或 udp。
    • host-port:要在主机上打开的端口号。

地理位置

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

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

  • geo fix longitude latitude [altitude] [satellites] [velocity]:向模拟器发送简单的 GPS 定位。以十进制度为单位指定经度和纬度。使用 1 到 12 之间的数字指定用于确定位置的卫星数量,并以米为单位指定海拔高度,以节为单位指定速度。

  • geo nmea 语句:向模拟设备发送 NMEA 0183 语句,就像是从模拟的 GPS 调制解调器发送的一样。让句子以“$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 <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 type[:code]:[value] […]:发送一个或多个虚假事件以及可选的代码和代码值。

EV_KEY - 键代码参考

EV_KEY 事件类型用于模拟按钮的按下和松开操作。下表将支持的众多键代码划分为逻辑类别。对于每个键代码,调度值 1 会模拟按键,而值 0 会模拟松开按键。值 2 表示按键重复。

子表 A:Android 系统键
代码 说明
KEY_HOME 主屏幕按钮触发器
KEY_BACK 返回按钮触发器
KEY_MENU 菜单(溢出)按钮
KEY_POWER 电源按钮(按一下/长按)
KEY_VOLUMEUP 音量调高按钮触发器
KEY_VOLUMEDOWN “音量调低按钮”触发器
KEY_CAMERA 实体相机快门按钮
KEY_FOCUS 相机自动对焦快门
KEY_SEARCH 搜索按钮触发器
KEY_SLEEP 睡眠指令触发器
KEY_WAKEUP 唤醒指令触发器
KEY_NOTIFICATION 打开通知抽屉
KEY_MUTE 将系统音频输出设为静音
KEY_MICMUTE 将麦克风输入静音
KEY_BRIGHTNESSDOWN 调低显示屏亮度
KEY_BRIGHTNESSUP 调高显示屏亮度
KEY_PHONE 打开默认的拨号器应用
KEY_SEND 发送或发起电话
KEY_HEADSETHOOK 耳机挂钩(接听/挂断)
KEY_SCREEN 屏保激活命令
KEY_CONFIG 配置系统菜单
KEY_SWITCHVIDEOMODE 切换系统视频模式
KEY_KBDILLUMTOGGLE 切换键盘背光
子表 B:媒体和播放控制
代码 说明
KEY_PLAYPAUSE 切换播放和暂停状态
KEY_PLAY 启动媒体播放
KEY_PAUSECD 暂停播放 CD
KEY_STOPCD 停止播放 CD
KEY_NEXTSONG 跳至下一首曲目
KEY_PREVIOUSSONG 跳到上一首曲目
KEY_REWIND 回放当前轨道
KEY_FASTFORWARD 快进活跃轨道
KEY_RECORD 记录触发命令
KEY_SHUFFLE 切换为随机播放
KEY_REPEAT 切换循环播放模式
KEY_MEDIA 媒体键触发器
子表 C:导航和通用键盘
代码 说明
KEY_UP 向上方向键方向
KEY_DOWN 向下方向键方向
KEY_LEFT 向左方向键
KEY_RIGHT 向右方向键方向
KEY_PAGEUP 向上翻页导航
KEY_PAGEDOWN 向下翻页导航
KEY_INSERT 插入按键触发器
KEY_DELETE 删除按键触发器
KEY_ENTER 输入键触发器
KEY_ESC Escape 键触发器
KEY_TAB Tab 键触发器
KEY_SPACE 空格键触发器
KEY_BACKSPACE 退格键触发器
KEY_CLEAR 清除输入缓冲区
KEY_CANCEL 取消有效操作
KEY_OK 确认/确定选择
KEY_SELECT 选择内容触发器
KEY_GOTO 前往指定地点
KEY_HELP 访问帮助上下文
子表 D:字母数字和键盘符号
  • 标准字母KEY_AKEY_Z(26 个代码)。
  • 数字键盘键KEY_1KEY_0(10 个代码)。
代码 字符符号
KEY_COMMA ,
KEY_DOT .
KEY_SLASH /
KEY_SEMICOLON ;
KEY_APOSTROPHE '
KEY_GRAVE \`
KEY_MINUS -
KEY_EQUAL =
KEY_LEFTBRACE [
KEY_RIGHTBRACE ]
KEY_BACKSLASH \
KEY_KPASTERISK *(数字键盘)
KEY_KPPLUS +(数字键盘)
KEY_KPMINUS -(数字键盘)
KEY_KPDOT .(数字键盘)
KEY_KPSLASH /(数字键盘)
KEY_KPENTER Enter(数字键盘)
KEY_KPEQUAL =(数字键盘)
KEY_KPCOMMA ,(数字键盘)
KEY_KPJPCOMMA ,(日语布局)
KEY_KPLEFTPAREN ((数字键盘)
KEY_KPRIGHTPAREN )(数字键盘)
KEY_KPPLUSMINUS ±(数字键盘)
子表 E:辅助键和功能键
  • 标准功能键KEY_F1KEY_F24(24 个代码)。
代码 说明
KEY_LEFTSHIFT 左 Shift 键盘修饰键
KEY_RIGHTSHIFT 右 Shift 键盘修饰键
KEY_LEFTCTRL 左 Ctrl 键盘修饰键
KEY_RIGHTCTRL 右 Ctrl 键键盘修饰键
KEY_LEFTALT 左 Alt 键盘修饰键
KEY_RIGHTALT 右 Alt 键盘辅助键
KEY_LEFTMETA 左 Meta/Command 键
KEY_RIGHTMETA 右 Meta/Command 键
KEY_CAPSLOCK Caps Lock 键盘切换开关
KEY_NUMLOCK Num Lock 键盘切换开关
KEY_SCROLLLOCK Scroll Lock 键盘切换开关
KEY_COMPOSE Compose 字符助手
KEY_FN 实体键盘 FN 键
KEY_FN_ESC 功能键组合
KEY_FN_1 特殊功能快捷键 1
KEY_FN_2 特殊功能快捷键 2
KEY_FN_D 特殊功能快捷键 D
KEY_FN_E 特殊功能快捷键 E
KEY_FN_F 特殊功能快捷键 F
KEY_FN_S 特殊功能快捷键 S
KEY_FN_B 特殊功能快捷键 B
子表 F:游戏手柄和操纵杆
代码 说明
BTN_A / BTN_B / BTN_C 控制器盘面按钮 A/B/C
BTN_X / BTN_Y / BTN_Z 控制器正面按钮 X/Y/Z
BTN_START 游戏手柄“开始”菜单按钮
BTN_SELECT 游戏手柄“选择”按钮
BTN_MODE 控制器模式开关
BTN_TL/BTN_TR 左 / 右肩部按钮
BTN_TL2/BTN_TR2 左 / 右模拟扳机
BTN_THUMBL/BTN_THUMBR 按左 / 右侧摇杆
BTN_DPAD_UP 游戏手柄向上方向键触发器
BTN_DPAD_DOWN 游戏手柄方向键向下触发器
BTN_DPAD_LEFT 游戏手柄向左方向键触发器
BTN_DPAD_RIGHT 游戏手柄向右方向键触发器
BTN_THUMB 操纵杆主拇指触发器
BTN_TOP/BTN_TOP2 操纵杆上方的顶部按钮
BTN_PINKIE 操纵杆小指按钮触发器
BTN_BASE_BASE6 操纵杆平台基本按钮
BTN_DEAD 非活跃的游戏手柄死区标志
BTN_TRIGGER 实体操纵杆手部触发器
BTN_JOYSTICK 通用操纵杆输入代码
子表 G:鼠标、触控和触控笔输入
代码 说明
BTN_MOUSE 一般鼠标指针事件
BTN_LEFT 点击鼠标左键
BTN_RIGHT 点击鼠标右键
BTN_MIDDLE 点击鼠标中键滚轮
BTN_SIDE 导航侧边键触发器
BTN_EXTRA 额外鼠标按键触发器
BTN_FORWARD 点击浏览器前进按钮
BTN_BACK 点击浏览器后退导航
BTN_TASK 系统任务切换器键
BTN_TOUCH 检测到屏幕物理接触
BTN_STYLUS 主动式触控笔接近度
BTN_STYLUS2 触控笔上的辅助笔杆开关
BTN_TOOL_PEN 触控笔工具标识符
BTN_TOOL_RUBBER 触控笔橡皮擦工具标识符
BTN_TOOL_BRUSH Painter 画笔工具标识符
BTN_TOOL_PENCIL 绘图铅笔工具标识符
BTN_TOOL_AIRBRUSH 喷枪彩绘工具标识符
BTN_TOOL_FINGER 触摸屏手指接触
BTN_TOOL_MOUSE 外部鼠标工具标识符
BTN_TOOL_LENS 光学放大镜工具
BTN_TOOL_DOUBLETAP 手势点按两次速度标志
BTN_TOOL_TRIPLETAP 手势点按三次速度标志
子表 H:应用快捷方式
代码 目标操作
KEY_WWW 启动默认网络浏览器
KEY_MAIL 打开默认电子邮件客户端
KEY_BOOKMARKS 打开浏览器书签列表
KEY_CALC 打开计算器实用工具
KEY_FILE 打开本地文件资源管理器
KEY_EDIT 文档编辑触发器
KEY_NEW 文档创建新触发器
KEY_OPEN 文档打开触发器
KEY_SAVE 文件保存任务触发器
KEY_CLOSE 文件关闭任务触发器
KEY_PRINT 文件打印任务触发器
KEY_COPY 剪贴板缓冲区复制操作
KEY_PASTE 剪贴板缓冲区插入操作
KEY_CUT 剪贴板缓冲区剪切操作
KEY_UNDO 剪贴板缓冲区撤消操作
KEY_REDO 剪贴板缓冲区重做操作
KEY_CANCEL 缓冲取消流程触发器
KEY_FIND 文档搜索实用程序
KEY_REFRESH 文档刷新实用程序
KEY_EXIT 文档关闭实用程序
KEY_DOCUMENTS 发布了系统文档门户
KEY_HOMEPAGE 启动首页浏览器
KEY_FAVORITES 打开浏览器收藏夹门户
KEY_CHAT 启动即时通讯工具
KEY_EMAIL 备用邮箱启用触发器
KEY_FINANCE 打开股票/金融实用程序
KEY_SPORT 打开运动追踪实用程序
KEY_SHOP 打开数字购物门户网站
KEY_PLAYER 打开主要媒体播放器
KEY_MP3 打开主 MP3 播放器
KEY_TEXT 打开默认文本编辑器
KEY_LIST 打开核对清单实用程序
KEY_MEMO 打开记事本 / 备忘录实用程序
KEY_CALENDAR 打开日历 / 日程门户
KEY_DIRECTORY 打开系统地址目录
KEY_COMPUTER 打开规范探索器
KEY_TV/KEY_TV2 启动电视门户
KEY_RADIO 启动无线装置实用程序
KEY_CD/KEY_DVD 激活光盘驱动器读取器
KEY_AUDIO/KEY_VIDEO 访问媒体规范
KEY_TUNER 配置接收器/调谐器
KEY_SAT/KEY_SAT2 配置卫星 Feed
KEY_TAPE 播放磁带媒体播放器
KEY_VCR 播放 VCR 播放器 Feed
KEY_VCR2 播放 VCR 2 播放器 Feed
KEY_AUX 辅助媒体端口输入
KEY_SETUP 设置配置菜单
KEY_PROG1_PROG4 用户定义的程序键
KEY_ZOOM 缩放视口切换开关
KEY_MODE 视口模式选择
KEY_KEYBOARD 显示/隐藏虚拟键盘
KEY_LANGUAGE 切换音轨语言
KEY_TITLE 打开媒体标题选项
KEY_SUBTITLE 切换字幕界面
KEY_ANGLE 更改视频拍摄角度
KEY_EPG 打开电子收视指南
KEY_PVR 打开个人视频录制器
KEY_MHP 开放式多媒体家庭平台
KEY_CHANNEL 打开电视调谐器频道
KEY_CHANNELUP 向上调电视频道
KEY_CHANNELDOWN 向下调电视频道
KEY_RED 红色互动按钮
KEY_GREEN 绿色互动按钮
KEY_YELLOW 黄色互动按钮
KEY_BLUE 蓝色互动按钮
KEY_FIRST 选择第一个商品选项
KEY_LAST 选择最后一项推荐项
KEY_NEXT 选择下一个轨道选项
KEY_PREVIOUS 选择上一个轨道选项
KEY_RESTART 重新开始媒体轨道循环
KEY_SLOW 慢动作播放选项
KEY_AB A-B 重复序列循环
KEY_PLAYCD CD 卡座播放命令
KEY_PAUSECD CD 播放器暂停命令
KEY_STOPCD CD 播放器停止命令
KEY_DIGITS 数字键盘输入命令
KEY_TEEN 键盘青少年值选项
KEY_TWEN 小键盘 twen 值选项
KEY_DEL_EOL 删除到行缓冲区末尾
KEY_DEL_EOS 删除到屏幕缓冲区的末尾
KEY_INS_LINE 插入新行缓冲区
KEY_BRL_DOT1_DOT8 盲文显示屏按钮输入
KEY_VOICECOMMAND 启动语音助理应用
KEY_SELECTIVE_SCREEN 触发区域屏幕截图
KEY_BATTERY 查询电池通知
KEY_STAR/KEY_SHARP 电话键盘符号
KEY_PLUS 电话键盘加号
KEY_INFO 显示信息面板叠加层
KEY_TIME 显示当前时钟时间
KEY_VENDOR 查询供应商规范
KEY_ARCHIVE 打开本地归档实用程序
KEY_PROGRAM 配置程序参数
KEY_POWER2 触发备用电源

EV_ABS - 绝对运动事件

EV_ABS 事件类型对于模拟精确的触摸、拖放手势、多点触控捏合操作和操纵杆调整至关重要。下表中的绝对坐标直接对应于底层物理屏幕分辨率。

代码 坐标范围 说明
ABS_MT_TRACKING_ID -1≥0 跟踪 ID;-1 结束触控
ABS_MT_POSITION_X 01767 X 坐标 (Pixel Fold)
ABS_MT_POSITION_Y 02207 Y 坐标 (Pixel Fold)
ABS_MT_TOUCH_MAJOR 像素 触摸区域主轴宽度
ABS_MT_TOUCH_MINOR 像素 触摸区域短轴宽度
ABS_MT_WIDTH_MAJOR 像素 工具主轴宽度
ABS_MT_WIDTH_MINOR 像素 工具短轴宽度
ABS_MT_ORIENTATION 0255 接触方向角度
ABS_MT_PRESSURE 0255 接触力大小
ABS_MT_DISTANCE mm 悬停距离(与屏幕的距离)
ABS_MT_TOOL_TYPE 02 0=手指,1=触控笔,2=铅笔
ABS_MT_BLOB_ID 整数 联系人 blob 标识符
ABS_MT_TOOL_X 像素 工具 X 位置坐标
ABS_MT_TOOL_Y 像素 工具 Y 轴位置坐标
ABS_MT_SLOT 0N 有效卡槽(协议 B)
ABS_X / _Y / _Z 模拟 操纵杆坐标轴
ABS_RX / _RY / _RZ 模拟 操纵杆旋转轴
ABS_THROTTLE/_BRAKE 模拟 踏板和转向控制装置
ABS_HAT0X/_HAT0Y -1 / 0 / 1 方向键帽和 POV 开关
ABS_PRESSURE 0255 触控笔 / 指针力度级别
ABS_DISTANCE mm 悬停距离(触控笔)
ABS_TILT_X/_TILT_Y 触控笔倾斜角度
ABS_VOLUME 模拟 控制器的音量

Android 触控交互由多点触控 (MT) 协议驱动。现代模拟器同时实现了协议 A(无状态,发送以同步标记分隔的接触数据包)和协议 B(有状态,将接触分配给专用跟踪槽)。协议 B 可高效跟踪多个并发触控,以实现缩放等手势。

EV_REL 和 EV_SW - 运动和硬件开关

EV_REL 事件类别用于管理相对指针或坐标变化,主要用于模拟外部鼠标移动或滚轮滚动。EV_SW 事件类别用于管理实体设备开关,例如竖折屏手机或平板电脑是否折叠,或者是否插入了外部音频硬件。

代码 说明
REL_X 增量 横向光标移动
REL_Y 增量 垂直光标移动
SW_LID 0/1 笔记本电脑的开合状态(0=打开,1=关闭)
SW_TABLET_MODE 0/1 平板电脑模式状态(0=关闭,1=开启)
SW_HEADPHONE_INSERT 0/1 耳机插孔状态(0=已拔出,1=已插入)
SW_MICROPHONE_INSERT 0/1 麦克风插孔状态(0=已拔出,1=已插入)
命令调度语法

如需调度这些代码,请使用英文冒号分隔类型、代码和值,设置控制台命令的格式。您可以在一个字符串中将多个坐标更改排入队列。至关重要的是,始终附加最终同步标记 (EV_SYN:0:0),以指示模拟器框架应将这些输入捆绑在一起并进行处理。

事件脚本和手势示例

由于 Telnet 允许发送多部分参数,因此您可以模拟真实的身体手势序列。以下是用于自动执行主机控制台手势的原始事件脚本结构。

模拟屏幕点按

如需在目标坐标处执行干净的屏幕点按操作,请分配跟踪 ID,指定屏幕上的 X 和 Y 坐标,模拟接触触摸,进行同步,然后释放。

# Press down at coordinate (400, 800) and sync
event send EV_ABS:ABS_MT_TRACKING_ID:1
OK
event send EV_ABS:ABS_MT_POSITION_X:400
OK
event send EV_ABS:ABS_MT_POSITION_Y:800
OK
event send EV_KEY:BTN_TOUCH:1
OK
event send EV_SYN:0:0
OK
# Lift finger up and sync
event send EV_ABS:ABS_MT_TRACKING_ID:-1
OK
event send EV_KEY:BTN_TOUCH:0
OK
event send EV_SYN:0:0
OK
模拟垂直滚动(滑动)

如需执行滚动滑动手势,请按住起始坐标处的接触点,发送中间移动坐标帧,然后在结束时释放。

# Finger touch down at start coordinate (500, 1600)
event send EV_ABS:ABS_MT_TRACKING_ID:2
OK
event send EV_ABS:ABS_MT_POSITION_X:500
OK
event send EV_ABS:ABS_MT_POSITION_Y:1600
OK
event send EV_KEY:BTN_TOUCH:1
OK
event send EV_SYN:0:0
OK
# Move coordinates upward dynamically
event send EV_ABS:ABS_MT_POSITION_Y:1200
OK
event send EV_SYN:0:0
OK
event send EV_ABS:ABS_MT_POSITION_Y:800
OK
event send EV_SYN:0:0
OK
event send EV_ABS:ABS_MT_POSITION_Y:400
OK
event send EV_SYN:0:0
OK
# Finger release at coordinate (500, 400)
event send EV_ABS:ABS_MT_TRACKING_ID:-1
OK
event send EV_KEY:BTN_TOUCH:0
OK
event send EV_SYN:0:0
OK
模拟双指张合缩放手势

如需触发双指缩放,请使用有效的 MT slot(0 和 1)来跟踪和协调两个同时远离的触控坐标。

# Finger 1 down at (500, 1000) using slot 0
event send EV_ABS:ABS_MT_SLOT:0
OK
event send EV_ABS:ABS_MT_TRACKING_ID:10
OK
event send EV_ABS:ABS_MT_POSITION_X:500
OK
event send EV_ABS:ABS_MT_POSITION_Y:1000
OK
event send EV_KEY:BTN_TOUCH:1
OK
event send EV_SYN:0:0
OK
# Finger 2 down at (600, 1000) using slot 1
event send EV_ABS:ABS_MT_SLOT:1
OK
event send EV_ABS:ABS_MT_TRACKING_ID:11
OK
event send EV_ABS:ABS_MT_POSITION_X:600
OK
event send EV_ABS:ABS_MT_POSITION_Y:1000
OK
event send EV_SYN:0:0
OK
# Fingers slide apart from each other
event send EV_ABS:ABS_MT_SLOT:0
OK
event send EV_ABS:ABS_MT_POSITION_X:300
OK
event send EV_SYN:0:0
OK
event send EV_ABS:ABS_MT_SLOT:1
OK
event send EV_ABS:ABS_MT_POSITION_X:800
OK
event send EV_SYN:0:0
OK
# Lift Finger 1 using slot 0
event send EV_ABS:ABS_MT_SLOT:0
OK
event send EV_ABS:ABS_MT_TRACKING_ID:-1
OK
event send EV_SYN:0:0
OK
# Lift Finger 2 using slot 1
event send EV_ABS:ABS_MT_SLOT:1
OK
event send EV_ABS:ABS_MT_TRACKING_ID:-1
OK
event send EV_KEY:BTN_TOUCH:0
OK
event send EV_SYN:0:0
OK
模拟耳机连接切换

模拟耳机插孔插入或移除,以测试音频路由开关。值 1 表示耳机插孔插入,0 表示耳机移除。

# Simulate headphones plugged in
event send EV_SW:SW_HEADPHONE_INSERT:1 EV_SYN:0:0
OK
# Simulate headphones unplugged
event send EV_SW:SW_HEADPHONE_INSERT:0 EV_SYN:0:0
OK
从真实设备中发现控制台事件代码

如需了解任何自定义操作或按钮手势的确切事件语法序列,请通过 adb shell 进行连接,然后运行 getevent 诊断实用程序。当您与模拟器 GUI 互动时,控制台会打印确切的事件代码、类型和位置。

# Run getevent to monitor input events dynamically
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
  • 事件文本消息:发送用于模拟按键的字符串。 该消息必须是 UTF-8 字符串。Unicode 消息会根据当前设备键盘进行反向映射,不受支持的字符会被静默舍弃。

电源状态控件

  • 电源显示:显示电池和充电器状态。

  • power ac {on| off}:将交流电充电状态设为开启或关闭。

  • 电源状态 {unknown| charging| discharging| not-charging| full}:按照指定方式更改电池状态。

  • power present {true| false}:设置电池存在状态。

  • 电源健康状况 {unknown| good| overheat| dead| overvoltage| failure}:设置电池健康状况。

  • 电池容量百分比:将电池剩余电量状态设为 0 到 100 之间的百分比。

网络连接状态(仅限以太网和移动网络)

  • 网络状态:检查网络状态以及当前的延迟和速度特性。

  • network delay latency 更改模拟网络延迟。

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

    网络延迟的格式可以是以下几种格式之一(数字以毫秒为单位):

    网络延迟格式

  • gprs:GPRS,使用的延迟范围为 150(最小值)到 550(最大值)。

  • edge:EDGE/EGPRS,使用的延迟范围为 80(最小值)到 400(最大值)。

  • umts:UMTS/3G,使用的延迟范围为 35(最小值)到 200(最大值)。

  • none:没有延迟。

  • num:模拟指定的延迟时间(以毫秒为单位)。

  • min:max:模拟指定的延迟范围。

    如需在模拟器启动时设置延迟,请使用 -netdelay 模拟器选项,并指定一个受支持的延迟值。示例:

    emulator -netdelay gprs
    emulator -netdelay 40,100
    

    如需在模拟器运行时对网络延迟进行更改,请连接到控制台,然后使用 network delay 命令:

    network delay gprs
    network delay 40 100
    
  • network 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 模拟器选项。示例:

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

    如需在模拟器运行时对网络速度进行更改,请连接到控制台,然后使用 network speed 命令:

    network speed 14.4 80
    
  • network capture {start| stop} file 将数据包发送到文件。以下列表介绍了参数和参数值:

    注意:从 Android 模拟器 36.5 及更高版本开始,Wi-Fi 连接流量默认由 netsim 处理。网络捕获控制台命令仅捕获通过 QEMU slirp 堆栈路由的旧版移动网络/WAN 流量。如需在现代模拟器版本中捕获 Wi-Fi、蓝牙或高级网络数据包,请参阅高级模拟器联网指南中的捕获网络流量

  • start file:开始捕获网络数据包。出于安全考虑,文件必须是裸文件名(不包含 / 等路径分隔符,也不包含 ..)。数据包捕获文件将保存在 AVD 的内容目录下的 console_out/ 文件夹中(例如 ~/.android/avd/avd_name.avd/console_out/file)。

  • stop file:停止向指定的文件发送数据包。

电话模拟

Android 模拟器包含自己的 GSM 和 CDMA 模拟调制解调器,可让您在模拟器中模拟电话功能。例如,借助 GSM,您可以模拟呼入电话并建立和终止数据连接。借助 CDMA,您可以提供订阅来源和首选漫游列表。Android 系统处理模拟通话的方式与处理实际通话完全相同。模拟器不支持通话音频。

  • gsm {call| accept| cancel| busy} phonenumber gsm 参数如下:

    • call:模拟来自 phonenumber 的呼入电话。
    • accept:接受来自电话号码的呼入电话,并将通话状态更改为“有效”。只有在当前状态为等待或保持时,才能将通话状态更改为有效。
    • cancel:终止来自或拨向 phonenumber 的呼入电话或外拨电话。
    • busy:关闭对 phonenumber 的外拨电话,并将通话状态更改为忙碌。只有在当前通话状态为等待时,才能将通话状态更改为忙碌。
  • gsm {data| voice} state 数据状态命令用于更改 GPRS 数据连接的状态,语音状态命令用于更改 GPRS 语音连接的状态,具体说明如下:

    • unregistered:没有可用的网络。
    • home:在本地网络上,非漫游。
    • roaming:在漫游网络上。
    • searching:正在搜索网络。
    • denied:只能拨打紧急呼救电话。
    • off:与 unregistered 相同。
    • on:与 home 相同。
  • gsm hold:将通话状态更改为“保持”。只有在当前通话状态为“active”或“waiting”时,才能将通话状态更改为“hold”。

  • gsm list:列出所有呼入电话和外拨电话及其通话状态。

  • gsm 状态:报告当前的 GSM 语音/数据连接状态。相关的值就是前述语音和数据命令的值。

  • 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 get sensor-name:获取 sensor-name 的设置。以下示例会获取加速度传感器的值:

    sensor get acceleration
    acceleration = 2.23517e-07:9.77631:0.812348
    

    以英文冒号(:) 分隔的加速度值是指虚拟传感器的 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 send sender-phone-number textmessage 生成收到的模拟短信。以下列表介绍了参数及其值:

    • sender-phone-number:包含任意数字字符串。
    • textmessage:短信。

    以下示例向电话号码 4085555555 发送了一条内容为“hi there”的短信:

    sms send 4085555555 hi there
    

控制台将短信转发给 Android 框架,Android 框架继而将其传递给模拟器上用来处理短信的应用,例如“信息”应用。如果您传递 10 个数字,应用会将其格式设为电话号码。更长或更短的数字字符串将按其发送方式显示。

指纹模拟

  • finger touch fingerprint-id:模拟手指触摸传感器。

  • finger remove:模拟手指移开。

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

屏幕录制

借助屏幕录制命令,可以直接从主机系统捕获模拟器实体显示屏的高质量视频文件。这对于持续集成流水线和自动 bug 报告非常有用。

  • screenrecord {start| stop} file 开始或停止显示屏录制流程。
    • 开始文件:开始录制视频。输出文件必须以强制性 .webm 扩展名结尾。捕获的视频直接保存在 AVD 的控制台输出目录下:~/.android/avd/avd_name.avd/console_out/file
    • 停止文件:停止正在进行的显示屏录制进程。

自动化和宏

自动化子系统允许开发者在正在运行的虚拟设备上记录宏状态转换,并回放这些转换以执行自动化测试流程。

  • automation {record| stop-record| play| stop-play} 管理自动宏录制。
    • record:开始记录设备状态变化和输入。
    • stop-record:停止当前宏录制会话。
    • play:开始播放录制的宏序列。
    • stop-play:停止当前正在播放的宏序列。

物理(6 自由度)

物理命令用于管理六自由度 (6DoF) 物理运动模型的标准答案空间姿势的日志记录,这些模型用于模拟高级动作追踪。

  • physics {record-gt| stop} 管理身体姿势模型记录。
    • record-gt:开始记录地面实况 6DoF 运动数据。
    • stop:停止当前实况记录进程。

高级设备控制功能

此部分汇总了用于高级模拟配置的高度专业化的控制台命令端点,包括网络代理、多显示屏配置、渲染替换和虚拟机监控程序直接调试。

  • multidisplay {add| del} 添加或删除辅助虚拟显示器,以测试多屏幕配置。注意:Pixel Fold 或可调整大小的模拟器等折叠配置不支持辅助显示器。

  • proxy {set| clear} 通过控制台以编程方式配置网络代理转发。

    • 设置主机端口:配置目标代理设置。
    • clear:将代理配置重置为默认值。 注意:代理设置操作在无头执行环境中会失败。
  • virtualscene-image {wall| table} image_path使用自定义用户图片文件自定义虚拟场景摄像头画面中显示的背景墙或水平桌面。

  • resize-display scale 在预设的缩放比例之间动态调整屏幕分辨率。注意:无头配置不支持分辨率调整。

  • nodraw {on| off} 在大量后台无头自动化运行期间,停用主机屏幕上的物理 GUI 渲染,以减少系统内存和 GPU 负载。

  • grpc port 配置通过自定义 gRPC 端口端点实现的高级程序化设备控制。

  • qemu monitor 提供对底层虚拟机监控程序控制台的直接交互式终端访问权限。只能通过有效的 Telnet 控制台会话输入此命令。

  • icebox track pid 当指定应用进程遇到未处理的异常或崩溃时,启用自动系统快照。

  • phonenumber number 设置目标设备的虚拟本地电话号码。

gRPC 编程接口

新版模拟器支持强大的 gRPC 程序化接口以及旧版 Telnet 控制台。虽然 Telnet 控制台非常适合快速交互式会话或简单脚本,但 gRPC 接口专为在持续集成 (CI) 和无头环境中实现高性能、安全且可靠的自动化控制而设计。通过提供直接服务端点,gRPC 无需解析文本流、管理终端会话握手或公开未加密的 localhost 端口。

为了帮助您在旧版 Telnet 控制台和新版 gRPC 程序化接口之间做出选择,请查看以下性能、安全性和功能比较:

功能 Telnet 控制台 gRPC 接口
适用场景 手动调试、交互式会话。 无头 CI/CD、重型自动化测试平台。
速度 较慢;文本开销、连接延迟。 经过优化;多路复用 HTTP/2,快速 proto。
安全性 未加密;本地端口 (5554–5585)。 可使用 TLS 保护,通过网络运行。
直播 不支持;仅限请求-响应。 用于 logcat、guest 音频捕获的流。
媒体 将输出文件写入宿主/访客磁盘。 直接通过有线方式传输的二进制缓冲区。
客户机操作系统 仅限于固定的模拟器命令。 运行原生 guest bash shell 命令。

启动和调用 gRPC

如需使用 gRPC 端点,请从命令行启动 Android 模拟器并添加 -grpc 标志,指定目标环回端口。

# Start the emulator with the gRPC service enabled on port 8556
emulator -grpc localhost:8556 @Pixel_Fold

在启用 gRPC 服务的情况下运行模拟器后,您就可以进行程序化 RPC 调用了。对于命令行测试,请使用 grpcurl 实用程序与模拟器的服务进行通信。所有请求均采用 JSON 格式,并通过明文发送。

# Query the status of the virtual device using grpcurl
grpcurl -plaintext -d '{}' localhost:8556 \
  android.emulation.control.EmulatorController/getStatus

# Simulate an incoming phone call
grpcurl -plaintext -d '{"operation": "InitCall", "number": "1234567890"}' localhost:8556 \
  android.emulation.control.EmulatorController/sendPhone

# Simulate typing text into the guest OS
grpcurl -plaintext -d '{"text": "Hello"}' localhost:8556 \
  android.emulation.control.EmulatorController/sendKey

Telnet 控制台到 gRPC 服务的映射

下表将旧版 Telnet 控制台命令映射到相应的 gRPC 服务和方法,并说明如何以编程方式自动执行常见的虚拟设备互动:

类别 旧版 Telnet 命令 gRPC 服务 / 方法
状态 ping EmulatorController/getStatus
状态 avd name incubating.AvdService/getAvdInfo
状态 kill EmulatorController/setVmState
状态 restart EmulatorController/setVmState
电源 power display EmulatorController/getBattery
电源 power capacity EmulatorController/setBattery
地理位置 geo fix EmulatorController/setGps
传感器 sensor set incubating.SensorService/setSensor
生物识别 finger touch EmulatorController/sendFingerprint
姿势 posture EmulatorController/setPosture
姿势 physics/fold EmulatorController/setPhysicalModel
短信 sms send EmulatorController/sendSms
GSM 通话 gsm call EmulatorController/sendPhone
GSM 通话 phonenumber EmulatorController/setPhoneNumber
重定向 redir add Waterfall/ForwardPort
输入 event send EV_KEY EmulatorController/sendKey
输入 event send EV_ABS EmulatorController/sendTouch
媒体 screenrecord incubating.ScreenRecording
渲染 nodraw EmulatorController/setDisplayMode
快照 avd snapshot list SnapshotService/ListSnapshots
快照 avd snapshot load/save SnapshotService/LoadSnapshot

特定于 gRPC 的程序化命令

gRPC 接口提供了多项先进功能,这些功能在旧版 Telnet 控制台连接上是无法实现的。这些功能包括直接 logcat 流式传输、双向音频捕获或注入、主机 GUI 修改和直接 shell 访问。

gRPC 服务 / 方法 参数 能力
streamLogcat {"maxLines": 100} 流式传输 guest 系统 logcat 输出
streamAudio {} 通过有线方式传输扬声器音频
injectAudio {"audio": "..."} 注入麦克风音频流
UiController {"theme": "DARK"} 修改宿主窗口主题
Waterfall/Exec {"cmd": "ls"} 运行原生客机操作系统 shell 命令

指纹模拟和验证

图 1. 指纹身份验证界面。

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

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

  1. 如果您还没有指纹 ID,应在模拟器中注册一个新指纹,方法是依次选择设置 > 安全 > 指纹,并按照注册说明进行操作。

  2. 设置您的应用以接受指纹身份验证。 执行此设置后,您的设备将显示指纹身份验证屏幕。

  3. 在您的应用显示指纹身份验证屏幕后,转到控制台并输入 finger touch 命令以及您创建的指纹 ID。这样就可以模拟手指触摸。

  4. 然后,输入 finger remove 命令以模拟手指移开。您的应用应该像用户触摸了指纹传感器而后又从上面移开一样进行响应。