Airtest中的ADB版本冲突问题从而断开连接,提示adb server version (39) doesn‘t match this client (40); killing...

本文详细介绍了在使用ADB进行设备连接时遇到的连接断开和版本不匹配问题的解决方案,包括检查并安装JDK、配置系统环境变量、统一ADB版本、更新Airtest等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
1、os.popen("adb connect "+device_num)连接后,通过airtest命令行运行脚本后,输入cmd,adb devices断开连接
adb devices显示无连接上
2、pycharm运行测试用例,报错
AdbError: stdout[List of devices attached
] stderr[adb server version (39) doesn’t match this client (40); killing…
could not read ok from ADB Server

  • failed to start daemon
    error: cannot connect to daemon
    ]
    在这里插入图片描述
    解决方案:
    是否已经安装了android-sdk-windows,双击“SDK Manager.exe”,启动SDK Manager,如果屏幕出现黑框一闪而过,排查下是否安装了jdk
    安装jdk步骤
    在这里插入图片描述
    在这里插入图片描述
    a、系统变量→寻找 Path 变量→编辑

在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
b、系统变量→新建 CLASSPATH 变量

变量值填写 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)

系统变量配置完毕
在这里插入图片描述
安装Android SDK
在这里插入图片描述
在这里插入图片描述
[异常] Download interrupted: Connection to https://dl-ssl.google.com refused 安卓SDK下载被拒 3步解决
1、SDK Manager 的 Tools ->Options打开SDK Manager的Settings,选中“Force https://… sources to be fetched using http://…”,
强制使用http协议。
2、在 Windows在C:\WINDOWS\system32\drivers\etc目录下host文件添加:
#Google主页
  203.208.46.146 www.google.com
  #这行是为了方便打开Android开发官网 现在好像不翻墙也可以打开
  74.125.113.121 developer.android.com
  #更新的内容从以下地址下载
  203.208.46.146 dl.google.com
  203.208.46.146 dl-ssl.google.com
3、重启,一定要重启SDK Mannger
在这里插入图片描述
然后就是在系统的Path变量后,追加;%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools
在这里插入图片描述

1、更新python环境的airtest到最新
pip install -U airtest

2、更新了之后,通过命令行运行脚本无效果:
解决方案:
替换掉本地所有的adb.exe,统一成同一个版本(哪怕不是最新的40也可以,只要是同一个版本)
AirtestIDE 1.1.0版本上的adb版本已经更新到40,使用pip安装的airtest、pocoui库里的adb,以及本地的adb.exe通过以下命令可以查看本地adb在哪查看本地adb安装目录
博主是把本地的adb.exe复制到airtestIde(IDE中的adb.exe路径在 AirtestIDE/airtest/core/android/static/adb/windows/adb.exe)、和airtest库(本地python环境下安装的airtest(目录一般为python目录下的 Lib\site-packages\airtest )里的adb.exe,airtest中的路径为 airtest/core/android/static/adb/windows/adb.exe)、(以及夜神模拟器-将SDK\platform-tools下的adb.exe文件,替换成夜神模拟器bin目录下的adb.exe 将SDK\platform-tools下的adb.exe,copy出来重命名为nox_adb.exe,替换成夜神模拟器bin目录下的 nox_adb.exe)里:
统一版本,避免冲突
win7用户请尽量统一选用ADB39版本,我们在IDE文件夹中提供了一个, AirtestIDE/tools/adb39/adb.exe ,将它作为基准版本覆盖掉别的地方的adb即可
win10用户可以直接拷贝IDE里的 AirtestIDE/airtest/core/android/static/adb/windows/adb.exe ,这是一个40版本的adb
执行 adb.exe version 可以查看到版本号在这里插入图片描述
目的是:避免adb冲突,连接不上设备

