zoukankan      html  css  js  c++  java
  • Android 开发之深入理解安卓调试桥各种错误解决办法

    摘要:

    Android开发调试项目使用到安卓调试桥工具,Android Debug Bridge(ADB)位于sdk路径platform-tools文件夹,使用Android Studio或Eclipse工具忽略了adb工具的一些细节,深入理解安卓调试桥指令操作的过程,有助于解决出现的各种错误,运行adb遇到的错误包括:

    • 命令行输入adb devices或其他命令
    adb server is out of date.  killing...  
    ADB server didn't ACK  
    failed to start daemon error:  
    
    • 命令行输入adb start-server或其他命令
      adb server version (29) doesn't match this client (36); killing...

    • 命令行输入adb start-server
      adb server is out of date. killing... ADB server didn't ACK failed to start

    • 命令行输入adb start-server

    adb server version (31) doesn't match this client (36); killing...error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037
    通常每个套接字地址(协议/网络地址/端口)只允许使用一
    
    • 命令行输入adb nodaemon server
      cannot bind 'tcp:5037'

    • 命令行输入adb nodaemon server

    error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:
    通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)
    
    • 命令行输入adb devices
      Android Studio控制台或Eclipse控制台打印:Adb connection Error:远程主机强迫关闭了一个现有的连接。
      Android Debug Bridge

    一、初步了解adb命令

    adb.exe,运行在当前开发者电脑的一个后台进程是一个服务端,管理着client和daemon之间的通信。检查当前电脑是否配置adb.exe环境变量,打开任务管理器,检查是否有adb.exe进程在执行,如果没有配置adb.exe环境变量,手动配置系统环境变量,步骤:

    1. 配置sdk根路径:D:AndroidEclipseADTadt-bundle-windows-x86_64-20140702sdk
      sdk路径配置

    2. 配置plateform-tools路径:%sdk_home%platform-tools;

    3. 配置tools路径:%sdk_home% ools;

    4. 配置系统变量Path路径:%sdk_home%platform-tools;%android_home% ools;
      sdk路径配置

    打开命令行窗口,输入adb version查看版本信息,输入adb help查看帮助文档,以后TeachCourse就可以通过cmd窗口完成Android Studio或Eclipse开发工具管理项目的任务。

    Description Commond
    启动adb后台进程 adb start-server
    查看当前连接设备 adb devices
    卸载指定包名的APP adb uninstall com.sinolv.recycle
    安装本地apk文件到设备 adb install e: empapk92回收.apk
    打印log信息,logcat后指定哪个包名的log信息 adb logcat com.sinolv.recycle
    复制本地文件到设备指定路径,第一个本地文件路径,第二个设备存放路径 adb push e: empapk92回收.apk /sdcard/92回收.apk
    复制设备文件到本地指定路径,第一个设备文件路径,第二个本地存放路径 adb pull /sdcard/92回收.apk e: empapk92回收.apk

    二、运行adb命令提示错误分析和解决

    使用Android Studio或Eclipse工具时,开发工具相当于client,sdk路径platform-tools文件夹下的adb.exe相当于server,默认器或测试手机相当于daemon,当前TeachCourse在cmd输入devices时,提示adb server is out of date. killing...或者其他错误

    针对文章开头提到的运行安卓调试桥时,出现的各种错误原因分析和解决办法如下:

    2.1 adb server is out of date. killing... ADB server didn't ACK * failed to start daemon * error:

    原因分析:这种情况,很可能当前电脑已经运行了一个adb.exe进程或进程依赖的唯一端口5037被占用。
    解决办法:打开任务管理器,查看adb.exe是否已运行,或者cmd窗口输入netstat -ano|findstr 5037命令查看包含5037字符的TCP网络连接。因为本地电脑可能有多个adb.exe可以执行文件,选中运行的进程鼠标右键“打开文件位置”,打开进程本地路径。比如:安装Genymotion模拟器存在一个默认的sdk路径,Android Studio或Eclipse开发工具使用另一个sdk路径,两者不共用同一个adb.exe调试桥工具。(关于netstat命令行指令在后面详细介绍)
    netstat命令配置

    2.2 adb server version (29) doesn't match this client (36); killing...

    原因分析:任务管理运行的是Android Studio或Eclipse配置sdk路径下的adb.exe进程,在cmd窗口使用的另一个adb.exe进程执行命令操作。
    解决办法:cmd窗口进入Android Studio或Eclipse工具依赖的sdk路径的plateform-tools文件夹,在执行adb命令

    2.3 adb server is out of date. killing... ADB server didn't ACK failed to start

    原因分析:adb无法对接收到的指令正确应答,可能的原因adb后台进程监听不到Client发送的指令,adb.exe进程启动失败。
    解决办法:cmd窗口输入tasklist|findstr adb,检查当前运行adb.exe进程情况,发现存在多个adb.exe,cmd窗口输入taskkill /f /im adb.exe结束对应的进程,最后重新启动调试桥进程。(关于cmd窗口指令tasklist详细说明,后面会介绍)
    tasklist查看进程指令

    2.4 adb server version (31) doesn't match this client (36); killing...error: could not install smartsocket listener: cannot bind to 127.0.0.1:5037

    原因分析:有两个版本的adb.exe应用程序,任务管理器运行C盘的adb.exe,同时切换到E盘的adb.exe路径,执行adb start操作,提示版本不一致
    解决办法:cmd窗口输入taskkill /f /im adb.exe强行结束C盘运行的adb进程,然后切换到E盘adb.exe路径,重新启动。(adb.exe进程需要绑定本地电脑的唯一端口5037,5037端口被占用,绑定失败)
    taskkill终止进程指令

    2.5 cannot bind 'tcp:5037'

    原因分析:唯一的端口5037被占用,绑定失败
    解决办法:cmd窗口输入netstat -ano|findstr 5037,刷选当前TCP网络连接包含5037的进程,获取对pid,然后通过pid查询应用程序名称,cmd窗口输入tasklist|findstr pid,发现360MobileLoader.exe占用唯一端口,测试发现taskkill /f /im 360MobileLoader.exe无法强行结束上述进程,解决办法插拔一下手机数据线,自动结束360MobileLoader.exe进程。如果手机安装了QQ,同时数据线连接电脑前在PC端登录QQ软件,电脑版的QQ软件的tadb.exe进程同样会占用5037端口,tadb.exe看得出来属于adb.exe的一个复制品。(关于netstat和findstr命令行指令在后面详细介绍)
    netstat查询指定进程

    2.6 error: could not install smartsocket listener: cannot bind to 127.0.0.1 5037 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)

    原因分析:adb.exe进程已经正常运行,重新执行上述指令,提示绑定失败,套接字地址只允许使用一次
    解决办法:解除被使用的套接字地址即结束运行的adb.exe进程,然后cmd窗口进入想要启动的adb.exe目录,,最后输入adb nodaemon server指令重新绑定。

    2.7 Android Studio控制台或Eclipse控制台打印:Adb connection Error:远程主机强迫关闭了一个现有的连接

    原因分析:运行的adb.exe进程被意外结束,已经建立连接的模拟器或测试手机强行关闭
    解决办法:在前面运行adb指令的1/2/3/4点中,错误打印killing这个词,可能因为运行C盘的adb.exe进程需要结束已运行的E盘的adb.exe进程,本地电脑即使有多个adb.exe,都会在运行另一个进程前结束另一个,造成Android Studio或Eclipse现有的连接被异常关闭。

    总结:运行另一个adb进程会先结束已运行的进程,出现killing错误提示,一个adb进程依赖唯一的5037端口号,已运行的adb占用127.0.0.1:5037,提示套接字只允许使用一次错误。测试手机通过数据线连接当前电脑,一些第三方的手机软件自动运行,优先占用5037端口号,造成adb.exe无法正常使用。以往的做法,重新插拔数据线或者重启电脑恢复正常,读完TeachCourse的这篇文章,只需要几个指令即可正常启动adb进程。

    三、详细说明几个常用的cmd指令

    第一个TASKLIST:,指令:TASKLIST /? 显示帮助文档,文档描述该工具显示在本地或远程机器上当前运行的进程列表,通俗地说列出任务管理器运行的进程,斜杠后添加不同的字符,表示特定的含义,如下图:

    TASKLIST帮助文档

    参数列表: 作用:
    /S system 指定连接到的远程系统。
    /U [domain]user 指定应该在哪个用户上下文执行这个命令。
    /P [password] 为提供的用户上下文指定密码。如果省略,则提示输入。
    /M [module] 列出当前使用所给 exe/dll 名称的所有任务。如果没有指定模块名称,显示所有加载的模块。
    /SVC 显示每个进程中主持的服务。
    /V 显示详述任务信息。
    /FI filter 显示一系列符合筛选器指定的标准的任务。
    /FO format 指定输出格式。有效值: "TABLE"、"LIST"、"CSV"。
    /NH 指定列标题不应该在输出中显示。只对 "TABLE" 和 "CSV" 格式有效。

    根据帮助文档提供的example了解指令的用法,TeachCourse只总结cmd窗口输入指令几种格式的含义,比如:

    常见命令行格式

    • 省略号...在命令行中可多次重复的参数

    • 中括号[]可选项,可以选择或不选择

    • 大括号{},选项用竖线|分隔。例如:{even|odd}用户>必须从选项集合中选择一个

    • 大写字母,比如APPLICATION_PACKAGE用户输入的参数值

    • 尖括号<>,比如 adb uninstall [-k] 用户>必须指定的参数;如果未指定参数,存在默认值,使用默认值代替,不存在默认值执行指令报错

    findstrnetstattasklist指令一样,输入findstr /?netstat /?查看对应帮助文档,结合常见命令行格式不难读懂。netstat显示协议统计和当前 TCP/IP 网络连接,-ano是指令-a-n-o结合;findstr在文件中寻找字符串。

    四、相关阅读

    了解adb各种指令的操作,TeachCourse发现还可以无线调试项目,发送指令录制模拟器或测试手机屏幕,发送指令截图,想要更深入理解adb指令,推荐阅读:
    《Android Debug Bridge》
    《Android Debug Bridge之Shell命令》
    《adb shell pm命令大全》
    《adb shell am命令大全》
    《adb shell ls命令大全》

  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/dazhao/p/6534128.html
Copyright © 2011-2022 走看看