mumu-python-api-wlkjyy 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mumu_python_api_wlkjyy-1.1.0/PKG-INFO +1753 -0
- mumu_python_api_wlkjyy-1.1.0/README.md +1738 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/__init__.py +3 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/adb/Adb.py +202 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/adb/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/Core.py +168 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/app.py +143 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/performance.py +105 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/power.py +68 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/shortcut.py +48 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/simulation.py +136 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/core/window.py +76 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/develop/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/develop/androidevent.py +151 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/driver/Driver.py +26 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/driver/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/driver/bridge.py +40 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/network/Network.py +82 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/network/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/permission/Permission.py +18 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/permission/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/permission/root.py +40 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/screen/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/screen/gui.py +410 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/screen/nemu_sdk.py +141 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/screen/screen.py +129 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/setting/__init__.py +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/api/setting/setting.py +158 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/config.py +15 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/constant.py +192 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/control.py +260 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/mumu.py +287 -0
- mumu_python_api_wlkjyy-1.1.0/mumu/utils.py +103 -0
- mumu_python_api_wlkjyy-1.1.0/mumu_python_api_wlkjyy.egg-info/PKG-INFO +1753 -0
- mumu_python_api_wlkjyy-1.1.0/mumu_python_api_wlkjyy.egg-info/SOURCES.txt +53 -0
- mumu_python_api_wlkjyy-1.1.0/mumu_python_api_wlkjyy.egg-info/dependency_links.txt +1 -0
- mumu_python_api_wlkjyy-1.1.0/mumu_python_api_wlkjyy.egg-info/requires.txt +10 -0
- mumu_python_api_wlkjyy-1.1.0/mumu_python_api_wlkjyy.egg-info/top_level.txt +1 -0
- mumu_python_api_wlkjyy-1.1.0/pyproject.toml +30 -0
- mumu_python_api_wlkjyy-1.1.0/setup.cfg +4 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_adb.py +183 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_android_event.py +52 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_app.py +67 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_core.py +84 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_gui.py +105 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_mumu.py +152 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_nemu_sdk.py +98 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_power_window_shortcut.py +69 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_root_and_bridge.py +37 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_setting.py +109 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_simulation_performance_network_screen.py +138 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_utils.py +72 -0
- mumu_python_api_wlkjyy-1.1.0/tests/test_wrappers_and_constants.py +41 -0
|
@@ -0,0 +1,1753 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mumu-python-api-wlkjyy
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: Python API for controlling MuMu emulator through MuMuManager.exe
|
|
5
|
+
Requires-Python: >=3.9
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: adbutils<3,>=1.2.15
|
|
8
|
+
Provides-Extra: auto
|
|
9
|
+
Requires-Dist: opencv-python>=4.8; extra == "auto"
|
|
10
|
+
Requires-Dist: scrcpy-client>=0.4.7; extra == "auto"
|
|
11
|
+
Provides-Extra: dev
|
|
12
|
+
Requires-Dist: build>=1.2.2; extra == "dev"
|
|
13
|
+
Requires-Dist: twine>=5.1.1; extra == "dev"
|
|
14
|
+
Requires-Dist: pytest>=8.3.3; extra == "dev"
|
|
15
|
+
|
|
16
|
+
# Mumu模拟器Python API
|
|
17
|
+
|
|
18
|
+
- [Mumu模拟器Python API](#mumu模拟器python-api)
|
|
19
|
+
- [项目介绍](#项目介绍)
|
|
20
|
+
- [如何使用?](#如何使用)
|
|
21
|
+
- [设置MuMuManager路径](#设置mumumanager路径)
|
|
22
|
+
- [模拟器索引说明](#模拟器索引说明)
|
|
23
|
+
- [选择模拟器](#选择模拟器)
|
|
24
|
+
- [举个例子](#举个例子)
|
|
25
|
+
- [注意](#注意)
|
|
26
|
+
- [API类](#api类)
|
|
27
|
+
- [驱动类(driver)](#驱动类driver)
|
|
28
|
+
- [网络桥接驱动(bride)](#网络桥接驱动bride)
|
|
29
|
+
- [安装桥接驱动(install)](#安装桥接驱动install)
|
|
30
|
+
- [卸载桥接驱动(uninstall)](#卸载桥接驱动uninstall)
|
|
31
|
+
- [权限类(permission)](#权限类permission)
|
|
32
|
+
- [\* ROOT权限(root)](#-root权限root)
|
|
33
|
+
- [开启ROOT权限(enable)](#开启root权限enable)
|
|
34
|
+
- [关闭ROOT权限(disable)](#关闭root权限disable)
|
|
35
|
+
- [电源类(power)](#电源类power)
|
|
36
|
+
- [启动模拟器(start)](#启动模拟器start)
|
|
37
|
+
- [关闭模拟器(shutdown|stop)](#关闭模拟器shutdownstop)
|
|
38
|
+
- [重启模拟器(restart|reboot)](#重启模拟器restartreboot)
|
|
39
|
+
- [窗口类(window)](#窗口类window)
|
|
40
|
+
- [显示窗口(show)](#显示窗口show)
|
|
41
|
+
- [隐藏窗口(hidden)](#隐藏窗口hidden)
|
|
42
|
+
- [调整窗口大小或位置(layout)](#调整窗口大小或位置layout)
|
|
43
|
+
- [应用类(app)](#应用类app)
|
|
44
|
+
- [安装一个应用(install)](#安装一个应用install)
|
|
45
|
+
- [卸载一个应用(uninstall)](#卸载一个应用uninstall)
|
|
46
|
+
- [启动模拟器里的应用(launch)](#启动模拟器里的应用launch)
|
|
47
|
+
- [关闭模拟器里的应用(close)](#关闭模拟器里的应用close)
|
|
48
|
+
- [\* 判断应用是否存在(exists)](#-判断应用是否存在exists)
|
|
49
|
+
- [\* 判断应用是否不存在(doesntExists)](#-判断应用是否不存在doesntexists)
|
|
50
|
+
- [获取已经安装的应用列表(get\_installed)](#获取已经安装的应用列表get_installed)
|
|
51
|
+
- [\* 获取应用状态(state)](#-获取应用状态state)
|
|
52
|
+
- [核心类(core)](#核心类core)
|
|
53
|
+
- [创建模拟器(create)](#创建模拟器create)
|
|
54
|
+
- [克隆模拟器(clone)](#克隆模拟器clone)
|
|
55
|
+
- [删除模拟器(delete)](#删除模拟器delete)
|
|
56
|
+
- [重命名模拟器(rename)](#重命名模拟器rename)
|
|
57
|
+
- [备份模拟器(export)](#备份模拟器export)
|
|
58
|
+
- [导入模拟器(import\_)](#导入模拟器import_)
|
|
59
|
+
- [限制CPU使用率(limit\_cpu)](#限制cpu使用率limit_cpu)
|
|
60
|
+
- [安卓事件类(androidEvent)](#安卓事件类androidevent)
|
|
61
|
+
- [屏幕旋转(rotate)](#屏幕旋转rotate)
|
|
62
|
+
- [返回主页(go\_home)](#返回主页go_home)
|
|
63
|
+
- [返回(back)](#返回back)
|
|
64
|
+
- [窗口置顶(top\_most)](#窗口置顶top_most)
|
|
65
|
+
- [窗口全屏(fullscreen)](#窗口全屏fullscreen)
|
|
66
|
+
- [摇一摇(shake)](#摇一摇shake)
|
|
67
|
+
- [截图(screenshot)](#截图screenshot)
|
|
68
|
+
- [音量增加(volume\_up)](#音量增加volume_up)
|
|
69
|
+
- [音量减少(volume\_down)](#音量减少volume_down)
|
|
70
|
+
- [音量静音(volume\_mute)](#音量静音volume_mute)
|
|
71
|
+
- [任务键(go\_task)](#任务键go_task)
|
|
72
|
+
- [修改虚拟定位(location)](#修改虚拟定位location)
|
|
73
|
+
- [修改重力感应(gyro)](#修改重力感应gyro)
|
|
74
|
+
- [快捷方式类(shortcut)](#快捷方式类shortcut)
|
|
75
|
+
- [创建桌面快捷方式(create)](#创建桌面快捷方式create)
|
|
76
|
+
- [删除桌面快捷方式(delete)](#删除桌面快捷方式delete)
|
|
77
|
+
- [机型类(simulation)](#机型类simulation)
|
|
78
|
+
- [修改MAC地址(mac\_address)](#修改mac地址mac_address)
|
|
79
|
+
- [修改IMEI(imei)](#修改imeiimei)
|
|
80
|
+
- [修改IMSI(imsi)](#修改imsiimsi)
|
|
81
|
+
- [修改Android ID(android\_id)](#修改android-idandroid_id)
|
|
82
|
+
- [设置模拟器设备型号(model)](#设置模拟器设备型号model)
|
|
83
|
+
- [设置模拟器主板品牌(brand)](#设置模拟器主板品牌brand)
|
|
84
|
+
- [设置模拟器硬件制造商(solution)](#设置模拟器硬件制造商solution)
|
|
85
|
+
- [设置模拟器手机号码(phone\_number)](#设置模拟器手机号码phone_number)
|
|
86
|
+
- [设置模拟器GPU型号(gpu\_model)](#设置模拟器gpu型号gpu_model)
|
|
87
|
+
- [配置类(setting)](#配置类setting)
|
|
88
|
+
- [获取模拟器配置所有配置项(all)](#获取模拟器配置所有配置项all)
|
|
89
|
+
- [获取一个或多个配置项(get)](#获取一个或多个配置项get)
|
|
90
|
+
- [修改一个或多个配置(set)](#修改一个或多个配置set)
|
|
91
|
+
- [根据JSON文件内容修改配置(set\_by\_json)](#根据json文件内容修改配置set_by_json)
|
|
92
|
+
- [\*判断某个配置是否等于某个值(equal)](#判断某个配置是否等于某个值equal)
|
|
93
|
+
- [\*判断某个配置是否不等于某个值(not\_equal)](#判断某个配置是否不等于某个值not_equal)
|
|
94
|
+
- [\*判断某个配置等于某个值时,修改为另一个值(equal\_then\_set)](#判断某个配置等于某个值时修改为另一个值equal_then_set)
|
|
95
|
+
- [\*判断某个配置不等于某个值时,修改为另一个值(not\_equal\_then\_set)](#判断某个配置不等于某个值时修改为另一个值not_equal_then_set)
|
|
96
|
+
- [\*屏幕类(screen)](#屏幕类screen)
|
|
97
|
+
- [调整模拟器分辨率(resolution)](#调整模拟器分辨率resolution)
|
|
98
|
+
- [设置为手机分辨率(resolution\_mobile)](#设置为手机分辨率resolution_mobile)
|
|
99
|
+
- [设置为平板分辨率(resolution\_tablet)](#设置为平板分辨率resolution_tablet)
|
|
100
|
+
- [设置为超宽屏分辨率(resolution\_ultrawide)](#设置为超宽屏分辨率resolution_ultrawide)
|
|
101
|
+
- [调整模拟器DPI(dpi)](#调整模拟器dpidpi)
|
|
102
|
+
- [调整模拟器亮度(brightness)](#调整模拟器亮度brightness)
|
|
103
|
+
- [调整模拟器最大帧率(max\_frame\_rate)](#调整模拟器最大帧率max_frame_rate)
|
|
104
|
+
- [设置动态调整帧率(dynamic\_adjust\_frame\_rate)](#设置动态调整帧率dynamic_adjust_frame_rate)
|
|
105
|
+
- [设置垂直同步(vertical\_sync)](#设置垂直同步vertical_sync)
|
|
106
|
+
- [显示帧率(show\_frame\_rate)](#显示帧率show_frame_rate)
|
|
107
|
+
- [设置窗口自动旋转(window\_auto\_rotate)](#设置窗口自动旋转window_auto_rotate)
|
|
108
|
+
- [性能类(performance)](#性能类performance)
|
|
109
|
+
- [设置CPU和内存(set)](#设置cpu和内存set)
|
|
110
|
+
- [设置CPU个数(cpu)](#设置cpu个数cpu)
|
|
111
|
+
- [设置内存大小(memory)](#设置内存大小memory)
|
|
112
|
+
- [设置强制使用独立显卡(force\_discrete\_graphics)](#设置强制使用独立显卡force_discrete_graphics)
|
|
113
|
+
- [显存使用策略(renderer\_strategy)](#显存使用策略renderer_strategy)
|
|
114
|
+
- [设置磁盘类型(disk\_readonly)](#设置磁盘类型disk_readonly)
|
|
115
|
+
- [\*网络类(network)](#网络类network)
|
|
116
|
+
- [获取所有可被桥接的网卡(get\_bridge\_card)](#获取所有可被桥接的网卡get_bridge_card)
|
|
117
|
+
- [设置网络桥接模式(bridge)](#设置网络桥接模式bridge)
|
|
118
|
+
- [设置网络为NAT模式(nat)](#设置网络为nat模式nat)
|
|
119
|
+
- [设置桥接模式IP设置方式为DHCP(bridge\_dhcp)](#设置桥接模式ip设置方式为dhcpbridge_dhcp)
|
|
120
|
+
- [设置桥接模式IP设置方式为静态(bridge\_static)](#设置桥接模式ip设置方式为静态bridge_static)
|
|
121
|
+
- [ADB类(adb)](#adb类adb)
|
|
122
|
+
- [获取模拟器的ADB连接信息(get\_connect\_info)](#获取模拟器的adb连接信息get_connect_info)
|
|
123
|
+
- [点击屏幕(click)](#点击屏幕click)
|
|
124
|
+
- [滑动屏幕(swipe)](#滑动屏幕swipe)
|
|
125
|
+
- [文本输入(input\_text)](#文本输入input_text)
|
|
126
|
+
- [模拟按键(key\_event)](#模拟按键key_event)
|
|
127
|
+
- [上传文件(push)](#上传文件push)
|
|
128
|
+
- [上传文件到Download目录(push\_download)](#上传文件到download目录push_download)
|
|
129
|
+
- [下载文件(pull)](#下载文件pull)
|
|
130
|
+
- [清理应用数据(clear)](#清理应用数据clear)
|
|
131
|
+
- [GUI自动化类(auto)](#gui自动化类auto)
|
|
132
|
+
- [处理模拟器实时帧(create\_handle)](#处理模拟器实时帧create_handle)
|
|
133
|
+
- [保存模拟器实时帧(save)](#保存模拟器实时帧save)
|
|
134
|
+
- [在帧中查找第一个图片(locateOnScreen)](#在帧中查找第一个图片locateonscreen)
|
|
135
|
+
- [在帧中查找第一张图片的中心点(locateCenterOnScreen)](#在帧中查找第一张图片的中心点locatecenteronscreen)
|
|
136
|
+
- [在帧中查找所有图片(locateAllOnScreen)](#在帧中查找所有图片locateallonscreen)
|
|
137
|
+
- [获取Box的中心点(center)](#获取box的中心点center)
|
|
138
|
+
- [实战举例](#实战举例)
|
|
139
|
+
- [支持本项目](#支持本项目)
|
|
140
|
+
|
|
141
|
+
## 项目介绍
|
|
142
|
+
|
|
143
|
+
该项目是基于MuMu提供的``MuMuManager.exe``实现的Python API,可以通过Python代码控制MuMu模拟器的大量操作。
|
|
144
|
+
|
|
145
|
+
该项目要求你已经安装了MuMu模拟器,且Mumu模拟器版本`>=4.0.0`以上。
|
|
146
|
+
|
|
147
|
+
## 如何使用?
|
|
148
|
+
|
|
149
|
+
将本项目安装到您的Python环境中
|
|
150
|
+
|
|
151
|
+
导入模块
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from mumu.mumu import Mumu
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 设置MuMuManager路径
|
|
158
|
+
|
|
159
|
+
如果你的Mumu模拟器不是使用``默认路径``安装,则需要在创建Mumu对象时传入MuMuManager的路径。
|
|
160
|
+
默认路径``C:\Program Files\Netease\MuMu Player 12\shell\MuMuManager.exe``
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from mumu.mumu import Mumu
|
|
164
|
+
|
|
165
|
+
Mumu(r'your_path').select(1)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 模拟器索引说明
|
|
169
|
+
|
|
170
|
+
在Mumu模拟器种,操作模拟器通过索引,索引可以在创建时指定,也可以创建时自动分配,如果你不知道你的模拟器索引是多少,可以打开“Mumu多开器”,找到你的模拟器,最前面那个数字就是你的模拟器索引。
|
|
171
|
+
|
|
172
|
+
### 选择模拟器
|
|
173
|
+
|
|
174
|
+
如果指定的操作需要操作模拟器,可以通过``select``方法选择模拟器
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
from mumu.mumu import Mumu
|
|
178
|
+
|
|
179
|
+
mumu = Mumu().select(1)
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
对于选择多个模拟器时可以这样,一下4种方式都是等价的,均可以选择1、2、3号模拟器
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
from mumu.mumu import Mumu
|
|
186
|
+
|
|
187
|
+
# 第一种
|
|
188
|
+
mumu = Mumu().select([1, 2, 3])
|
|
189
|
+
# 第二种
|
|
190
|
+
mumu = Mumu().select(1, 2, 3)
|
|
191
|
+
# 第三种
|
|
192
|
+
mumu = Mumu().select((1, 2, 3))
|
|
193
|
+
# 也可以混合使用
|
|
194
|
+
mumu = Mumu().select([1, 2], 3)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
如果希望选择所有模拟器,可以使用以下两种方法
|
|
198
|
+
|
|
199
|
+
```python
|
|
200
|
+
from mumu.mumu import Mumu
|
|
201
|
+
|
|
202
|
+
# 第一种
|
|
203
|
+
mumu = Mumu().select() # 当select什么都不传时,默认选择所有模拟器
|
|
204
|
+
# 第二种:通过all方法选择所有模拟器
|
|
205
|
+
mumu = Mumu().all()
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 举个例子
|
|
209
|
+
|
|
210
|
+
我希望开启索引为1的模拟器的root权限,然后启动它。
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
from mumu.mumu import Mumu
|
|
214
|
+
|
|
215
|
+
# 选择索引为1的模拟器
|
|
216
|
+
mumu = Mumu().select(1)
|
|
217
|
+
# 开启Root权限
|
|
218
|
+
mumu.permission.root.enable()
|
|
219
|
+
# 启动模拟器
|
|
220
|
+
mumu.power.start()
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 注意
|
|
224
|
+
|
|
225
|
+
带`*`的类是本项目提供的`超类`,并不是MuMu模拟器的API原生提供。
|
|
226
|
+
|
|
227
|
+
## API类
|
|
228
|
+
|
|
229
|
+
本项目提供了多个操作类,可以通过这些类实现对模拟器的控制。
|
|
230
|
+
|
|
231
|
+
### 驱动类(driver)
|
|
232
|
+
|
|
233
|
+
说明:具官方文档,目前仅支持网络桥接驱动。
|
|
234
|
+
|
|
235
|
+
#### 网络桥接驱动(bride)
|
|
236
|
+
|
|
237
|
+
##### 安装桥接驱动(install)
|
|
238
|
+
|
|
239
|
+
说明:安装桥接驱动需要管理员权限
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
Mumu().driver.bridge.install()
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
##### 卸载桥接驱动(uninstall)
|
|
246
|
+
|
|
247
|
+
说明:卸载桥接驱动需要管理员权限
|
|
248
|
+
|
|
249
|
+
```python
|
|
250
|
+
Mumu().driver.bridge.uninstall()
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 权限类(permission)
|
|
254
|
+
|
|
255
|
+
#### * ROOT权限(root)
|
|
256
|
+
|
|
257
|
+
##### 开启ROOT权限(enable)
|
|
258
|
+
|
|
259
|
+
说明:开启ROOT权限需要在模拟器关机状态下进行
|
|
260
|
+
|
|
261
|
+
```python
|
|
262
|
+
Mumu().select('your_index').permission.root.enable()
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
##### 关闭ROOT权限(disable)
|
|
266
|
+
|
|
267
|
+
说明:关闭ROOT权限需要在模拟器关机状态下进行
|
|
268
|
+
|
|
269
|
+
```python
|
|
270
|
+
Mumu().select('your_index').permission.root.disable()
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### 电源类(power)
|
|
274
|
+
|
|
275
|
+
#### 启动模拟器(start)
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
Mumu().select('your_index').power.start()
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
启动完成后打开指定包名的应用
|
|
282
|
+
|
|
283
|
+
```python
|
|
284
|
+
Mumu().select('your_index').power.start('com.tencent.mobileqq')
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
#### 关闭模拟器(shutdown|stop)
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
Mumu().select('your_index').power.shutdown()
|
|
291
|
+
# or
|
|
292
|
+
Mumu().select('your_index').power.stop()
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
#### 重启模拟器(restart|reboot)
|
|
296
|
+
|
|
297
|
+
```python
|
|
298
|
+
Mumu().select('your_index').power.restart()
|
|
299
|
+
# or
|
|
300
|
+
Mumu().select('your_index').power.reboot()
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 窗口类(window)
|
|
304
|
+
|
|
305
|
+
#### 显示窗口(show)
|
|
306
|
+
|
|
307
|
+
```python
|
|
308
|
+
Mumu().select('your_index').window.show()
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
#### 隐藏窗口(hidden)
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
Mumu().select('your_index').window.hidden()
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
#### 调整窗口大小或位置(layout)
|
|
318
|
+
|
|
319
|
+
该方法可以接受4个参数,分别是x坐标、y坐标、宽度、高度
|
|
320
|
+
|
|
321
|
+
```python
|
|
322
|
+
Mumu().select('your_index').window.layout(0, 0, 800, 600)
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
如果只希望调整窗口的大小
|
|
326
|
+
|
|
327
|
+
```python
|
|
328
|
+
Mumu().select('your_index').window.layout(None, None, 1080, 1920)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
也可以只调整一个参数
|
|
332
|
+
|
|
333
|
+
```python
|
|
334
|
+
Mumu().select('your_index').window.layout(300, None, None, None)
|
|
335
|
+
# or
|
|
336
|
+
Mumu().select('your_index').window.layout(None, None, 1080, None)
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### 应用类(app)
|
|
340
|
+
|
|
341
|
+
#### 安装一个应用(install)
|
|
342
|
+
|
|
343
|
+
该方法接受一个参数,即apk文件的路径,当apk路径无法访问时,会抛出``FileNotFoundError``异常
|
|
344
|
+
|
|
345
|
+
```python
|
|
346
|
+
Mumu().select('your_index').app.install(r'C:\test.apk')
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### 卸载一个应用(uninstall)
|
|
350
|
+
|
|
351
|
+
该方法接受一个参数,即应用的包名
|
|
352
|
+
|
|
353
|
+
```python
|
|
354
|
+
Mumu().select('your_index').app.uninstall('com.miHoYo.Yuanshen')
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
#### 启动模拟器里的应用(launch)
|
|
358
|
+
|
|
359
|
+
该方法接受一个参数,即应用的包名
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
# 启动原神
|
|
363
|
+
Mumu().select('your_index').app.launch('com.miHoYo.Yuanshen')
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
#### 关闭模拟器里的应用(close)
|
|
367
|
+
|
|
368
|
+
该方法接受一个参数,即应用的包名
|
|
369
|
+
|
|
370
|
+
```python
|
|
371
|
+
# 关闭原神
|
|
372
|
+
Mumu().select('your_index').app.close('com.miHoYo.Yuanshen')
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
#### * 判断应用是否存在(exists)
|
|
376
|
+
|
|
377
|
+
该方法接受一个参数,即应用的包名
|
|
378
|
+
|
|
379
|
+
```python
|
|
380
|
+
# 判断原神是否存在
|
|
381
|
+
if (Mumu().select('your_index').app.exists('com.miHoYo.Yuanshen')):
|
|
382
|
+
print('原神已安装')
|
|
383
|
+
else:
|
|
384
|
+
print('原神未安装')
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
#### * 判断应用是否不存在(doesntExists)
|
|
388
|
+
|
|
389
|
+
该方法接受一个参数,即应用的包名
|
|
390
|
+
|
|
391
|
+
```python
|
|
392
|
+
# 判断原神是否不存在
|
|
393
|
+
if (Mumu().select('your_index').app.doesntExists('com.miHoYo.Yuanshen')):
|
|
394
|
+
print('原神未安装')
|
|
395
|
+
else:
|
|
396
|
+
print('原神已安装')
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
#### 获取已经安装的应用列表(get_installed)
|
|
400
|
+
|
|
401
|
+
```python
|
|
402
|
+
# 获取已经安装的应用列表
|
|
403
|
+
Mumu().select(1).app.get_installed()
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
返回一个列表,当没有安装任何应用时,返回一个空列表
|
|
407
|
+
|
|
408
|
+
```python
|
|
409
|
+
[
|
|
410
|
+
{
|
|
411
|
+
'package': 'com.miHoYo.Yuanshen', # 包名
|
|
412
|
+
'app_name': '原神', # 应用名称
|
|
413
|
+
'version': '4.1.8' # 版本号
|
|
414
|
+
},
|
|
415
|
+
]
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
#### * 获取应用状态(state)
|
|
419
|
+
|
|
420
|
+
该方法接受一个参数,即应用的包名,返回一个字符串,`running`表示应用正在运行,`stopped`表示应用未运行,`not_installed`表示应用未安装
|
|
421
|
+
|
|
422
|
+
```python
|
|
423
|
+
# 获取原神的状态
|
|
424
|
+
Mumu().select('your_index').app.state('com.miHoYo.Yuanshen')
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### 核心类(core)
|
|
428
|
+
|
|
429
|
+
#### 创建模拟器(create)
|
|
430
|
+
|
|
431
|
+
该方法接受一个参数,即模拟器的名称,返回一个list包含所创建的模拟器索引
|
|
432
|
+
|
|
433
|
+
举例:创建一个模拟器
|
|
434
|
+
|
|
435
|
+
```python
|
|
436
|
+
Mumu().core.create()
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
举例:创建5个模拟器
|
|
440
|
+
|
|
441
|
+
```python
|
|
442
|
+
Mumu().core.create(5)
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
举例:创建一个索引为``10``的模拟器
|
|
446
|
+
|
|
447
|
+
```python
|
|
448
|
+
Mumu().select(10).core.create()
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
从索引3开始创建5个模拟器
|
|
452
|
+
|
|
453
|
+
```python
|
|
454
|
+
Mumu().select(3).core.create(5)
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
从索引 3,20 开始,分别创建10次模拟器,索引依次递增(即创建3-12,20-29索引的模拟器)
|
|
458
|
+
|
|
459
|
+
```python
|
|
460
|
+
Mumu().select(3, 20).core.create(10)
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
#### 克隆模拟器(clone)
|
|
464
|
+
|
|
465
|
+
该方法接受一个参数,即为克隆的数量,但是调用该方法前需要先选择一个模拟器,返回一个list包含所创建的模拟器索引
|
|
466
|
+
|
|
467
|
+
举例:克隆索引为2的模拟器
|
|
468
|
+
|
|
469
|
+
```python
|
|
470
|
+
Mumu().select(2).core.clone()
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
举例:复制索引为 2,4,6 的模拟器
|
|
474
|
+
|
|
475
|
+
```python
|
|
476
|
+
Mumu().select(2, 4, 6).core.clone()
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
举例:复制索引为2的模拟器,复制10次
|
|
480
|
+
|
|
481
|
+
```python
|
|
482
|
+
Mumu().select(2).core.clone(10)
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
举例:复制所有模拟器
|
|
486
|
+
|
|
487
|
+
```python
|
|
488
|
+
Mumu().all().core.clone()
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
#### 删除模拟器(delete)
|
|
492
|
+
|
|
493
|
+
该方法不需要传入参数,但是调用该方法前需要先选择一个模拟器,返回bool值,表示是否删除成功
|
|
494
|
+
|
|
495
|
+
举例:删除索引为2的模拟器
|
|
496
|
+
|
|
497
|
+
```python
|
|
498
|
+
if Mumu().select(2).core.delete():
|
|
499
|
+
print('删除成功')
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
举例:删除索引为2,4,6的模拟器
|
|
503
|
+
|
|
504
|
+
```python
|
|
505
|
+
Mumu().select(2, 4, 6).core.delete()
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
举例:删除所有模拟器(危险操作)
|
|
509
|
+
|
|
510
|
+
```python
|
|
511
|
+
Mumu().all().core.delete()
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
#### 重命名模拟器(rename)
|
|
515
|
+
|
|
516
|
+
该方法接受一个参数,即为新的模拟器名称,但是调用该方法前需要先选择一个模拟器,返回bool值,表示是否重命名成功。
|
|
517
|
+
|
|
518
|
+
举例:重命名索引为2的模拟器为“测试”
|
|
519
|
+
|
|
520
|
+
```python
|
|
521
|
+
if Mumu().select(2).core.rename('测试'):
|
|
522
|
+
print('重命名成功')
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
举例:重命名索引为2,4,6的模拟器为“测试”
|
|
526
|
+
|
|
527
|
+
```python
|
|
528
|
+
Mumu().select(2, 4, 6).core.rename('测试')
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
举例:重命名所有的模拟器为“测试”
|
|
532
|
+
|
|
533
|
+
```python
|
|
534
|
+
Mumu().all().core.rename('测试')
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
#### 备份模拟器(export)
|
|
538
|
+
|
|
539
|
+
该方法接受三个参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否备份成功。
|
|
540
|
+
|
|
541
|
+
| 参数 | 说明 |
|
|
542
|
+
|------|-----------|
|
|
543
|
+
| dir | 备份的路径 |
|
|
544
|
+
| name | 备份的名称 |
|
|
545
|
+
| zip | 是否使用zip压缩 |
|
|
546
|
+
|
|
547
|
+
举例:备份索引为2的模拟器到C盘目录 backup 下,名称为 test.mumudata,以非压缩的格式
|
|
548
|
+
|
|
549
|
+
```python
|
|
550
|
+
if Mumu().select(2).core.export(r'C:\backup', 'test'):
|
|
551
|
+
print('备份成功')
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
举例:备份索引为2,4,6的模拟器到C盘目录 backup 下,文件名基于 test 自动加后缀,以非压缩的格式
|
|
555
|
+
|
|
556
|
+
```python
|
|
557
|
+
Mumu().select(2, 4, 6).core.export(r'C:\backup', 'test')
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
举例:备份所有的模拟器到C盘目录 backup 下,文件名基于 test 自动加后缀,以压缩的格式
|
|
561
|
+
|
|
562
|
+
```python
|
|
563
|
+
Mumu().all().core.export(r'C:\backup', 'test', True)
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
#### 导入模拟器(import_)
|
|
567
|
+
|
|
568
|
+
该方法接受一个参数,即为备份文件的路径,如果传入一个列表,则表示导入多个,调用该方法前需要先选择一个模拟器,返回bool值,表示是否导入成功。
|
|
569
|
+
|
|
570
|
+
举例:导入C盘下的 test.mumudata 并创建模拟器
|
|
571
|
+
|
|
572
|
+
```python
|
|
573
|
+
if Mumu().select(2).core.import_(r'C:\test.mumudata'):
|
|
574
|
+
print('导入成功')
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
举例:导入C盘下的 test.mumudata 并创建模拟器,导入10次
|
|
578
|
+
|
|
579
|
+
```python
|
|
580
|
+
Mumu().select(2).core.import_(r'C:\test.mumudata', 10)
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
举例:导入C盘下的 test.mumudata 和D盘下的 test2.mumudata 并创建模拟器,分别导入10次
|
|
584
|
+
|
|
585
|
+
```python
|
|
586
|
+
Mumu().select(2).core.import_([r'C:\test.mumudata', r'D:\test2.mumudata'], 10)
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
#### 限制CPU使用率(limit_cpu)
|
|
590
|
+
|
|
591
|
+
该方法接受一个参数,即为CPU使用率,调用该方法前需要先选择一个模拟器,返回bool值,表示是否设置成功。
|
|
592
|
+
|
|
593
|
+
举例:在索引为2的模拟器中限制CPU为50%
|
|
594
|
+
|
|
595
|
+
```python
|
|
596
|
+
Mumu().select(2).core.limit_cpu(50)
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
举例:在索引为2,4,6的模拟器中限制CPU为50%
|
|
600
|
+
|
|
601
|
+
```python
|
|
602
|
+
Mumu().select(2, 4, 6).core.limit_cpu(50)
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
举例:在所有模拟器中限制CPU为50%
|
|
606
|
+
|
|
607
|
+
```python
|
|
608
|
+
Mumu().all().core.limit_cpu(50)
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
### 安卓事件类(androidEvent)
|
|
612
|
+
|
|
613
|
+
该类提供了安卓事件操作,可以通过该类实现对模拟器的操作。
|
|
614
|
+
|
|
615
|
+
调用类的所有方法前需要先选择一个模拟器,返回bool值,表示是否操作成功。
|
|
616
|
+
方法未特殊说明时,均无需传入参数。
|
|
617
|
+
|
|
618
|
+
#### 屏幕旋转(rotate)
|
|
619
|
+
|
|
620
|
+
```python
|
|
621
|
+
Mumu().select(1).androidEvent.rotate()
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
#### 返回主页(go_home)
|
|
625
|
+
|
|
626
|
+
```python
|
|
627
|
+
Mumu().select(1).androidEvent.go_home()
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
#### 返回(back)
|
|
631
|
+
|
|
632
|
+
```python
|
|
633
|
+
Mumu().select(1).androidEvent.go_back()
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
#### 窗口置顶(top_most)
|
|
637
|
+
|
|
638
|
+
```python
|
|
639
|
+
Mumu().select(1).androidEvent.top_most()
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
#### 窗口全屏(fullscreen)
|
|
643
|
+
|
|
644
|
+
```python
|
|
645
|
+
Mumu().select(1).androidEvent.fullscreen()
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
#### 摇一摇(shake)
|
|
649
|
+
|
|
650
|
+
```python
|
|
651
|
+
Mumu().select(1).androidEvent.shake()
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
#### 截图(screenshot)
|
|
655
|
+
|
|
656
|
+
```python
|
|
657
|
+
Mumu().select(1).androidEvent.screenshot()
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
#### 音量增加(volume_up)
|
|
661
|
+
|
|
662
|
+
```python
|
|
663
|
+
Mumu().select(1).androidEvent.volume_up()
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
#### 音量减少(volume_down)
|
|
667
|
+
|
|
668
|
+
```python
|
|
669
|
+
Mumu().select(1).androidEvent.volume_down()
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
#### 音量静音(volume_mute)
|
|
673
|
+
|
|
674
|
+
```python
|
|
675
|
+
Mumu().select(1).androidEvent.volume_mute()
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
#### 任务键(go_task)
|
|
679
|
+
|
|
680
|
+
```python
|
|
681
|
+
Mumu().select(1).androidEvent.go_task()
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
#### 修改虚拟定位(location)
|
|
685
|
+
|
|
686
|
+
该方法接受两个参数,分别是经度和纬度
|
|
687
|
+
|
|
688
|
+
举例:在索引为2的模拟器中修改虚拟定位为经度114.1,纬度-23
|
|
689
|
+
|
|
690
|
+
```python
|
|
691
|
+
Mumu().select(2).androidEvent.location(114.1, -23)
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
举例: 在索引为2,4,6的模拟器中修改虚拟定位为经度114.1,纬度-23
|
|
695
|
+
|
|
696
|
+
```python
|
|
697
|
+
Mumu().select(2, 4, 6).androidEvent.location(114.1, -23)
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
举例:在所有模拟器中修改虚拟定位为经度114.1,纬度-23
|
|
701
|
+
|
|
702
|
+
```python
|
|
703
|
+
Mumu().all().androidEvent.location(114.1, -23)
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
#### 修改重力感应(gyro)
|
|
707
|
+
|
|
708
|
+
该方法接受三个参数,分别是x轴、y轴、z轴
|
|
709
|
+
|
|
710
|
+
举例:在索引为2的模拟器中修改重力感应X=40,Y=20,Z=30
|
|
711
|
+
|
|
712
|
+
```python
|
|
713
|
+
Mumu().select(2).androidEvent.gyro(40, 20, 30)
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
举例:在索引为2,4,6的模拟器中修改重力感应X=40,Y=20,Z=30
|
|
717
|
+
|
|
718
|
+
```python
|
|
719
|
+
Mumu().select(2, 4, 6).androidEvent.gyro(40, 20, 30)
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
举例:在所有模拟器中修改重力感应X=40,Y=20,Z=30
|
|
723
|
+
|
|
724
|
+
```python
|
|
725
|
+
Mumu().all().androidEvent.gyro(40, 20, 30)
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
### 快捷方式类(shortcut)
|
|
729
|
+
|
|
730
|
+
#### 创建桌面快捷方式(create)
|
|
731
|
+
|
|
732
|
+
该方法接受三个参数,分别是快捷方式名称、快捷方式图标路径、应用包名
|
|
733
|
+
|
|
734
|
+
举例:在桌面创建索引为2的模拟器的快捷方式 test,图标用 C 盘的 test.ico,自动启动原神
|
|
735
|
+
|
|
736
|
+
```python
|
|
737
|
+
Mumu().select(2).shortcut.create('test', r'C:\test.ico', 'com.miHoYo.Yuanshen')
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
举例:在桌面创建索引为2,4,6的模拟器的快捷方式 test,图标用 C 盘的 test.ico,自动启动原神
|
|
741
|
+
|
|
742
|
+
```python
|
|
743
|
+
Mumu().select(2, 4, 6).shortcut.create('test', r'C:\test.ico', 'com.miHoYo.Yuanshen')
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
举例:在所有模拟器中创建快捷方式 test,图标用 C 盘的 test.ico,自动启动原神
|
|
747
|
+
|
|
748
|
+
```python
|
|
749
|
+
Mumu().all().shortcut.create('test', r'C:\test.ico', 'com.miHoYo.Yuanshen')
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
#### 删除桌面快捷方式(delete)
|
|
753
|
+
|
|
754
|
+
该方法无需传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否删除成功。
|
|
755
|
+
|
|
756
|
+
举例:删除索引为2的模拟器的快捷方式
|
|
757
|
+
|
|
758
|
+
```python
|
|
759
|
+
Mumu().select(2).shortcut.delete()
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
举例:删除索引为2,4,6的模拟器的快捷方式
|
|
763
|
+
|
|
764
|
+
```python
|
|
765
|
+
Mumu().select(2, 4, 6).shortcut.delete()
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
举例:删除所有模拟器的快捷方式
|
|
769
|
+
|
|
770
|
+
```python
|
|
771
|
+
Mumu().all().shortcut.delete()
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
### 机型类(simulation)
|
|
775
|
+
|
|
776
|
+
该类提供了模拟器机型操作。这玩意非常的鸡肋!!
|
|
777
|
+
|
|
778
|
+
#### 修改MAC地址(mac_address)
|
|
779
|
+
|
|
780
|
+
该方法接受一个参数,即为新的MAC地址,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
781
|
+
|
|
782
|
+
```python
|
|
783
|
+
Mumu().select(1).simulation.mac_address('00:11:22:33:44:55')
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
举例:为索引为1的模拟器随机生成一个MAC地址,两种方式均可
|
|
787
|
+
|
|
788
|
+
```python
|
|
789
|
+
from mumu.constant import MacAddress
|
|
790
|
+
|
|
791
|
+
# 第一种:传入一个MAC地址
|
|
792
|
+
Mumu().select(1).simulation.mac_address(MacAddress.random())
|
|
793
|
+
|
|
794
|
+
# 第二种:当不传入参数时,表示随机生成一个MAC地址
|
|
795
|
+
Mumu().select(1).simulation.mac_address()
|
|
796
|
+
```
|
|
797
|
+
|
|
798
|
+
#### 修改IMEI(imei)
|
|
799
|
+
|
|
800
|
+
安卓12不允许应用获取IMEI
|
|
801
|
+
|
|
802
|
+
该方法接受一个参数,即为新的IMEI,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
803
|
+
|
|
804
|
+
```python
|
|
805
|
+
Mumu().select(1).simulation.imei('123456789012345')
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
举例:为索引为1的模拟器随机生成一个IMEI,两种方式均可
|
|
809
|
+
|
|
810
|
+
```python
|
|
811
|
+
from mumu.constant import IMEI
|
|
812
|
+
|
|
813
|
+
# 第一种:传入一个IMEI
|
|
814
|
+
Mumu().select(1).simulation.imei(IMEI.random())
|
|
815
|
+
|
|
816
|
+
# 第二种:当不传入参数时,表示随机生成一个IMEI
|
|
817
|
+
Mumu().select(1).simulation.imei()
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
#### 修改IMSI(imsi)
|
|
821
|
+
|
|
822
|
+
安卓12不允许应用获取IMSI
|
|
823
|
+
|
|
824
|
+
该方法接受一个参数,即为新的IMSI,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
825
|
+
|
|
826
|
+
```python
|
|
827
|
+
Mumu().select(1).simulation.imsi('460000000000000')
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
举例:为索引为1的模拟器随机生成一个IMSI,两种方式均可
|
|
831
|
+
|
|
832
|
+
```python
|
|
833
|
+
from mumu.constant import IMSI
|
|
834
|
+
|
|
835
|
+
# 第一种:传入一个IMSI
|
|
836
|
+
Mumu().select(1).simulation.imsi(IMSI.random())
|
|
837
|
+
|
|
838
|
+
# 第二种:当不传入参数时,表示随机生成一个IMSI
|
|
839
|
+
Mumu().select(1).simulation.imsi()
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
#### 修改Android ID(android_id)
|
|
843
|
+
|
|
844
|
+
该方法接受一个参数,即为新的Android ID,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
845
|
+
|
|
846
|
+
```python
|
|
847
|
+
Mumu().select(1).simulation.android_id('1234567890123456')
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
举例:为索引为1的模拟器随机生成一个Android ID,两种方式均可
|
|
851
|
+
|
|
852
|
+
```python
|
|
853
|
+
from mumu.constant import AndroidID
|
|
854
|
+
|
|
855
|
+
# 第一种:传入一个Android ID
|
|
856
|
+
Mumu().select(1).simulation.android_id(AndroidID.random())
|
|
857
|
+
|
|
858
|
+
# 第二种:当不传入参数时,表示随机生成一个Android ID
|
|
859
|
+
Mumu().select(1).simulation.android_id()
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
#### 设置模拟器设备型号(model)
|
|
863
|
+
|
|
864
|
+
该方法接受一个参数,即为新的设备型号,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
865
|
+
|
|
866
|
+
```python
|
|
867
|
+
Mumu().select(1).simulation.model('MI 10')
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
#### 设置模拟器主板品牌(brand)
|
|
871
|
+
|
|
872
|
+
该方法接受一个参数,即为新的主板型号,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
873
|
+
|
|
874
|
+
```python
|
|
875
|
+
Mumu().select(1).simulation.brand('Xiaomi')
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
#### 设置模拟器硬件制造商(solution)
|
|
879
|
+
|
|
880
|
+
该方法接受一个参数,即为新的硬件型号,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
881
|
+
|
|
882
|
+
```python
|
|
883
|
+
Mumu().select(1).simulation.solution('qcom')
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
#### 设置模拟器手机号码(phone_number)
|
|
887
|
+
|
|
888
|
+
安卓12不允许应用获取手机号码
|
|
889
|
+
|
|
890
|
+
该方法接受一个参数,即为新的手机号码,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
891
|
+
|
|
892
|
+
```python
|
|
893
|
+
Mumu().select(1).simulation.phone_number('18888888888')
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
举例:随机设置一个手机号码,两种方式均可
|
|
897
|
+
|
|
898
|
+
```python
|
|
899
|
+
from mumu.constant import PhoneNumber
|
|
900
|
+
|
|
901
|
+
# 第一种:传入一个手机号码
|
|
902
|
+
Mumu().select(1).simulation.phone_number(PhoneNumber.random())
|
|
903
|
+
|
|
904
|
+
# 第二种:当不传入参数时,表示随机生成一个手机号码
|
|
905
|
+
Mumu().select(1).simulation.phone_number()
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
#### 设置模拟器GPU型号(gpu_model)
|
|
909
|
+
|
|
910
|
+
该方法提供4个参数,选填一个即可。
|
|
911
|
+
|
|
912
|
+
举例:设置索引为1的模拟器的GPU型号为GeForce RTX 3090
|
|
913
|
+
|
|
914
|
+
```python
|
|
915
|
+
Mumu().select(1).simulation.gpu_model('GeForce RTX 3090')
|
|
916
|
+
```
|
|
917
|
+
|
|
918
|
+
举例:设置索引为1的模拟器的GPU型号为高配
|
|
919
|
+
|
|
920
|
+
```python
|
|
921
|
+
Mumu().select(1).simulation.gpu_model(top_model=True)
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
举例:设置索引为1的模拟器的GPU型号为低配
|
|
925
|
+
|
|
926
|
+
```python
|
|
927
|
+
Mumu().select(1).simulation.gpu_model(low_model=True)
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
举例:设置索引为1的模拟器的GPU型号为中配
|
|
931
|
+
|
|
932
|
+
```python
|
|
933
|
+
Memu().select(1).simulation.gpu_model(middle_model=True)
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
### 配置类(setting)
|
|
937
|
+
|
|
938
|
+
该类提供了模拟器配置文件操作。
|
|
939
|
+
|
|
940
|
+
在配置类中,不选择任何模拟器即操作全局配置(默认值)
|
|
941
|
+
|
|
942
|
+
#### 获取模拟器配置所有配置项(all)
|
|
943
|
+
|
|
944
|
+
该方法提供一个参数`all_writable`,当传入`True`时,表示获取所有可写的配置项,当传入`False`时,表示获取所有配置项,返回一个字典,表示所有配置项的键值对。
|
|
945
|
+
|
|
946
|
+
举例:获取所有配置项
|
|
947
|
+
|
|
948
|
+
```python
|
|
949
|
+
Mumu().select(1).setting.all()
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
举例:获取所有可写的配置项
|
|
953
|
+
|
|
954
|
+
```python
|
|
955
|
+
Mumu().select(1).setting.all(True)
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
#### 获取一个或多个配置项(get)
|
|
959
|
+
|
|
960
|
+
该方法接受一个或多个参数,表示要获取的配置项,当获取单个配置项时,返回一个字符串,当获取多个配置项时,返回一个字典,表示所有配置项的键值对。
|
|
961
|
+
|
|
962
|
+
举例:获取指定一个或多个配置(返回字符串)
|
|
963
|
+
|
|
964
|
+
```python
|
|
965
|
+
value = Mumu().select(1).setting.get('window_size_fixed')
|
|
966
|
+
```
|
|
967
|
+
|
|
968
|
+
举例:获取多个配置项(返回字典)
|
|
969
|
+
|
|
970
|
+
```python
|
|
971
|
+
dict_val = Mumu().select(1).setting.get('window_size_fixed', 'window_save_rect')
|
|
972
|
+
```
|
|
973
|
+
|
|
974
|
+
#### 修改一个或多个配置(set)
|
|
975
|
+
|
|
976
|
+
该方法接受一个或多个参数,表示要设置的配置项,返回一个bool值,表示是否设置成功。
|
|
977
|
+
|
|
978
|
+
当传入参数的值为`None`时,表示还原默认值。
|
|
979
|
+
|
|
980
|
+
如果遇到需要写的配置键包含`.`或者`-`时,将`.`替换为两个`_`,`-`替换为三个`_`。
|
|
981
|
+
|
|
982
|
+
举例:修改索引为2的模拟器的配置 window_size_fixed 的值为 true
|
|
983
|
+
|
|
984
|
+
```python
|
|
985
|
+
Mumu().select(2).setting.set(window_size_fixed=True)
|
|
986
|
+
```
|
|
987
|
+
|
|
988
|
+
举例:修改索引为2的模拟器的配置 window_size_fixed 的值为 false,配置 window_save_rect 的值为 true
|
|
989
|
+
|
|
990
|
+
```python
|
|
991
|
+
Mumu().select(2).setting.set(window_size_fixed=False, window_save_rect=True)
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
修改索引为2的模拟器的还原配置 window_size_fixed 的值(将使用默认值)
|
|
995
|
+
|
|
996
|
+
```python
|
|
997
|
+
Mumu().select(2).setting.set(window_size_fixed=None)
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
#### 根据JSON文件内容修改配置(set_by_json)
|
|
1001
|
+
|
|
1002
|
+
该方法接受一个参数,即为JSON文件的路径,返回一个bool值,表示是否设置成功。
|
|
1003
|
+
|
|
1004
|
+
举例:
|
|
1005
|
+
|
|
1006
|
+
一个 utf8 格式 test.json 文件在C盘下,文件内容如下:
|
|
1007
|
+
|
|
1008
|
+
```json
|
|
1009
|
+
{
|
|
1010
|
+
"window_save_rect": "true",
|
|
1011
|
+
"window_size_fixed": "false"
|
|
1012
|
+
}
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
修改索引为2的模拟器的配置,通过JSON文件方式修改。
|
|
1016
|
+
|
|
1017
|
+
```python
|
|
1018
|
+
Mumu().select(2).setting.set_by_json(r'C:\test.json')
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
#### *判断某个配置是否等于某个值(equal)
|
|
1022
|
+
|
|
1023
|
+
该方法接受两个参数,分别是配置项和值,返回一个bool值,表示是否相等。
|
|
1024
|
+
|
|
1025
|
+
举例:判断索引为2的模拟器的配置 window_size_fixed 是否等于 true
|
|
1026
|
+
|
|
1027
|
+
```python
|
|
1028
|
+
if Mumu().select(2).setting.equal('window_size_fixed', True):
|
|
1029
|
+
print('相等')
|
|
1030
|
+
else:
|
|
1031
|
+
print('不相等')
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
#### *判断某个配置是否不等于某个值(not_equal)
|
|
1035
|
+
|
|
1036
|
+
该方法接受两个参数,分别是配置项和值,返回一个bool值,表示是否不相等。
|
|
1037
|
+
|
|
1038
|
+
举例:判断索引为2的模拟器的配置 window_size_fixed 是否不等于 true
|
|
1039
|
+
|
|
1040
|
+
```python
|
|
1041
|
+
if Mumu().select(2).setting.not_equal('window_size_fixed', True):
|
|
1042
|
+
print('不相等')
|
|
1043
|
+
else:
|
|
1044
|
+
print('相等')
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
#### *判断某个配置等于某个值时,修改为另一个值(equal_then_set)
|
|
1048
|
+
|
|
1049
|
+
该方法接受三个参数,分别是配置项、值和新值,返回一个bool值,表示是否修改成功。
|
|
1050
|
+
|
|
1051
|
+
举例:判断索引为2的模拟器的配置 window_size_fixed 是否等于 true,如果相等则修改为 false
|
|
1052
|
+
|
|
1053
|
+
```python
|
|
1054
|
+
Mumu().select(2).setting.equal_then_set('window_size_fixed', True, False)
|
|
1055
|
+
```
|
|
1056
|
+
|
|
1057
|
+
#### *判断某个配置不等于某个值时,修改为另一个值(not_equal_then_set)
|
|
1058
|
+
|
|
1059
|
+
该方法接受三个参数,分别是配置项、值和新值,返回一个bool值,表示是否修改成功。
|
|
1060
|
+
|
|
1061
|
+
当不传入新值时,将自动设置`值`
|
|
1062
|
+
|
|
1063
|
+
举例:判断索引为2的模拟器的配置 window_size_fixed 是否不等于 true,如果不相等则修改为 true
|
|
1064
|
+
|
|
1065
|
+
```python
|
|
1066
|
+
Mumu().select(2).setting.not_equal_then_set('window_size_fixed', True, True)
|
|
1067
|
+
|
|
1068
|
+
# or
|
|
1069
|
+
|
|
1070
|
+
Mumu().select(2).setting.not_equal_then_set('window_size_fixed', True)
|
|
1071
|
+
```
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
### *屏幕类(screen)
|
|
1076
|
+
|
|
1077
|
+
该类提供了模拟器屏幕操作。
|
|
1078
|
+
|
|
1079
|
+
#### 调整模拟器分辨率(resolution)
|
|
1080
|
+
|
|
1081
|
+
该方法接受两个参数,分别是宽度和高度,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1082
|
+
|
|
1083
|
+
举例:修改索引为2的模拟器的分辨率为 800x600
|
|
1084
|
+
|
|
1085
|
+
```python
|
|
1086
|
+
Mumu().select(2).screen.resolution(800, 600)
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
#### 设置为手机分辨率(resolution_mobile)
|
|
1090
|
+
|
|
1091
|
+
该方法不需要传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1092
|
+
|
|
1093
|
+
该方法调整的分辨率为 1080x1920 DPI 为 480
|
|
1094
|
+
|
|
1095
|
+
举例:设置索引为2的模拟器的分辨率为手机分辨率
|
|
1096
|
+
|
|
1097
|
+
```python
|
|
1098
|
+
Mumu().select(2).screen.resolution_mobile()
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
#### 设置为平板分辨率(resolution_tablet)
|
|
1102
|
+
|
|
1103
|
+
该方法不需要传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1104
|
+
|
|
1105
|
+
该方法调整的分辨率为 1920x1080 DPI 为 280
|
|
1106
|
+
|
|
1107
|
+
举例:设置索引为2的模拟器的分辨率为平板分辨率
|
|
1108
|
+
|
|
1109
|
+
```python
|
|
1110
|
+
Mumu().select(2).screen.resolution_tablet()
|
|
1111
|
+
```
|
|
1112
|
+
|
|
1113
|
+
#### 设置为超宽屏分辨率(resolution_ultrawide)
|
|
1114
|
+
|
|
1115
|
+
该方法不需要传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1116
|
+
|
|
1117
|
+
该方法调整的分辨率为 3200x1440 DPI 为 400
|
|
1118
|
+
|
|
1119
|
+
举例:设置索引为2的模拟器的分辨率为超宽屏分辨率
|
|
1120
|
+
|
|
1121
|
+
```python
|
|
1122
|
+
Mumu().select(2).screen.resolution_ultrawide()
|
|
1123
|
+
```
|
|
1124
|
+
|
|
1125
|
+
#### 调整模拟器DPI(dpi)
|
|
1126
|
+
|
|
1127
|
+
该方法接受一个参数,即为新的DPI,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1128
|
+
|
|
1129
|
+
举例:修改索引为2的模拟器的DPI为 240
|
|
1130
|
+
|
|
1131
|
+
```python
|
|
1132
|
+
Mumu().select(2).screen.dpi(240)
|
|
1133
|
+
```
|
|
1134
|
+
|
|
1135
|
+
#### 调整模拟器亮度(brightness)
|
|
1136
|
+
|
|
1137
|
+
该方法接受一个参数,即为新的亮度,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1138
|
+
|
|
1139
|
+
参数范围为0-100
|
|
1140
|
+
|
|
1141
|
+
举例:修改索引为2的模拟器的亮度为 50
|
|
1142
|
+
|
|
1143
|
+
```python
|
|
1144
|
+
Mumu().select(2).screen.brightness(50)
|
|
1145
|
+
```
|
|
1146
|
+
|
|
1147
|
+
#### 调整模拟器最大帧率(max_frame_rate)
|
|
1148
|
+
|
|
1149
|
+
该方法接受一个参数,即为新的最大帧率,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1150
|
+
|
|
1151
|
+
参数范围为1-240
|
|
1152
|
+
|
|
1153
|
+
举例:修改索引为2的模拟器的最大帧率为 60
|
|
1154
|
+
|
|
1155
|
+
```python
|
|
1156
|
+
Mumu().select(2).screen.max_frame_rate(60)
|
|
1157
|
+
# or
|
|
1158
|
+
Mumu().select(2).screen.max_frame_rate() # 缺省值为60
|
|
1159
|
+
```
|
|
1160
|
+
|
|
1161
|
+
#### 设置动态调整帧率(dynamic_adjust_frame_rate)
|
|
1162
|
+
|
|
1163
|
+
该方法接受两个参数,分别是`enable`和`dynamic_low_frame_rate_limit`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1164
|
+
|
|
1165
|
+
----
|
|
1166
|
+
|
|
1167
|
+
| 参数 | 类型 | 说明 |
|
|
1168
|
+
|------------------------------|------|--------------------------|
|
|
1169
|
+
| enable | bool | 是否启用动态调整帧率 |
|
|
1170
|
+
| dynamic_low_frame_rate_limit | int | 模拟器不是操作主窗口时,降低至的帧率,默认:15 |
|
|
1171
|
+
|
|
1172
|
+
----
|
|
1173
|
+
|
|
1174
|
+
举例:启用索引为2的模拟器的动态调整帧率,降低至15帧
|
|
1175
|
+
|
|
1176
|
+
```python
|
|
1177
|
+
Mumu().select(2).screen.dynamic_adjust_frame_rate(True, 15)
|
|
1178
|
+
```
|
|
1179
|
+
|
|
1180
|
+
举例:禁用索引为2的模拟器的动态调整帧率
|
|
1181
|
+
|
|
1182
|
+
```python
|
|
1183
|
+
Mumu().select(2).screen.dynamic_adjust_frame_rate(False)
|
|
1184
|
+
```
|
|
1185
|
+
|
|
1186
|
+
#### 设置垂直同步(vertical_sync)
|
|
1187
|
+
|
|
1188
|
+
该方法接受一个参数,即为`enable`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1189
|
+
|
|
1190
|
+
举例:启用索引为2的模拟器的垂直同步
|
|
1191
|
+
|
|
1192
|
+
```python
|
|
1193
|
+
Mumu().select(2).screen.vertical_sync(True)
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
举例:禁用索引为2的模拟器的垂直同步
|
|
1197
|
+
|
|
1198
|
+
```python
|
|
1199
|
+
Mumu().select(2).screen.vertical_sync(False)
|
|
1200
|
+
```
|
|
1201
|
+
|
|
1202
|
+
#### 显示帧率(show_frame_rate)
|
|
1203
|
+
|
|
1204
|
+
该方法接受一个参数,即为`enable`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1205
|
+
|
|
1206
|
+
举例:启用索引为2的模拟器的显示帧率
|
|
1207
|
+
|
|
1208
|
+
```python
|
|
1209
|
+
Mumu().select(2).screen.show_frame_rate(True)
|
|
1210
|
+
```
|
|
1211
|
+
|
|
1212
|
+
举例:禁用索引为2的模拟器的显示帧率
|
|
1213
|
+
|
|
1214
|
+
```python
|
|
1215
|
+
Mumu().select(2).screen.show_frame_rate(False)
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
#### 设置窗口自动旋转(window_auto_rotate)
|
|
1219
|
+
|
|
1220
|
+
该方法接受一个参数,即为`enable`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1221
|
+
|
|
1222
|
+
设置后,模拟器窗口会根据运行的应用自动旋转
|
|
1223
|
+
|
|
1224
|
+
举例:启用索引为2的模拟器的窗口自动旋转
|
|
1225
|
+
|
|
1226
|
+
```python
|
|
1227
|
+
Mumu().select(2).screen.window_auto_rotate(True)
|
|
1228
|
+
```
|
|
1229
|
+
|
|
1230
|
+
举例:禁用索引为2的模拟器的窗口自动旋转
|
|
1231
|
+
|
|
1232
|
+
```python
|
|
1233
|
+
Mumu().select(2).screen.window_auto_rotate(False)
|
|
1234
|
+
```
|
|
1235
|
+
|
|
1236
|
+
### 性能类(performance)
|
|
1237
|
+
|
|
1238
|
+
该类提供了模拟器性能操作。
|
|
1239
|
+
|
|
1240
|
+
该类的所有操作需要重启模拟器后生效。
|
|
1241
|
+
|
|
1242
|
+
#### 设置CPU和内存(set)
|
|
1243
|
+
|
|
1244
|
+
该方法接受两个参数,分别是CPU个数和内存大小,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1245
|
+
|
|
1246
|
+
CPU个数范围为1-16
|
|
1247
|
+
|
|
1248
|
+
内存大小范围为1-16,单位为GB,不支持小数
|
|
1249
|
+
|
|
1250
|
+
举例:设置索引为2的模拟器的CPU为4核,内存为4GB
|
|
1251
|
+
|
|
1252
|
+
```python
|
|
1253
|
+
Mumu().select(2).performance.set(4, 4)
|
|
1254
|
+
```
|
|
1255
|
+
|
|
1256
|
+
#### 设置CPU个数(cpu)
|
|
1257
|
+
|
|
1258
|
+
该方法接受一个参数,即为CPU个数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1259
|
+
|
|
1260
|
+
CPU个数范围为1-16
|
|
1261
|
+
|
|
1262
|
+
举例:设置索引为2的模拟器的CPU为4核
|
|
1263
|
+
|
|
1264
|
+
```python
|
|
1265
|
+
Mumu().select(2).performance.cpu(4)
|
|
1266
|
+
```
|
|
1267
|
+
|
|
1268
|
+
#### 设置内存大小(memory)
|
|
1269
|
+
|
|
1270
|
+
该方法接受一个参数,即为内存大小,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1271
|
+
|
|
1272
|
+
内存大小范围为1-16,单位为GB,不支持小数
|
|
1273
|
+
|
|
1274
|
+
举例:设置索引为2的模拟器的内存为4GB
|
|
1275
|
+
|
|
1276
|
+
```python
|
|
1277
|
+
Mumu().select(2).performance.memory(4)
|
|
1278
|
+
```
|
|
1279
|
+
|
|
1280
|
+
#### 设置强制使用独立显卡(force_discrete_graphics)
|
|
1281
|
+
|
|
1282
|
+
该方法接受一个参数,即为`enable`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1283
|
+
|
|
1284
|
+
举例:启用索引为2的模拟器的强制使用独立显卡
|
|
1285
|
+
|
|
1286
|
+
```python
|
|
1287
|
+
Mumu().select(2).performance.force_discrete_graphics(True)
|
|
1288
|
+
```
|
|
1289
|
+
|
|
1290
|
+
举例:禁用索引为2的模拟器的强制使用独立显卡
|
|
1291
|
+
|
|
1292
|
+
```python
|
|
1293
|
+
Mumu().select(2).performance.force_discrete_graphics(False)
|
|
1294
|
+
```
|
|
1295
|
+
|
|
1296
|
+
#### 显存使用策略(renderer_strategy)
|
|
1297
|
+
|
|
1298
|
+
该方法接受三个参数,选择一个即可。
|
|
1299
|
+
|
|
1300
|
+
举例:设置索引为2的模拟器的显存使用策略为自动
|
|
1301
|
+
|
|
1302
|
+
```python
|
|
1303
|
+
Mumu().select(2).performance.renderer_strategy(auto=True)
|
|
1304
|
+
# or
|
|
1305
|
+
Mumu().select(2).performance.renderer_strategy()
|
|
1306
|
+
```
|
|
1307
|
+
|
|
1308
|
+
举例:设置索引为2的模拟器的显存使用策略为资源占用更小
|
|
1309
|
+
|
|
1310
|
+
```python
|
|
1311
|
+
Mumu().select(2).performance.renderer_strategy(perf=True)
|
|
1312
|
+
```
|
|
1313
|
+
|
|
1314
|
+
举例:设置索引为2的模拟器的显存使用策略为画面表现更好
|
|
1315
|
+
|
|
1316
|
+
```python
|
|
1317
|
+
Mumu().select(2).performance.renderer_strategy(dis=True)
|
|
1318
|
+
```
|
|
1319
|
+
|
|
1320
|
+
#### 设置磁盘类型(disk_readonly)
|
|
1321
|
+
|
|
1322
|
+
该方法接受一个参数,即为`enable`,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1323
|
+
|
|
1324
|
+
`enable`缺省值为`True`,开启时,磁盘类型为(只读系统盘,官方推荐),关闭时,磁盘类型为(可写系统盘)
|
|
1325
|
+
|
|
1326
|
+
本方法提供一个助手方法`disk_writable`,用于设置磁盘类型为可写系统盘。
|
|
1327
|
+
|
|
1328
|
+
举例:设置索引为2的模拟器的磁盘类型为只读系统盘。
|
|
1329
|
+
|
|
1330
|
+
```python
|
|
1331
|
+
Mumu().select(2).performance.disk_readonly(True)
|
|
1332
|
+
|
|
1333
|
+
# or
|
|
1334
|
+
|
|
1335
|
+
Mumu().select(2).performance.disk_readonly()
|
|
1336
|
+
```
|
|
1337
|
+
|
|
1338
|
+
举例:设置索引为2的模拟器的磁盘类型为可写系统盘
|
|
1339
|
+
|
|
1340
|
+
```python
|
|
1341
|
+
Mumu().select(2).performance.disk_readonly(False)
|
|
1342
|
+
|
|
1343
|
+
# or
|
|
1344
|
+
|
|
1345
|
+
Mumu().select(2).performance.disk_writable()
|
|
1346
|
+
```
|
|
1347
|
+
|
|
1348
|
+
### *网络类(network)
|
|
1349
|
+
|
|
1350
|
+
该类提供了模拟器网络操作。
|
|
1351
|
+
|
|
1352
|
+
#### 获取所有可被桥接的网卡(get_bridge_card)
|
|
1353
|
+
|
|
1354
|
+
该方法返回一个列表,表示所有可被桥接的网卡。
|
|
1355
|
+
|
|
1356
|
+
举例:获取所有可被桥接的网卡
|
|
1357
|
+
|
|
1358
|
+
```python
|
|
1359
|
+
Mumu().select(1).network.get_bridge_card()
|
|
1360
|
+
```
|
|
1361
|
+
|
|
1362
|
+
示例返回:
|
|
1363
|
+
|
|
1364
|
+
```python
|
|
1365
|
+
['Realtek Gaming GbE Family Controller', 'Sangfor SSL VPN CS Support System VNIC', 'Microsoft KM-TEST 环回适配器',
|
|
1366
|
+
'Intel(R) Wi-Fi 6E AX211 160MHz']
|
|
1367
|
+
```
|
|
1368
|
+
|
|
1369
|
+
#### 设置网络桥接模式(bridge)
|
|
1370
|
+
|
|
1371
|
+
该方法接受两个参数,分别代表是否启用和网卡名称,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1372
|
+
|
|
1373
|
+
该方法需要安装“桥接驱动”才能使用。
|
|
1374
|
+
|
|
1375
|
+
举例:启用索引为2的模拟器的网络桥接模式,网卡名称为`Realtek Gaming GbE Family Controller`
|
|
1376
|
+
|
|
1377
|
+
```python
|
|
1378
|
+
Mumu().select(2).network.bridge(True, 'Realtek Gaming GbE Family Controller')
|
|
1379
|
+
```
|
|
1380
|
+
|
|
1381
|
+
举例:禁用索引为2的模拟器的网络桥接模式
|
|
1382
|
+
|
|
1383
|
+
```python
|
|
1384
|
+
Mumu().select(2).network.bridge(False)
|
|
1385
|
+
```
|
|
1386
|
+
|
|
1387
|
+
#### 设置网络为NAT模式(nat)
|
|
1388
|
+
|
|
1389
|
+
该方法无需传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1390
|
+
|
|
1391
|
+
举例:设置索引为2的模拟器的网络为NAT模式
|
|
1392
|
+
|
|
1393
|
+
```python
|
|
1394
|
+
Mumu().select(2).network.nat()
|
|
1395
|
+
```
|
|
1396
|
+
|
|
1397
|
+
#### 设置桥接模式IP设置方式为DHCP(bridge_dhcp)
|
|
1398
|
+
|
|
1399
|
+
该方法无需传入参数,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1400
|
+
|
|
1401
|
+
举例:设置索引为2的模拟器的桥接模式IP设置方式为DHCP
|
|
1402
|
+
|
|
1403
|
+
```python
|
|
1404
|
+
Mumu().select(2).network.bridge_dhcp()
|
|
1405
|
+
```
|
|
1406
|
+
|
|
1407
|
+
#### 设置桥接模式IP设置方式为静态(bridge_static)
|
|
1408
|
+
|
|
1409
|
+
该方法接受5个参数,分别是IP地址、子网掩码、网关、DNS1、DNS2,调用该方法前需要先选择一个模拟器,返回bool值,表示是否修改成功。
|
|
1410
|
+
|
|
1411
|
+
当不填写DNS时,默认DNS1为`8.8.8.8`,DNS2为`114.114.114.114`
|
|
1412
|
+
|
|
1413
|
+
举例:设置索引为2的模拟器的桥接模式IP设置方式为静态,IP地址为`192.168.10.10`,子网掩码为`255.255.255.0`
|
|
1414
|
+
,网关为`192.168.10.1`
|
|
1415
|
+
|
|
1416
|
+
```python
|
|
1417
|
+
Mumu().select(2).network.bridge_static('192.168.10.10', '255.255.255.0', '192.168.10.1')
|
|
1418
|
+
```
|
|
1419
|
+
|
|
1420
|
+
### ADB类(adb)
|
|
1421
|
+
|
|
1422
|
+
该类提供了ADB操作。
|
|
1423
|
+
|
|
1424
|
+
#### 获取模拟器的ADB连接信息(get_connect_info)
|
|
1425
|
+
|
|
1426
|
+
该无需传入参数,调用该方法前需要先选择一个模拟器,当选择一个模拟器时返回一个元组,包含IP和端口,当选择多个模拟器时返回一个字典,键为索引,值为IP和端口。
|
|
1427
|
+
|
|
1428
|
+
如果选择的模拟器无法获取到ADB连接信息,将返回`None,None`
|
|
1429
|
+
|
|
1430
|
+
举例:获取索引为2的模拟器的ADB连接信息
|
|
1431
|
+
|
|
1432
|
+
```python
|
|
1433
|
+
adb_ipaddr, adb_port = Mumu().select(2).adb.get_connect_info()
|
|
1434
|
+
```
|
|
1435
|
+
|
|
1436
|
+
举例:获取索引为2,4,6的模拟器的ADB连接信息
|
|
1437
|
+
|
|
1438
|
+
```python
|
|
1439
|
+
adb_info = Mumu().select(2, 4, 6).adb.get_connect_info()
|
|
1440
|
+
```
|
|
1441
|
+
|
|
1442
|
+
返回示例
|
|
1443
|
+
|
|
1444
|
+
```python
|
|
1445
|
+
{'2': ('172.30.20.123', 16416), '4': (None, None), '6': (None, None)}
|
|
1446
|
+
```
|
|
1447
|
+
|
|
1448
|
+
#### 点击屏幕(click)
|
|
1449
|
+
|
|
1450
|
+
该方法接受两个参数,分别是X坐标和Y坐标,调用该方法前需要先选择一个模拟器,返回bool值,表示是否点击成功。
|
|
1451
|
+
|
|
1452
|
+
举例:点击索引为2的模拟器的坐标为(100, 100)的位置
|
|
1453
|
+
|
|
1454
|
+
```python
|
|
1455
|
+
Mumu().select(2).adb.click(100, 100)
|
|
1456
|
+
```
|
|
1457
|
+
|
|
1458
|
+
举例:点击索引为2,4,6的模拟器的坐标为(100, 100)的位置
|
|
1459
|
+
|
|
1460
|
+
```python
|
|
1461
|
+
Mumu().select(2, 4, 6).adb.click(100, 100)
|
|
1462
|
+
```
|
|
1463
|
+
|
|
1464
|
+
#### 滑动屏幕(swipe)
|
|
1465
|
+
|
|
1466
|
+
该方法提供5个参数,分别是起始X坐标、起始Y坐标、结束X坐标、结束Y坐标和滑动时间,调用该方法前需要先选择一个模拟器,返回bool值,表示是否滑动成功。
|
|
1467
|
+
|
|
1468
|
+
举例:滑动索引为2的模拟器的坐标为(100, 100)到(200, 200)的位置,时间为500ms
|
|
1469
|
+
|
|
1470
|
+
```python
|
|
1471
|
+
Mumu().select(2).adb.swipe(100, 100, 200, 200, 500)
|
|
1472
|
+
# or
|
|
1473
|
+
Mumu().select(2).adb.swipe(100, 100, 200, 200) # 缺省值为500ms
|
|
1474
|
+
```
|
|
1475
|
+
|
|
1476
|
+
举例:滑动索引为2,4,6的模拟器的坐标为(100, 100)到(200, 200)的位置,时间为500ms
|
|
1477
|
+
|
|
1478
|
+
```python
|
|
1479
|
+
Mumu().select(2, 4, 6).adb.swipe(100, 100, 200, 200, 500)
|
|
1480
|
+
```
|
|
1481
|
+
|
|
1482
|
+
#### 文本输入(input_text)
|
|
1483
|
+
|
|
1484
|
+
该方法接受一个参数,即为要输入的文本,调用该方法前需要先选择一个模拟器,返回bool值,表示是否输入成功。
|
|
1485
|
+
|
|
1486
|
+
举例:在索引为2的模拟器中输入文本`Hello World`
|
|
1487
|
+
|
|
1488
|
+
```python
|
|
1489
|
+
Mumu().select(2).adb.input_text('Hello World')
|
|
1490
|
+
```
|
|
1491
|
+
|
|
1492
|
+
举例:在索引为2,4,6的模拟器中输入文本`Hello World`
|
|
1493
|
+
|
|
1494
|
+
```python
|
|
1495
|
+
Mumu().select(2, 4, 6).adb.input_text('Hello World')
|
|
1496
|
+
```
|
|
1497
|
+
|
|
1498
|
+
#### 模拟按键(key_event)
|
|
1499
|
+
|
|
1500
|
+
该方法接受一个参数,即为要模拟的按键,调用该方法前需要先选择一个模拟器,返回bool值,表示是否模拟成功。
|
|
1501
|
+
|
|
1502
|
+
举例:在索引为2的模拟器中模拟按键`HOME`
|
|
1503
|
+
|
|
1504
|
+
```python
|
|
1505
|
+
Mumu().select(2).adb.key_event(3)
|
|
1506
|
+
```
|
|
1507
|
+
|
|
1508
|
+
举例:通过本项目提供的按键常量模拟按键`HOME`
|
|
1509
|
+
|
|
1510
|
+
```python
|
|
1511
|
+
from mumu.constant import AndroidKey
|
|
1512
|
+
|
|
1513
|
+
Mumu().select(2).adb.key_event(AndroidKey.KEYCODE_HOME)
|
|
1514
|
+
```
|
|
1515
|
+
|
|
1516
|
+
举例:在索引为2,4,6的模拟器中模拟音量+
|
|
1517
|
+
|
|
1518
|
+
```python
|
|
1519
|
+
from mumu.constant import AndroidKey
|
|
1520
|
+
|
|
1521
|
+
Mumu().select(2, 4, 6).adb.key_event(AndroidKey.KEYCODE_VOLUME_UP)
|
|
1522
|
+
```
|
|
1523
|
+
|
|
1524
|
+
#### 上传文件(push)
|
|
1525
|
+
|
|
1526
|
+
该方法接受两个参数,分别是本地文件路径和模拟器文件路径,调用该方法前需要先选择一个模拟器,返回bool值,表示是否上传成功。
|
|
1527
|
+
|
|
1528
|
+
当上传失败时,会触发一个`warning`警告。
|
|
1529
|
+
|
|
1530
|
+
举例:上传索引为2的模拟器的本地文件`C:\test.txt`到模拟器的`/sdcard/test.txt`
|
|
1531
|
+
|
|
1532
|
+
```python
|
|
1533
|
+
Mumu().select(2).adb.push(r'C:\test.txt', '/sdcard/test.txt')
|
|
1534
|
+
```
|
|
1535
|
+
|
|
1536
|
+
举例:上传索引为2,4,6的模拟器的本地文件`C:\test.txt`到模拟器的`/sdcard/test.txt`
|
|
1537
|
+
|
|
1538
|
+
```python
|
|
1539
|
+
Mumu().select(2, 4, 6).adb.push(r'C:\test.txt', '/sdcard/test.txt')
|
|
1540
|
+
```
|
|
1541
|
+
|
|
1542
|
+
#### 上传文件到Download目录(push_download)
|
|
1543
|
+
|
|
1544
|
+
该方法提供两个参数,分别是本地文件路径和模拟器文件名,调用该方法前需要先选择一个模拟器,返回bool值,表示是否上传成功。
|
|
1545
|
+
|
|
1546
|
+
当`模拟器文件名`为`None`时,将自动使用本地文件名。
|
|
1547
|
+
|
|
1548
|
+
举例:上传索引为2的模拟器的本地文件`C:\test.txt`到模拟器的`Download`目录
|
|
1549
|
+
|
|
1550
|
+
```python
|
|
1551
|
+
Mumu().select(2).adb.push_download(r'C:\test.txt')
|
|
1552
|
+
```
|
|
1553
|
+
|
|
1554
|
+
举例:上传索引为2,4,6的模拟器的本地文件`C:\test.txt`到模拟器的`Download`目录,重命名为:`test1.txt`
|
|
1555
|
+
|
|
1556
|
+
```python
|
|
1557
|
+
Mumu().select(2, 4, 6).adb.push_download(r'C:\test.txt', 'test1.txt')
|
|
1558
|
+
```
|
|
1559
|
+
|
|
1560
|
+
#### 下载文件(pull)
|
|
1561
|
+
|
|
1562
|
+
该方法提供两个参数,分别是模拟器文件路径和本地文件路径,调用该方法前需要先选择一个模拟器,返回bool值,表示是否下载成功。
|
|
1563
|
+
|
|
1564
|
+
当下载失败时,会触发一个`warning`警告。
|
|
1565
|
+
|
|
1566
|
+
举例:下载索引为2的模拟器的模拟器文件`/sdcard/test.txt`到本地的`C:\test.txt`
|
|
1567
|
+
|
|
1568
|
+
```python
|
|
1569
|
+
Mumu().select(2).adb.pull('/sdcard/test.txt', r'C:\test.txt')
|
|
1570
|
+
```
|
|
1571
|
+
|
|
1572
|
+
#### 清理应用数据(clear)
|
|
1573
|
+
|
|
1574
|
+
该方法接受一个参数,即为应用包名,调用该方法前需要先选择一个模拟器,返回bool值,表示是否清理成功。
|
|
1575
|
+
|
|
1576
|
+
如果包名错误会抛出异常
|
|
1577
|
+
|
|
1578
|
+
举例:清理索引为2的模拟器的应用数据
|
|
1579
|
+
|
|
1580
|
+
```python
|
|
1581
|
+
Mumu().select(2).adb.clear('com.miHoYo.Yuanshen')
|
|
1582
|
+
```
|
|
1583
|
+
|
|
1584
|
+
### GUI自动化类(auto)
|
|
1585
|
+
|
|
1586
|
+
本类提供了模拟器的GUI自动化操作,例如:通过图片定位、坐标定位、文字定位实现自动化操作。
|
|
1587
|
+
|
|
1588
|
+
先决条件:需要安装`opencv-python`库,可以通过`pip install opencv-python`安装。
|
|
1589
|
+
|
|
1590
|
+
如果希望使用本项目自带的投屏功能,需要安装`scrcpy`,可以通过`pip install scrcpy-client`安装。
|
|
1591
|
+
|
|
1592
|
+
#### 处理模拟器实时帧(create_handle)
|
|
1593
|
+
|
|
1594
|
+
该方法接受一个参数`handle`,传入一个方法,用于处理模拟器的帧。
|
|
1595
|
+
|
|
1596
|
+
该方法基于`scrcpy`实现,如果您的应用对该软件有限制,请勿使用。
|
|
1597
|
+
|
|
1598
|
+
使用该方法,会自动创建`2`个子线程,一个用于接收模拟器的帧,一个用于处理帧。
|
|
1599
|
+
|
|
1600
|
+
`handle`方法包含两个参数`frame`和`mumu`,分别表示帧和当前模拟器对象。
|
|
1601
|
+
|
|
1602
|
+
`frame`为`numpy`数组,可以直接使用`opencv`的方法处理。
|
|
1603
|
+
`mumu`为当前模拟器对象,仅选中了当前模拟器。
|
|
1604
|
+
|
|
1605
|
+
举例:处理索引为2的模拟器的帧
|
|
1606
|
+
|
|
1607
|
+
```python
|
|
1608
|
+
def handle(frame, mumu):
|
|
1609
|
+
# do something
|
|
1610
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
Mumu().select(2).auto.create_handle(handle)
|
|
1614
|
+
```
|
|
1615
|
+
|
|
1616
|
+
举例:处理索引为2,4,6的模拟器的帧
|
|
1617
|
+
|
|
1618
|
+
```python
|
|
1619
|
+
def handle(frame, mumu):
|
|
1620
|
+
# do something
|
|
1621
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1622
|
+
|
|
1623
|
+
|
|
1624
|
+
Mumu().select(2, 4, 6).auto.create_handle(handle)
|
|
1625
|
+
```
|
|
1626
|
+
|
|
1627
|
+
#### 保存模拟器实时帧(save)
|
|
1628
|
+
|
|
1629
|
+
该方法接受两个参数,分别为`frame`和`path`,用于保存模拟器的帧。
|
|
1630
|
+
|
|
1631
|
+
举例:保存帧到`C:\test.png`
|
|
1632
|
+
|
|
1633
|
+
```python
|
|
1634
|
+
def handle(frame, mumu):
|
|
1635
|
+
mumu.auto.save(frame, r'C:\test.png')
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
Mumu().select(2).auto.create_handle(handle)
|
|
1639
|
+
```
|
|
1640
|
+
|
|
1641
|
+
举例:保存索引为3的模拟器的帧到`C:\test.png`
|
|
1642
|
+
|
|
1643
|
+
```python
|
|
1644
|
+
def handle(frame, mumu):
|
|
1645
|
+
if mumu.core.utils.get_vm_id() == '3':
|
|
1646
|
+
mumu.auto.save(frame, r'C:\test.png')
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
Mumu().select(2, 3).auto.create_handle(handle)
|
|
1650
|
+
```
|
|
1651
|
+
|
|
1652
|
+
#### 在帧中查找第一个图片(locateOnScreen)
|
|
1653
|
+
|
|
1654
|
+
该方法接受4个参数,分别为`haystack`、`needle`、`confidence`和`grayscale`,用于在帧中查找图片。
|
|
1655
|
+
|
|
1656
|
+
`confidence`为相似度,范围为0-1,缺省值为0.8
|
|
1657
|
+
|
|
1658
|
+
`grayscale`为是否使用灰度查找,缺省值为`False
|
|
1659
|
+
|
|
1660
|
+
举例:在帧中查找图片`C:\test.png`
|
|
1661
|
+
|
|
1662
|
+
```python
|
|
1663
|
+
def handle(frame, mumu):
|
|
1664
|
+
# do something
|
|
1665
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1666
|
+
pos = mumu.auto.locateOnScreen(frame, r'C:\test.png')
|
|
1667
|
+
if pos:
|
|
1668
|
+
print('找到图片:', pos)
|
|
1669
|
+
else:
|
|
1670
|
+
print('未找到图片')
|
|
1671
|
+
```
|
|
1672
|
+
|
|
1673
|
+
#### 在帧中查找第一张图片的中心点(locateCenterOnScreen)
|
|
1674
|
+
|
|
1675
|
+
该方法接受4个参数,分别为`haystack`、`needle`、`confidence`和`grayscale`,用于在帧中查找图片。
|
|
1676
|
+
|
|
1677
|
+
`confidence`为相似度,范围为0-1,缺省值为0.8
|
|
1678
|
+
|
|
1679
|
+
`grayscale`为是否使用灰度查找,缺省值为`False
|
|
1680
|
+
|
|
1681
|
+
```python
|
|
1682
|
+
def handle(frame, mumu):
|
|
1683
|
+
# do something
|
|
1684
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1685
|
+
pos = mumu.auto.locateCenterOnScreen(frame, r'C:\test.png')
|
|
1686
|
+
if pos:
|
|
1687
|
+
print('找到图片中心点:', pos)
|
|
1688
|
+
else:
|
|
1689
|
+
print('未找到图片')
|
|
1690
|
+
|
|
1691
|
+
```
|
|
1692
|
+
|
|
1693
|
+
#### 在帧中查找所有图片(locateAllOnScreen)
|
|
1694
|
+
|
|
1695
|
+
该方法接受4个参数,分别为`haystack`、`needle`、`confidence`和`grayscale`,用于在帧中查找图片。
|
|
1696
|
+
|
|
1697
|
+
`confidence`为相似度,范围为0-1,缺省值为0.8
|
|
1698
|
+
`grayscale`为是否使用灰度查找,缺省值为`False
|
|
1699
|
+
|
|
1700
|
+
```python
|
|
1701
|
+
def handle(frame, mumu):
|
|
1702
|
+
# do something
|
|
1703
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1704
|
+
pos = mumu.auto.locateAllOnScreen(frame, r'C:\test.png')
|
|
1705
|
+
if pos:
|
|
1706
|
+
print('找到图片:', pos)
|
|
1707
|
+
else:
|
|
1708
|
+
print('未找到图片')
|
|
1709
|
+
|
|
1710
|
+
```
|
|
1711
|
+
|
|
1712
|
+
#### 获取Box的中心点(center)
|
|
1713
|
+
|
|
1714
|
+
该方法接受一个参数,即为`box`,用于获取Box的中心点,返回x和y
|
|
1715
|
+
|
|
1716
|
+
`box`为一个元组,包含4个元素,分别为左上角x、左上角y、右下角x、右下角y
|
|
1717
|
+
|
|
1718
|
+
```python
|
|
1719
|
+
def handle(frame, mumu):
|
|
1720
|
+
# do something
|
|
1721
|
+
print('接收到模拟器:', mumu.core.utils.get_vm_id(), '的帧')
|
|
1722
|
+
pos = mumu.auto.locateOnScreen(frame, r'C:\test.png')
|
|
1723
|
+
if pos:
|
|
1724
|
+
print('找到图片:', pos)
|
|
1725
|
+
x, y = mumu.auto.center(pos)
|
|
1726
|
+
print('中心点:', x, y)
|
|
1727
|
+
else:
|
|
1728
|
+
print('未找到图片')
|
|
1729
|
+
|
|
1730
|
+
```
|
|
1731
|
+
|
|
1732
|
+
#### 实战举例
|
|
1733
|
+
|
|
1734
|
+
监听模拟器3的帧,当帧中出现`test.png`时,返回`找到了`,并返回当前时间和模拟器ID,然后返回到桌面。
|
|
1735
|
+
|
|
1736
|
+
```python
|
|
1737
|
+
def handle(frame, mumu: Mumu):
|
|
1738
|
+
if mumu.auto.locateOnScreen(frame, './test.png', confidence=0.75, grayscale=True):
|
|
1739
|
+
print("找到了", time.time(), '在模拟器', mumu.core.utils.get_vm_id())
|
|
1740
|
+
mumu.androidEvent.go_home()
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
Mumu().select(3).auto.create_handle(handle)
|
|
1744
|
+
|
|
1745
|
+
```
|
|
1746
|
+
|
|
1747
|
+
## 支持本项目
|
|
1748
|
+
|
|
1749
|
+
作者:wlkjyy
|
|
1750
|
+
|
|
1751
|
+
Mail:<wlkjyy@vip.qq.com>
|
|
1752
|
+
|
|
1753
|
+
WeCHAT:laravel_debug
|