Android 开发之深入理解安卓调试桥各种错误解决办法

amya0159 8年前
   <h2>摘要:</h2>    <p>Android 开发调试项目使用到安卓 调试桥 工具,Android Debug Bridge( ADB )位于sdk路径platform-tools文件夹,使用Android Studio或Eclipse工具忽略了adb工具的一些细节,深入理解安卓调试桥指令操作的过程,有助于解决出现的各种错误,运行adb遇到的错误包括:</p>    <p>1、命令行输入adb devices或其他命令</p>    <ol start="1">     <li>adb server is out of date.  killing…</li>     <li>ADB server didn’t ACK</li>     <li>* failed to start daemon *</li>     <li>error:</li>    </ol>    <p>2、命令行输入adb start-server或其他命令</p>    <ol start="1">     <li>adb server version (29) doesn’t match this client (36); killing…</li>    </ol>    <p>3、命令行输入adb start-server</p>    <ol start="1">     <li>adb server is out of date. killing… ADB server didn’t ACK  failed to start</li>    </ol>    <p>4、命令行输入adb start-server</p>    <ol start="1">     <li>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:通常每个套接字地址(协议/网络地址/端口)只允许使用一</li>    </ol>    <p>5、命令行输入adb nodaemon server</p>    <ol start="1">     <li>cannot bind ’tcp:5037′</li>    </ol>    <p>6、命令行输入adb nodaemon server</p>    <ol start="1">     <li>error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)</li>    </ol>    <p>7、命令行输入adb devices</p>    <ol start="1">     <li>Android Studio控制台或Eclipse控制台打印:Adb connection Error:远程主机强迫关闭了一个现有的连接。</li>    </ol>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0d439182427cc490278ae7277e1265d5.png"></p>    <h2>一、初步了解adb命令</h2>    <p>adb.exe,运行在当前开发者电脑的一个后台进程是一个服务端,管理着client和daemon之间的通信。检查当前电脑是否配置adb.exe环境变量,打开任务管理器,检查是否有adb.exe进程在执行,如果没有配置adb.exe环境变量,手动配置系统环境变量,步骤:</p>    <p>1.配置sdk根路径:D:\Android\EclipseADT\adt-bundle-windows-x86_64-20140702\sdk</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b1753aab3c496c36f6fb4b2ab50c6f2e.png"></p>    <p>2.配置plateform-tools路径:%sdk_home%\platform-tools;</p>    <p>3.配置tools路径:%sdk_home%\tools;</p>    <p>4.配置系统变量Path路径:%sdk_home%\platform-tools;%android_home%\tools;</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2b7a4336dfe67e3b99760108157a923a.png"></p>    <p>打开命令行窗口,输入adb version查看版本信息,输入adb help查看帮助文档,以后TeachCourse就可以通过cmd窗口完成Android Studio或Eclipse开发工具管理项目的任务。</p>    <table>     <thead>      <tr>       <td colspan="2">TASKLIST帮助文档</td>      </tr>      <tr>       <td>指令描述:</td>       <td>例子演示:</td>      </tr>     </thead>     <tbody>      <tr>       <td>启动adb后台进程</td>       <td>adb start-server</td>      </tr>      <tr>       <td>查看当前连接设备</td>       <td>adb devices</td>      </tr>      <tr>       <td>卸载指定包名的APP</td>       <td>adb uninstall com.sinolv.recycle</td>      </tr>      <tr>       <td>安装本地apk文件到设备</td>       <td>adb install e:\temp\apk\92回收.apk</td>      </tr>      <tr>       <td>打印log信息,logcat后指定哪个包名的log信息</td>       <td>adb logcat com.sinolv.recycle</td>      </tr>      <tr>       <td>复制本地文件到设备指定路径,第一个本地文件路径,第二个设备存放路径</td>       <td>adb push e:\temp\apk\92回收.apk /sdcard/92回收.apk</td>      </tr>      <tr>       <td>复制设备文件到本地指定路径,第一个设备文件路径,第二个本地存放路径</td>       <td>adb pull /sdcard/92回收.apk e:\temp\apk\92回收.apk</td>      </tr>     </tbody>    </table>    <h2>二、运行adb命令提示错误分析和解决</h2>    <p>使用Android Studio或Eclipse工具时,开发工具相当于client,sdk路径platform-tools文件夹下的adb.exe相当于server,默认器或测试手机相当于daemon,当前TeachCourse在cmd输入devices时,提示adb server is out of date. killing…或者其他错误</p>    <p>针对文章开头提到的运行安卓调试桥时,出现的各种错误原因分析和解决办法如下:</p>    <p>1、adb server is out of date. killing… ADB server didn’t ACK * failed to start daemon * error:</p>    <p>原因分析:这种情况,很可能当前电脑已经运行了一个adb.exe进程或进程依赖的唯一端口5037被占用。</p>    <p>解决办法:打开任务管理器,查看adb.exe是否已运行,或者cmd窗口输入netstat -ano|findstr 5037命令查看包含5037字符的TCP网络连接。因为本地电脑可能有多个adb.exe可以执行文件,选中运行的进程鼠标右键“打开文件位置”,打开进程本地路径。比如:安装Genymotion模拟器存在一个默认的sdk路径,Android Studio或Eclipse开发工具使用另一个sdk路径,两者不共用同一个adb.exe调试桥工具。(关于netstat命令行指令在后面详细介绍)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d17cebd587456d06c4e7764c19e77e2b.png"></p>    <p>2、adb server version (29) doesn’t match this client (36); killing…</p>    <p>原因分析:任务管理运行的是Android Studio或Eclipse配置sdk路径下的adb.exe进程,在cmd窗口使用的另一个adb.exe进程执行命令操作。</p>    <p>解决办法:cmd窗口进入Android Studio或Eclipse工具依赖的sdk路径的plateform-tools文件夹,在执行adb命令</p>    <p>3、adb server is out of date. killing… ADB server didn’t ACK failed to start</p>    <p>原因分析:adb无法对接收到的指令正确应答,可能的原因adb后台进程监听不到Client发送的指令,adb.exe进程启动失败。</p>    <p>解决办法:cmd窗口输入tasklist|findstr adb,检查当前运行adb.exe进程情况,发现存在多个adb.exe,cmd窗口输入taskkill /f /im adb.exe结束对应的进程,最后重新启动调试桥进程。(关于cmd窗口指令tasklist详细说明,后面会介绍)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2792bcae152f8f95c169c5a4cd4096c0.png"></p>    <p>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</p>    <p>原因分析:有两个版本的adb.exe应用程序,任务管理器运行C盘的adb.exe,同时切换到E盘的adb.exe路径,执行adb start操作,提示版本不一致</p>    <p>解决办法:cmd窗口输入taskkill /f /im adb.exe强行结束C盘运行的adb进程,然后切换到E盘adb.exe路径,重新启动。(adb.exe进程需要绑定本地电脑的唯一端口5037,5037端口被占用,绑定失败)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/27dbe51cff416c79fd27a14cdabb8eb7.png"></p>    <p>5、cannot bind ‘tcp:5037′</p>    <p>原因分析:唯一的端口5037被占用,绑定失败</p>    <p>解决办法: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命令行指令在后面详细介绍)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f95a3682b0297e9d5d2c4e0934b5e486.png"></p>    <p>6、error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)</p>    <p>原因分析:adb.exe进程已经正常运行,重新执行上述指令,提示绑定失败,套接字地址只允许使用一次</p>    <p>解决办法:解除被使用的套接字地址即结束运行的adb.exe进程,然后cmd窗口进入想要启动的adb.exe目录,,最后输入adb nodaemon server指令重新绑定。</p>    <p>7、Android Studio控制台或Eclipse控制台打印:Adb connection Error:远程主机强迫关闭了一个现有的连接</p>    <p>原因分析:运行的adb.exe进程被意外结束,已经建立连接的模拟器或测试手机强行关闭</p>    <p>解决办法:在前面运行adb指令的1/2/3/4点中,错误打印killing这个词,可能因为运行C盘的adb.exe进程需要结束已运行的E盘的adb.exe进程,本地电脑即使有多个adb.exe,都会在运行另一个进程前结束另一个,造成Android Studio或Eclipse现有的连接被异常关闭。</p>    <p>总结:运行另一个adb进程会先结束已运行的进程,出现killing错误提示,一个adb进程依赖唯一的5037端口号,已运行的adb占用127.0.0.1:5037,提示套接字只允许使用一次错误。测试手机通过数据线连接当前电脑,一些第三方的手机软件自动运行,优先占用5037端口号,造成adb.exe无法正常使用。以往的做法,重新插拔数据线或者重启电脑恢复正常,读完TeachCourse的这篇文章,只需要几个指令即可正常启动adb进程。</p>    <h2>三、详细说明几个常用的cmd指令</h2>    <p>第一个TASKLIST:,指令:TASKLIST /? 显示帮助文档,文档描述该工具显示在本地或远程机器上当前运行的进程列表,通俗地说列出任务管理器运行的进程,斜杠后添加不同的字符,表示特定的含义,如下图:</p>    <table>     <thead>      <tr>       <td colspan="2">TASKLIST帮助文档</td>      </tr>      <tr>       <td>参数列表:</td>       <td>作用:</td>      </tr>     </thead>     <tbody>      <tr>       <td>/S system</td>       <td>指定连接到的远程系统。</td>      </tr>      <tr>       <td>/U [domain\]user</td>       <td>指定应该在哪个用户上下文执行这个命令。</td>      </tr>      <tr>       <td>/P [password]</td>       <td>为提供的用户上下文指定密码。如果省略,则提示输入。</td>      </tr>      <tr>       <td>/M [module]</td>       <td>列出当前使用所给 exe/dll 名称的所有任务。如果没有指定模块名称,显示所有加载的模块。</td>      </tr>      <tr>       <td>/SVC</td>       <td>显示每个进程中主持的服务。</td>      </tr>      <tr>       <td>/V</td>       <td>显示详述任务信息。</td>      </tr>      <tr>       <td>/FI filter</td>       <td>显示一系列符合筛选器指定的标准的任务。</td>      </tr>      <tr>       <td>/FO format</td>       <td>指定输出格式。有效值: “TABLE”、”LIST”、”CSV”。</td>      </tr>      <tr>       <td>/NH</td>       <td>指定列标题不应该在输出中显示。只对 “TABLE” 和 “CSV” 格式有效。</td>      </tr>     </tbody>    </table>    <p>根据帮助文档提供的example了解指令的用法,TeachCourse只总结cmd窗口输入指令几种格式的含义,比如:</p>    <table>     <thead>      <tr>       <td colspan="2">TASKLIST帮助文档</td>      </tr>     </thead>     <tbody>      <tr>       <td>1.1 省略号…</td>       <td>在命令行中可多次重复的参数</td>      </tr>      <tr>       <td>1.2 中括号[]</td>       <td>可选项,可以选择或不选择</td>      </tr>      <tr>       <td>1.3 大括号{},选项用竖线|分隔。例如:{even|odd}</td>       <td>用户>必须从选项集合中选择一个</td>      </tr>      <tr>       <td>1.4 大写字母,比如APPLICATION_PACKAGE</td>       <td>用户输入的参数值</td>      </tr>      <tr>       <td>1.5 尖括号<>,比如 adb uninstall [-k]</td>       <td>用户>必须指定的参数;如果未指定参数,存在默认值,使用默认值代替,不存在默认值执行指令报错</td>      </tr>     </tbody>    </table>    <p>findstr、netstat和tasklist指令一样,输入findstr /?或netstat /?查看对应帮助文档,结合常见命令行格式不难读懂。netstat显示协议统计和当前 TCP/IP 网络连接,-ano是指令-a、-n和-o结合;findstr在文件中寻找字符串。</p>    <h2> </h2>    <p> </p>    <p>来自:http://www.androidchina.net/6451.html</p>    <p> </p>