阴阳师脚本多开模拟器故障排除手记:从识别到根治

阴阳师脚本多开模拟器故障排除手记:从识别到根治

【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 【免费下载链接】OnmyojiAutoScript 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript

问题现象:多开模拟器为何集体"罢工"?

笔者最近在维护阴阳师自动化脚本时,遇到了一个典型的多实例协作问题:三个模拟器同时运行时,脚本出现了三种不同的故障表现。最初以为是偶发的环境问题,但经过连续三次复现,确认这是系统性故障。具体表现如下:

  • 实例oas1:启动后卡在应用选择界面,日志显示"检测到多个阴阳师相关包(com.netease.yysbwp和com.netease.onmyoji.wyzymnqsd_cps)"
  • 实例oas2:ADB连接失败,错误信息为"无法连接到127.0.0.1:16416:不知道这样的主机"
  • 实例oas3:能连接设备但执行任务时崩溃,抛出"GetWindowRect失败:无效的窗口句柄"异常

这三个故障点看似独立,实则可能存在内在关联。让我们通过系统化排查来找到问题的根源。

排查步骤:如何一步步定位多开故障的核心原因?

排查这类复杂问题需要遵循"先整体后局部"的原则,笔者采用了以下四步排查法:

第一步:环境信息收集

在开始任何排查前,必须先掌握完整的环境信息。我们需要收集:

  • 模拟器类型及版本(如MuMu 12、BlueStacks 5等)
  • 每个实例的配置参数(CPU/内存分配、分辨率、DPI)
  • ADB端口映射关系(实例名称→端口号)
  • 已安装应用列表(特别是阴阳师相关包)
  • 系统显示设置(缩放比例、分辨率)

💡 技巧:使用adb devices命令可以快速获取当前连接的设备列表,包括模拟器实例的序列号和状态。

第二步:逐个击破验证

在收集完环境信息后,我们采用"隔离法"逐个验证每个实例:

  1. 单独运行oas1:仍然出现多包识别问题,排除其他实例干扰
  2. 单独运行oas2:ADB连接依然失败,说明是端口配置问题
  3. 单独运行oas3:窗口句柄错误依旧存在,指向窗口识别逻辑

⚠️ 注意:在单独测试每个实例时,必须完全关闭其他模拟器和相关进程,避免端口占用或资源冲突。

第三步:交叉对比分析

通过对比三个实例的配置,发现了几个关键差异点:

  • oas1使用默认配置,未指定包名
  • oas2的ADB端口与另一个后台服务冲突
  • oas3的窗口标题包含特殊字符"[]"

多开配置对比表 图1:多开实例配置对比示意(TableView组件展示)

第四步:根源定位

经过上述排查,我们确定了三个独立但同时发生的问题:

  1. 包识别冲突:设备上存在多个阴阳师渠道包
  2. ADB端口冲突:端口映射未正确配置或被占用
  3. 窗口识别失败:窗口标题不规范导致句柄获取失败

解决方案:如何快速恢复多开功能?

针对排查结果,我们可以从临时修复和永久解决两个层面来处理:

临时修复方案

当务之急是恢复多开功能,我们可以采取以下临时措施:

  1. 包名强制指定:在配置文件中显式设置Alas.Emulator.PackageName: "com.netease.onmyoji"
  2. 端口手动映射:修改oas2的ADB端口为16417(避开冲突端口)
  3. 窗口标题修改:将oas3的窗口标题改为"MuMu3_YYS"(移除特殊字符)

💡 技巧:使用adb connect 127.0.0.1:端口号命令可以手动测试ADB连接是否正常。

永久解决策略

为了彻底解决问题,需要从配置规范和环境优化两方面入手:

  1. 模拟器命名规范

    • 采用"模拟器类型+序号+用途"的命名方式(如"MuMu1_YYS")
    • 避免纯数字或特殊字符
    • 确保每个实例名称唯一
  2. ADB端口管理

    • 建立端口分配表(如16400-16499用于模拟器)
    • 在配置文件中明确指定每个实例的端口
    • 使用批处理脚本自动检查端口占用情况
  3. 应用环境净化

    • 每个模拟器只保留一个阴阳师包
    • 定期清理残留安装包和缓存
    • 使用adb uninstall 包名命令彻底移除不需要的应用

配置界面示例 图2:推荐的多开配置界面(Buttons组件展示)

预防措施:如何避免多开故障再次发生?

解决问题只是第一步,更重要的是建立长效机制防止类似问题重演:

建立多开环境检查清单

在每次新增模拟器实例时,应检查以下项目:

  •  模拟器名称符合命名规范
  •  ADB端口在预留范围内且未被占用
  •  仅安装一个阴阳师应用包
  •  窗口分辨率和DPI设置一致
  •  测试基础操作(截图、点击、滑动)是否正常

