MuMuManager.exe是MuMu模拟器12新加入的工具,可以用来操控模拟器,查询模拟器或应用状态。
MuMu模拟器12的调用程序MuMuManager.exe在模拟器的安装目录下可以找到,如:"D:\MuMuPlayer12\nx_main\MuMuManager.exe"
注:模拟器版本需要V4.0.0.3179及以上版本模拟器才可使用该功能。

一、获取模拟器信息(info)
使用:info [--vmindex <vmindex>]
参数:-v, --vmindex <vmindex> 选择指定的模拟器索引
# 获取指定某个模拟器信息MuMuManager.exe info -v 0# 获取多个模拟器的信息MuMuManager.exe info -v 0,2,4# 获取所有模拟器的信息MuMuManager.exe info -v all

字段注解:
{"adb_host_ip": "127.0.0.1", // adb 域名,只有启动才会有"adb_port": 16384, // adb端口,只有启动才会有"created_timestamp": 1721180910349678, // 模拟器创建时间戳"disk_size_bytes": 284192948, // 模拟器磁盘占用大小,以字节为单位"error_code": 0, // 模拟器列表错误码"headless_pid": 20868, // 虚拟机进程PID,只有启动才会有"hyperv_enabled": false, // HyperV是否开启"index": "0", // 模拟器索引"is_android_started": false, // 是否安卓启动成功"is_main": true, // 是否是主模拟器"is_process_started": true, // 是否进程启动"launch_err_code": 0, // 启动错误码,只有启动才会有"launch_err_msg": "", // 启动错误描述,只有启动才会有"launch_time": 2222, // 模拟器运行时间,只有启动才会有"main_wnd": "00840F4E", // 主窗口句柄,只有启动才会有"name": "MuMu模拟器12", // 模拟器名称"pid": 15112, // 模拟器外壳进程PID,只有启动才会有"player_state": "starting_rom", // 模拟器外壳启动阶段状态,只有启动才会有"render_wnd": "00B30C7A", // 渲染窗口句柄,只有启动才会有"vt_enabled": true // 是否开启VT虚拟化,只有启动才会有}二、控制模拟器(control)
使用:control [--vmindex <vmindex>] <subcommand>
参数:-v, --vmindex <vmindex> 选择要控制的模拟器索引
2.1 启动模拟器(launch)
# 使用control [--vmindex <vmindex>] launch [--package <package>]
# 参数-v, --vmindex <vmindex> 选择要启动的模拟器索引 -pkg, --package <package> 启动时自动启动应用的应用包名
# 启动索引为2的模拟器MuMuManager.exe control -v 2 launch# 启动索引2,4,6的模拟器MuMuManager.exe control -v 2,4,6 launch# 启动全部模拟器MuMuManager.exe control -v all launch

# 使用control [--vmindex <vmindex>] shutdown
# 参数-v, --vmindex <vmindex> 选择要关闭的模拟器索引
# 关闭索引为2的模拟器MuMuManager.exe control -v 2 shutdown# 关闭索引2,4,6的模拟器MuMuManager.exe control -v 2,4,6 shutdown# 关闭全部模拟器MuMuManager.exe control -v all shutdown

# 使用control [--vmindex <vmindex>] app <subcommand>
# 参数-v, --vmindex <vmindex> 选择要关闭的模拟器索引
安装应用到模拟器里(install)
# 使用control [--vmindex <vmindex>] app install [--apk <apk>]
# 参数-v, --vmindex <vmindex> 选择要控制的模拟器索引 -apk, --apk <apk> 选择要安装的应用apk文件路径(支持apk/xapk/apks后缀)
# 安装 C 盘下 test.apk 的应用到所有模拟器中MuMuManager.exe control -v all app install -apk C:\test.apk
2.4 控制模拟器工具栏(tool)
# 使用control [--vmindex <vmindex>] tool <subcommand>
# 参数-v, --vmindex <vmindex> 选择要控制的模拟器索引
触发工具栏功能(func)
# 使用control [--vmindex <vmindex>] tool func [--name <name>]
# 参数-v, --vmindex <vmindex> 选择要控制的模拟器索引-n, --name <name> 要触发的工具栏功能名称
# 在所有模拟器中点击工具栏屏幕旋转;MuMuManager.exe control -v all tool func -n rotate

具栏功能名称目前支持列表:
MuMuManager.exe control -v 2 tool func -n rotate // 屏幕旋转MuMuManager.exe control -v 2 tool func -n go_home // 主页MuMuManager.exe control -v 2 tool func -n go_back // 返回MuMuManager.exe control -v 2 tool func -n top_most // 窗口置顶MuMuManager.exe control -v 2 tool func -n fullscreen // 窗口全屏MuMuManager.exe control -v 2 tool func -n shake // 摇一摇MuMuManager.exe control -v 2 tool func -n screenshot // 截屏MuMuManager.exe control -v 2 tool func -n volume_up // 音量增加MuMuManager.exe control -v 2 tool func -n volume_down // 音量减少MuMuManager.exe control -v 2 tool func -n volume_mute // 切换静音MuMuManager.exe control -v 2 tool cmd -c "svc wifi enable" // 连接网络MuMuManager.exe control -v 2 tool cmd -c "svc wifi disable" // 断开网络
三、自动化脚本示例
import jsonimport subprocessimport timeimport uiautomator2 as u2from concurrent.futures import ThreadPoolExecutor# ---------------- 获取所有模拟器信息 --------------def get_mumu_devices():try:# 获取所有默模拟器信息result = subprocess.run(['D:\\MuMu Player 12\\nx_main\\MuMuManager.exe', 'info', '-v', 'all'],capture_output=True,text=True,encoding='utf-8')# 解析JSON输出data = json.loads(result.stdout)# 转换为列表mumu_devices_list = list(data.values())return mumu_devices_listexcept Exception as e:print(f"错误: {e}")return []# ---------------- 启动模拟器 ----------------def start_device(device_index):try:subprocess.run(# 启动模拟器,并启动指定app,可以加上 -pag 包名,如:-pkg com.android.browser# ['D:\\MuMu Player 12\\nx_main\\MuMuManager.exe', 'control', '-v', device_index['index'], 'launch', '-pkg', 'com.android.browser'],['D:\\MuMu Player 12\\nx_main\\MuMuManager.exe', 'control', '-v', device_index['index'], 'launch'],check=True,capture_output = True)print(f"模拟器 {device_index['name']} 已启动")except subprocess.CalledProcessError as e:print(f"启动模拟器 {device_index['name']} 失败: {e}")# 循环检测安卓是否启动成功while True:result = subprocess.run(['D:\\MuMu Player 12\\nx_main\\MuMuManager.exe', 'info', '-v', device_index['index']],capture_output=True,text=True,encoding='utf-8')data = json.loads(result.stdout)# 当 is_android_started 为 True 时,表示安卓已启动成功if data['is_android_started']:ip = data['adb_host_ip']port = data['adb_port']print(f'远程地址:{ip}:{port}')return f'{ip}:{port}'time.sleep(1)# ---------------- 控制模拟器(可搭配 uiautomator2 进行自动化操作) ----------------def control_device(address):d = Nonewhile True:d = u2.connect(address)if d.info:print(f'已连接模拟器: {d.device_info}')breaktime.sleep(1)print(f'设备:{address} 打开小红书')d.app_start('com.xingin.xhs')time.sleep(1)# ----------------- 启动模拟器并控制 ----------------def start_and_control_device(device_index):print(f"开始启动模拟器: {device_index['name']}")address = start_device(device_index)control_device(address)return f"{device_index['name']} 完成"if __name__ == '__main__':device_index_list = get_mumu_devices()# 多线程处理,根据电脑性能来决定线程数with ThreadPoolExecutor(max_workers=len(device_index_list)) as executor:futures = [executor.submit(start_and_control_device, device_index) for device_index in device_index_list]for future in futures:try:print(future.result())except Exception as e:print(f"处理设备时出错: {e}")
本文链接:https://www.jingber.cn/post/3844.html 转载需授权!


微信扫一扫,打赏作者吧~