每个正在运行的虚拟设备都提供了一个控制台,可让您查询和控制模拟设备的环境。例如,当您的应用在模拟器上运行时,您可以使用控制台来管理端口重定向、网络特性和电话事件。
以下命令要求您有正在运行的模拟器。如需详细了解如何运行模拟器,请参阅在 Android 模拟器上运行应用和从命令行启动模拟器。
启动和停止控制台会话
如需访问控制台并输入命令,请从终端窗口中使用 telnet 连接到控制台端口,并提供您的身份验证令牌。每当控制台显示 OK 时,表明它已可以开始接受命令。它没有通常那种提示符。
要连接到正在运行的虚拟设备的控制台,请执行以下操作:
打开终端窗口并输入以下命令:
telnet localhost console-port模拟器窗口标题会列出在单独的窗口中运行时的控制台端口号,而不是在工具窗口中运行时的控制台端口号。例如,使用控制台端口 5554 的模拟器的窗口标题可能是 Pixel8_API_34:5554。此外,
adb devices命令也会输出正在运行的虚拟设备及其控制台端口号的列表。要了解详情,请参阅查询设备。注意:模拟器会监听端口 5554 到 5585 上的连接,并且仅接受来自 localhost 的连接。
控制台显示 OK 后,输入
auth auth_token命令。您必须先通过身份验证,然后才能输入控制台命令。
auth_token必须与主目录中.emulator_console_auth_token文件的内容匹配。如果该文件不存在,
telnet localhost console-port命令会创建该文件,其中包含随机生成的身份验证令牌。如需停用身份验证,请从.emulator_console_auth_token文件中删除令牌,或创建一个空文件(如果该文件尚不存在)。连接到控制台后,输入控制台命令。
输入
help、help command或help-verbose,即可查看控制台命令列表并了解特定命令。如要退出控制台会话,请输入
quit或exit。
以下是一个会话示例:
$ 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:查询虚拟设备状态,可以是“正在运行”或“已停止”。
- name:查询虚拟设备名称。
avd snapshot {list| save name| load name| delete name}利用快照保存和恢复设备状态,具体说明如下:- list:列出所有保存的快照。
- save name:将快照保存为 name。
- load name:加载指定快照。
- delete name:删除指定快照。
以下示例以
firstactivitysnapshot作为名称保存快照:avd snapshot save firstactivitysnapshotfold:折叠设备以显示其较小的屏幕配置(如果设备可折叠且当前处于展开状态)。
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:必须是 tcp 或 udp。
- host-port:要在主机上打开的端口号。
- guest-port:要在模拟器上将数据传输到的端口号。
redir del protocol:host-port删除端口重定向。- protocol:必须是 tcp 或 udp。
- host-port:要在主机上打开的端口号。
地理位置
通过向模拟器发送 GPS 定位,设置向模拟器内运行的应用报告的地理位置。
您可以在虚拟设备运行后立即发出以下 geo 命令中的一种。模拟器通过创建模拟位置信息提供程序来设置您输入的位置信息。此提供程序响应由应用设置的位置监听器,并且会将位置提供给 LocationManager。任何应用均可通过调用 LocationManager.getLastKnownLocation("gps") 来查询位置管理器,以获取模拟设备的当前 GPS 定位。
geo fix longitude latitude [altitude] [satellites] [velocity]:向模拟器发送 GPS 定位。以十进制度为单位指定经度和纬度。使用 1 到 12 之间的数字指定用于确定位置的卫星数量,并以米为单位指定海拔高度,以节为单位指定速度。geo nmea sentence:向模拟设备发送 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 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 OKevent send types [types ...]:发送一个或多个虚假事件类型。event codes type:列出指定虚假事件类型的事件代码。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 |
Enter 键触发器 |
KEY_ESC |
Esc 键触发器 |
KEY_TAB |
Tab 键触发器 |
KEY_SPACE |
空格键触发器 |
KEY_BACKSPACE |
退格键触发器 |
KEY_CLEAR |
清除输入缓冲区 |
KEY_CANCEL |
取消正在执行的操作 |
KEY_OK |
确认/确定选择 |
KEY_SELECT |
选择内容触发器 |
KEY_GOTO |
前往指定地点 |
KEY_HELP |
访问帮助上下文 |
子表 D:字母数字和键盘符号
- 标准字母:
KEY_A到KEY_Z(26 个代码)。 - 数字键盘键:
KEY_1到KEY_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_F1到KEY_F24(24 个代码)。
| 代码 | 说明 |
|---|---|
KEY_LEFTSHIFT |
左 Shift 键盘修饰键 |
KEY_RIGHTSHIFT |
右 Shift 键盘修饰键 |
KEY_LEFTCTRL |
左侧 Control 键盘修饰键 |
KEY_RIGHTCTRL |
右侧 Control 键盘辅助键 |
KEY_LEFTALT |
左 Alt 键盘修饰键 |
KEY_RIGHTALT |
右侧 Alt 键盘辅助键 |
KEY_LEFTMETA |
左 Meta/Command 键 |
KEY_RIGHTMETA |
右 Meta/Command 键 |
KEY_CAPSLOCK |
大写锁定键盘切换 |
KEY_NUMLOCK |
数字锁定键盘切换 |
KEY_SCROLLLOCK |
滚动锁定键盘切换 |
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 播放器画面 |
KEY_VCR2 |
播放 VCR 2 播放器画面 |
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 |
0到 1767 |
X 坐标 (Pixel Fold) |
ABS_MT_POSITION_Y |
0到 2207 |
Y 坐标 (Pixel Fold) |
ABS_MT_TOUCH_MAJOR |
像素 | 触摸区域主轴宽度 |
ABS_MT_TOUCH_MINOR |
像素 | 触摸区域短轴宽度 |
ABS_MT_WIDTH_MAJOR |
像素 | 工具长轴宽度 |
ABS_MT_WIDTH_MINOR |
像素 | 工具短轴宽度 |
ABS_MT_ORIENTATION |
0到 255 |
接触方向角 |
ABS_MT_PRESSURE |
0到 255 |
接触力大小 |
ABS_MT_DISTANCE |
mm | 悬停距离屏幕的距离 |
ABS_MT_TOOL_TYPE |
0到 2 |
0=手指,1=触控笔,2=铅笔 |
ABS_MT_BLOB_ID |
整数 | 联系人 blob 标识符 |
ABS_MT_TOOL_X |
像素 | 工具 X 位置坐标 |
ABS_MT_TOOL_Y |
像素 | 工具 Y 位置坐标 |
ABS_MT_SLOT |
0到 N |
活动槽位(协议 B) |
ABS_X / _Y / _Z |
模拟 | 操纵杆坐标轴 |
ABS_RX / _RY / _RZ |
模拟 | 操纵杆旋转轴 |
ABS_THROTTLE/_BRAKE |
模拟 | 踏板和转向控制装置 |
ABS_HAT0X/_HAT0Y |
-1 / 0 / 1 |
方向键帽和主视角开关 |
ABS_PRESSURE |
0到 255 |
触控笔/指针力度级别 |
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 槽(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
- event text message:发送用于模拟按键的字符串。该消息必须是 UTF-8 字符串。Unicode 消息会根据当前设备键盘进行反向映射,不受支持的字符会被静默舍弃。
电源状态控件
power display:显示电池和充电器状态。
power ac {on| off}:将交流电充电状态设为开启或关闭。
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更改模拟网络延迟时间。您可以使用模拟器来模拟各种网络延迟级别,以便您在更接近于实际运行条件的环境中测试应用。您可以在模拟器启动时设置延迟级别或范围,也可以在应用在模拟器中运行时使用控制台来更改延迟。
网络延迟的格式可以是以下几种格式之一(数字以毫秒为单位):
网络延迟格式:
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 100network 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 80network 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} phonenumbergsm 参数如下:- call:模拟来自 phonenumber 的呼入电话。
- accept:接受来自 phonenumber 的呼入电话,并将通话状态更改为“活动”。只有在当前通话状态为“等待”或“保持”时,才能将通话状态更改为“活跃”。
- cancel:终止来自 phonenumber 的呼入电话或对它的外拨电话。
- busy:关闭对 phonenumber 的外拨电话,并将通话状态更改为 busy。只有在当前通话状态为“等待”时,才能将通话状态更改为“忙碌”。
gsm {data| voice} state数据状态命令用于更改 GPRS 数据连接的状态,语音状态命令则用于更改 GPRS 语音连接的状态,具体说明如下:- unregistered:没有可用的网络。
- home:在本地网络上,非漫游。
- roaming:在漫游网络上。
- searching:正在搜索网络。
- denied:只能拨打紧急呼救电话。
- off:与未注册相同。
- on:与 home 相同。
gsm hold:将通话状态更改为保持。只有在当前通话状态为“活跃”或“等待”时,才能将通话状态更改为“保持”。
gsm list:列出所有呼入电话和外拨电话及其通话状态。
gsm status:报告当前的 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 中可用的传感器有关。除了使用传感器命令之外,您还可以在模拟器的“Virtual sensors”屏幕上的“Accelerometer”和“Additional sensors”标签页中查看和调整相关设置。
传感器状态:列出所有传感器及其状态。
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开始或停止显示录制过程。- start 文件:开始录制视频。输出文件必须以强制性
.webm扩展名结尾。截取的视频会直接保存在 AVD 的控制台输出目录下:~/.android/avd/avd_name.avd/console_out/file。 - stop file:停止正在进行的显示录制过程。
- start 文件:开始录制视频。输出文件必须以强制性
自动化和宏
借助自动化子系统,开发者可以记录正在运行的虚拟设备上的宏状态转换,并回放这些转换以执行自动化测试流程。
automation {record| stop-record| play| stop-play}管理自动宏录制。- record:开始记录设备状态变化和输入。
- stop-record:停止当前的宏录制会话。
- play:开始播放录制的宏序列。
- stop-play:停止正在播放的宏序列。
物理机制 (6DoF)
物理命令用于管理记录六自由度 (6DoF) 物理运动模型的标准答案空间姿势,这些模型用于模拟高级动作追踪。
physics {record-gt| stop}管理物理姿势模型录制内容。- record-gt:开始记录标准答案 6DoF 移动数据。
- stop:停止当前的真实数据录制过程。
高级设备控制
本部分汇总了高度专业化的控制台命令端点,用于高级模拟配置,包括网络代理、多显示屏配置、渲染替换和 hypervisor 直接调试。
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提供对底层 Hypervisor 控制台的直接交互式终端访问。此命令只能通过活跃的 Telnet 控制台会话输入。icebox track pid当指定的应用进程遇到未处理的异常或崩溃时,启用自动化系统快照。phonenumber number设置目标设备的虚拟本地电话号码。
gRPC 编程接口
现代模拟器版本除了支持旧版 Telnet 控制台外,还支持强大的 gRPC 编程接口。Telnet 控制台非常适合快速交互式会话或基本脚本编写,而 gRPC 接口则专为在持续集成 (CI) 和无头环境中实现高性能、安全且强大的自动化控制而设计。通过提供直接服务端点,gRPC 无需解析文本流、管理终端会话握手或公开未加密的 localhost 端口。
为了帮助您在旧版 Telnet 控制台和现代 gRPC 编程接口之间做出选择,请查看以下性能、安全性和功能对比:
| 功能 | Telnet 控制台 | gRPC 接口 |
|---|---|---|
| 适用场景 | 手动调试、交互式会话。 | 无头 CI/CD、重型自动化测试平台。 |
| 速度 | 较慢;文本开销、连接延迟。 | 经过优化;多路复用 HTTP/2,快速 proto。 |
| 安全性 | 未加密;本地端口 (5554–5585)。 | 可采用 TLS 安全机制,通过网络运行。 |
| 数据流 | 不支持;仅限请求-响应。 | 用于 logcat、客机音频捕获的流。 |
| 媒体 | 将输出文件写入主机/客机磁盘。 | 直接通过网络传输的二进制缓冲区。 |
| 客户机操作系统 | 仅限固定的模拟器命令。 | 运行原生客机 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 |
| Posture | 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} |
流式传输客户机系统 logcat 输出 |
streamAudio |
{} |
通过有线方式传输扬声器音频 |
injectAudio |
{"audio": "..."} |
注入麦克风音频串流 |
UiController |
{"theme": "DARK"} |
修改主机窗口主题 |
Waterfall/Exec |
{"cmd": "ls"} |
运行原生客机操作系统 shell 命令 |
指纹模拟和验证
您可以使用 finger 命令来模拟和验证应用的指纹身份验证。您需要使用 SDK 工具 24.3 或更高版本,以及 Android 6.0(API 级别 23)或更高版本。
如需模拟和验证指纹身份验证,请按以下步骤操作:
如果您还没有指纹 ID,应在模拟器中注册一个新指纹,方法是依次选择 Settings > Security > Fingerprint,并按照注册说明进行操作。
将您的应用设置为接受指纹身份验证。 完成此设置后,设备会显示指纹身份验证界面。
在您的应用显示指纹身份验证屏幕后,转到控制台并输入
finger touch命令以及您创建的指纹 ID。这会模拟手指触摸。然后,输入
finger remove命令以模拟手指移开。您的应用应该像用户触摸了指纹传感器而后又从上面移开一样进行响应。