自动化环境检测脚本

编写一个简单的Python脚本,在启动多开前自动检查环境:

import socket
import subprocess

def check_port(port):
    """检查端口是否被占用"""
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        return s.connect_ex(('127.0.0.1', port)) == 0

def check_package(serial, package_name):
    """检查设备是否安装指定包"""
    result = subprocess.run(
        f'adb -s {serial} shell pm list packages | findstr {package_name}',
        shell=True, capture_output=True, text=True
    )
    return len(result.stdout) > 0

# 多开检查主逻辑
if __name__ == "__main__":
    instances = [
        {"name": "MuMu1_YYS", "port": 16410, "package": "com.netease.onmyoji"},
        {"name": "MuMu2_YYS", "port": 16411, "package": "com.netease.onmyoji"},
        {"name": "MuMu3_YYS", "port": 16412, "package": "com.netease.onmyoji"}
    ]
    
    for instance in instances:
        if check_port(instance["port"]):
            print(f"错误:{instance['name']}的端口{instance['port']}已被占用")
        elif not check_package(f"emulator-{instance['port']}", instance["package"]):
            print(f"错误:{instance['name']}未找到指定包{instance['package']}")
        else:
            print(f"{instance['name']}检查通过")

相似案例对比:其他多开场景的解决方案

案例一:Android Studio模拟器多开冲突

Android开发者经常需要同时运行多个模拟器进行测试,他们的解决方案是:

  • 使用AVD Manager统一管理模拟器
  • 为每个模拟器分配唯一的端口和SD卡路径
  • 通过命令行启动时指定-port参数

这种集中管理的方式值得借鉴到阴阳师脚本多开场景中。

案例二:Docker容器端口映射冲突

Docker在处理容器端口映射时,采用了"宿主机端口:容器端口"的明确映射方式,并提供了docker port命令查看映射关系。我们可以参考这种方式,为每个模拟器实例建立清晰的端口映射表,并提供查询工具。

附录A:环境信息收集清单

在报告多开问题时,应提供以下信息:

  1. 系统信息

    • 操作系统版本及构建号
    • 系统显示缩放比例
    • 屏幕分辨率
  2. 模拟器信息

    • 模拟器类型和版本
    • 每个实例的配置参数(CPU/内存/分辨率)
    • 实例名称和窗口标题
  3. 网络信息

    • ADB端口映射表
    • adb devices命令输出
    • 防火墙设置
  4. 应用信息

    • 已安装阴阳师相关包列表
    • 应用版本号
    • 安装来源

附录B:常见错误代码速查表

错误代码含义可能原因解决方案
10061无法连接到目标主机ADB端口错误或模拟器未启动检查端口配置和模拟器状态
1053服务启动超时模拟器进程异常重启模拟器或重建实例
0x80070570窗口句柄无效窗口标题不规范或已关闭修改窗口标题或重启实例
5037ADB服务器端口被占用ADB服务冲突重启ADB服务(adb kill-server && adb start-server)
-505应用安装冲突已存在其他渠道包卸载冲突包或指定包名

附录C:多开配置模板示例

以下是推荐的多开配置文件模板(config_multi_instance.yaml):

# 多开实例配置模板
Instances:
  - Name: "MuMu1_YYS"
    Emulator: "MuMu"
    Version: "12"
    ADBPort: 16410
    PackageName: "com.netease.onmyoji"
    Resolution: "1280x720"
    DPI: 320
    CPU: 4
    Memory: 4096
    ScriptConfig: "configs/mumu1_config.yaml"
    
  - Name: "MuMu2_YYS"
    Emulator: "MuMu"
    Version: "12"
    ADBPort: 16411
    PackageName: "com.netease.onmyoji"
    Resolution: "1280x720"
    DPI: 320
    CPU: 4
    Memory: 4096
    ScriptConfig: "configs/mumu2_config.yaml"
    
  - Name: "MuMu3_YYS"
    Emulator: "MuMu"
    Version: "12"
    ADBPort: 16412
    PackageName: "com.netease.onmyoji"
    Resolution: "1280x720"
    DPI: 320
    CPU: 4
    Memory: 4096
    ScriptConfig: "configs/mumu3_config.yaml"

通过以上系统化的排查和解决方案,我们不仅解决了当前的多开故障,还建立了一套可复用的多开管理规范。这套方法同样适用于其他需要多实例协作的自动化场景,希望能为遇到类似问题的朋友提供参考。记住,解决技术问题的关键不仅在于修复表面症状,更在于找到并消除问题根源。

【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 【免费下载链接】OnmyojiAutoScript 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值