<think>我们正在解决adb版本不匹配的问题,具体错误是“adb server version (39) doesn&#39;t match this client (41); killing...”。根据引用资料,这通常是由于系统中存在多个不同版本adb(Android Debug Bridge)程序,导致adb服务器(server)和客户端(client版本不一致。 解决方案的核心是统一adb版本。根据引用[2]和[4],我们可以通过替换adb程序文件来统一版本。具体步骤如下: 1. **定位冲突adb程序**:通常,Android SDK的platform-tools目录下有一个adb.exe(我们称之为SDK的adb)。同时,一些安卓模拟器(如夜神模拟器)或手机助手软件也会自带adb程序。当这两个adb版本不一致时,就可能出现冲突。 2. **确定需要保留的版本**:一般情况下,我们以Android SDK的adb版本为准,因为它是官方最新的。但有时模拟器可能要求特定版本adb,所以也可以选择模拟器的版本。这里我们选择版本较高的(client是41,server39,所以client版本更高),但为了统一,我们通常将SDK的adb复制到模拟器目录,或者反过来,根据实际需要。 3. **替换adb文件**: - 步骤1:找到Android SDK的adb.exe所在目录(例如:`C:\Users\你的用户名\AppData\Local\Android\Sdk\platform-tools`)。 - 步骤2:找到模拟器或手机助手软件的adb.exe所在目录(例如,夜神模拟器通常在安装目录的`bin`子目录下,如`D:\Program Files\Nox\bin`)。 - 步骤3:将其中一个目录下的adb.exe(以及可能存在的AdbWinApi.dll、AdbWinUsbApi.dll等)复制到另一个目录,覆盖目标文件。 注意:根据引用[2],如果模拟器启动时使用了自己的adb,那么我们就应该用SDK的adb覆盖模拟器的adb,或者将模拟器的adb替换为与SDK相同版本。但有时模拟器对adb有特定要求,所以也可以反过来,用模拟器的adb覆盖SDK的adb(但这样可能会影响其他开发工具,如Android Studio)。因此,建议先备份原文件。 4. **结束adb进程**:在替换文件前,需要确保adb进程已经结束。可以通过任务管理器结束所有名为adb.exe的进程,或者在命令行中执行: ``` adb kill-server ``` 5. **替换文件**:复制文件,覆盖目标位置的adb文件(以及相关的dll文件)。 6. **重启相关服务**:重启模拟器或重新连接手机,并尝试使用adb命令(如`adb devices`)检查是否解决问题。 7. **如果端口占用导致无法启动**:引用[1]和[3]中提到错误“cannot bind to 127.0.0.1:...”,这通常是因为端口被占用。我们可以: - 更换端口:例如,使用`adb -P <port>`指定不同端口。 - 或者,结束占用端口的进程(可能是之前未正确关闭的adb)。 另外,引用[5]提供了一种设置字符集的方法,但那是针对MySQL的,与adb问题无关,可以忽略。 根据以上步骤,我们可以解决adb版本不匹配的问题。 注意:在操作过程中,可能需要关闭所有使用adb的程序(如Android Studio、模拟器等),并确保替换文件后重新启动这些程序。 下面,我们将具体步骤整理如下:</think>### 解决 ADB 版本不匹配问题Server 39 vs Client 41) 当出现 `adb server version (39) doesn&#39;t match this client (41); killing...` 错误时,说明系统中存在 **多个版本冲突ADB 程序**。以下是完整解决方案: #### 🔧 解决步骤 1. **结束所有 ADB 进程** 在命令提示符中执行: ```bash adb kill-server taskkill /f /im adb.exe ``` 2. **定位冲突ADB 文件** - 找到 Android SDK 的 ADB: `[SDK安装路径]\platform-tools\adb.exe`(通常是 `C:\Users\<用户名>\AppData\Local\Android\Sdk\platform-tools`) - 找到其他程序的 ADB(常见来源): - 安卓模拟器(如夜神:`Nox\bin`) - 手机助手软件(如豌豆荚) - 第三方工具(如 Scrcpy) 3. **统一 ADB 版本(任选其一)** **✅ 推荐方案:用 SDK 的 ADB 覆盖其他程序** ```bash # 示例:将 SDK 的 adb 复制到夜神模拟器 copy "C:\Android\Sdk\platform-tools\adb.exe" "D:\Nox\bin\adb.exe" copy "C:\Android\Sdk\platform-tools\AdbWinApi.dll" "D:\Nox\bin\" # 同时复制 DLL 文件 ``` **或反向覆盖**(若需保留模拟器版本): ```bash copy "D:\Nox\bin\adb.exe" "C:\Android\Sdk\platform-tools\adb.exe" ``` 4. **检查环境变量** 确保系统 `PATH` 变量 **仅包含 SDK 的 platform-tools 路径**: ```bash # 查看当前 PATH echo %PATH% ``` ❗ 移除其他包含 `adb.exe` 的路径(如模拟器路径) 5. **重启服务验证** ```bash adb start-server adb devices # 应显示设备列表无报错 ``` #### ⚠️ 注意事项 1. 操作前备份原文件(重命名为 `adb_old.exe`) 2. 如果出现端口占用错误(`cannot bind to 127.0.0.1:5037`): ```bash netstat -ano | findstr :5037 # 查找占用进程 taskkill /pid [进程ID] /f # 强制结束进程 ``` 3. 某些模拟器需重启电脑才能生效[^2] #### 💡 预防措施 - 定期更新 Android SDK:`sdkmanager --update` - 避免安装多个安卓模拟器 - 第三方工具尽量使用 SDK 的 ADB(通过环境变量调用) > **原理说明**:ADB 包含客户端(`adb.exe`)和守护进程(`adb server`)。当两者版本不一致时,server 会主动终止并提示版本不匹配。统一文件可消除此冲突[^4]。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值