adb devices多出设备emulator-5554 connecting

文章讲述了在使用ADB时遇到额外设备的问题,如何通过结束adb.exe进程、查找占用5555端口的进程并强制结束来解决设备混淆。最后提供了taskkill命令作为更简便的方法来处理这种情况。

使用ADB的时候,多出来一个设备,使得操作原本的设备非常麻烦

adb disconnect emulator-5554显示设备不存在,因为当前是connecting状态。

在任务管理器->详细信息里面,把adb.exe直接结束任务,重新启动adb后还是存在

先把原来连接的172.18.77.126设备断开,以免混淆,现在就只剩这个未知设备了:

用下面命令查看是哪个进程占用了5555端口:

netstat -ano |findstr 5555

在任务管理器->详细信息里面,点击pid按顺序排列,找到3268对应的进程,右键->结束进程树

再adb devices,这个未知设备就消失了

更简单的方法

taskkill -f -pid 3268

object AdbConnector { private const val TAG = "AdbConnector" private val base64Impl: AdbBase64 get() = object : AdbBase64 { override fun encodeToString(data: ByteArray?): String? { return Base64.encodeToString(data, Base64.DEFAULT) } } // This function loads a keypair from the specified files if one exists, and if not, // it creates a new keypair and saves it in the specified files @Throws( NoSuchAlgorithmException::class, InvalidKeySpecException::class, IOException::class ) private fun setupCrypto(pubKeyFile: String, privKeyFile: String): AdbCrypto { val pub = File(pubKeyFile) val priv = File(privKeyFile) var c: AdbCrypto? = null // Try to load a key pair from the files if (pub.exists() && priv.exists()) { c = try { AdbCrypto.loadAdbKeyPair(base64Impl, priv, pub) } catch (e: Exception) { // Failed to read from file null } } if (c == null) { // We couldn't load a key, so let's generate a new one c = AdbCrypto.generateAdbKeyPair(base64Impl) // Save it c.saveAdbKeyPair(priv, pub) Log.d(TAG, "Generated new keypair") } else { Log.d(TAG, "Loaded existing keypair") } return c } @Throws(Exception::class) fun connection(context: Context, host: String?, port: Int): AdbConnection { // Setup the crypto object required for the AdbConnection val path = context.cacheDir.absolutePath Log.e(TAG, "connection path $path") val crypto = setupCrypto( path + File.separatorChar + "pub.key", path + File.separatorChar + "priv.key" ) Log.e(TAG, "Socket connecting...") val sock = Socket(host, port) // Connect the socket to the remote host Log.e(TAG, "Socket connected") // Construct the AdbConnection object val adb = AdbConnection.create(sock, crypto) // Start the application layer connection process Log.e(TAG, "ADB connecting...") adb.connect() Log.e(TAG, "ADB connected") return adb } @Throws(Exception::class) fun buildConnect(context: Context, host: String?, port: Int): AdbConnection { // Setup the crypto object required for the AdbConnection val path = context.cacheDir.absolutePath Log.e(TAG, "connection path $path") val crypto = setupCrypto( path + File.separatorChar + "pub.key", path + File.separatorChar + "priv.key" ) Log.e(TAG, "Socket connecting...") val sock = Socket(host, port) // Connect the socket to the remote host Log.e(TAG, "Socket connected") // Construct the AdbConnection object return AdbConnection.create(sock, crypto) } @Throws(Exception::class) fun openShell(context: Context, host: String?, port: Int): AdbStream { val connection = connection(context, host, port) return connection.open("shell:") } } kotlin如何调用
最新发布
10-26
<think>嗯,用户需要解决adbdevices显示127.0.0.1:5555offline的问题。根据用户提供的引用内容,问题的原因可能在于5555端口被占用导致模拟器连接异常。用户还提到存在emulator-5554设备,这与引用中描述的端口分配机制一致:模拟器控制台端口5554对应adb端口5555。用户似乎在进行Android开发或测试时遇到了设备连接问题,ta应该刚接触模拟器调试,否则不会纠结于端口命名的细节(比如为何叫emulator-5554而不是5555)。需要引导ta关注核心矛盾——端口冲突。不过用户特意提到了文献[1]中的技术细节,说明ta有一定钻研精神,可以适当深入解释端口机制。解决方案要分层次呈现:先简单后复杂。第一步应该是重启adb(90%的adb问题靠重启解决),然后排查端口占用。引用[1]提到telnet控制台的概念比较专业,普通用户可能用不到,但可以保留作为进阶方案。用户提供的引用[2]直接对应"多设备冲突"的报错,这和当前offline问题实质是同一个原因的不同表现。需要提醒规避常见误区:部分教程建议直接改端口号,但这可能引发新问题(比如需要同时修改模拟器和adb配置)。最后要强调验证步骤,避免用户执行后无法确认是否修复。</think> 要解决 `adb devices` 显示 `127.0.0.1:5555 offline` 和 `emulator-5554` 设备异常的问题,请按以下步骤操作: --- ### **问题原因分析** 1. **端口冲突** ADB 默认使用端口 `5555-5585` 连接模拟器[^1]。若其他程序占用 `5555` 端口,ADB 会尝试连接但无法建立有效通信,导致状态显示 `offline`。 2. **模拟器端口机制** - 模拟器的控制台端口默认为 `5554`(可通过 `telnet localhost 5554` 交互),其对应的 ADB 端口为 `5555`(即控制台端口 +1)[^1]。 - 出现 `emulator-5554` 表示 ADB 检测到模拟器实例,但可能因端口冲突或状态异常导致连接失效。 3. **幽灵设备残留** 若模拟器未正常关闭或 ADB 进程未重启,会导致残留设备记录[^2]。 --- ### **解决步骤** #### 1. **重启 ADB 服务** ```bash adb kill-server # 终止 ADB 服务 adb start-server # 重启 ADB adb devices # 重新检测设备 ``` > ✅ **作用**:清除残留连接,刷新端口占用状态。 #### 2. **释放占用端口(5555)** - **Windows** ```bash netstat -ano | findstr ":5555" # 查找占用进程的 PID taskkill /F /PID <PID> # 强制结束该进程 ``` - **Linux/macOS** ```bash lsof -i :5555 # 查找进程 kill -9 <PID> # 终止进程 ``` #### 3. **重置模拟器 ADB 连接** 1. 在模拟器设置中找到 **ADB 调试端口**(如雷电模拟器:设置 → 其他设置 → ADB 端口)。 2. 修改为 **未占用端口**(如 `5575`),保存后重启模拟器。 3. 重启 ADB: ```bash adb connect 127.0.0.1:5575 # 手动连接新端口 ``` #### 4. **删除残留设备记录** ```bash adb devices -l # 查看设备序列号(如 emulator-5554adb disconnect emulator-5554 # 断开指定设备 adb kill-server # 再次重启服务 ``` #### 5. **更新 ADB 与模拟器** - 升级 Android SDK Platform-Tools(包含 ADB)至最新版。 - 确保模拟器版本兼容(如雷电模拟器需开启 **ADB 调试**选项)。 --- ### **验证修复** ```bash adb devices ``` 预期输出示例: ```bash List of devices attached 127.0.0.1:5575 device # 修改后的端口正常连接 emulator-5554 device # 残留记录已清除 ``` > 💡 **若仍存在 offline**:检查防火墙是否拦截 ADB 通信,或尝试更换其他模拟器(如官方 Android Studio 模拟器)。 --- ### 相关问题 1. **如何查看 ADB 端口占用情况?** Windows 用 `netstat -ano | findstr "5555"`,Linux/macOS 用 `lsof -i :5555`。 2. **ADB 连接真机显示 offline 如何解决?** 需启用设备的 **USB 调试(安全设置)** 或更换数据线[^2]。 3. **多台模拟器端口冲突如何处理?** 为每台模拟器分配**连续但不重叠**的 ADB 端口(如 5555、5575、5595)。 --- 通过上述操作可解决端口冲突导致的 ADB 连接异常。核心思路是 **释放端口 → 刷新服务 → 重建连接**[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值