×

MuMu模拟器+Uiautomator2自动化群控

hqy hqy 发表于2025-12-01 23:24:38 浏览22 评论0

抢沙发发表评论

官网文档:https://mumu.163.com/help/20240807/40912_1170006.html

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
图片
2.2 关闭模拟器(shutdown)


# 使用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
图片
2.3 控制模拟器里的应用(app)


# 使用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_list    except 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 = None    while True:        d = u2.connect(address)        if d.info:            print(f'已连接模拟器: {d.device_info}')            break        time.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 转载需授权!

分享到:

群贤毕至

访客

您的IP地址是: