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:\Android\EclipseADT\adt-bundle-windows-x86_64-20140702\sdk
    sdk路徑配置

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

  3. 配置tools路徑:%sdk_home%\tools;

  4. 配置系統變量Path路徑:%sdk_home%\platform-tools;%android_home%\tools;
    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:\temp\apk\92回收.apk
打印log信息,logcat后指定哪個包名的log信息 adb logcat com.sinolv.recycle
復制本地文件到設備指定路徑,第一個本地文件路徑,第二個設備存放路徑 adb push e:\temp\apk\92回收.apk /sdcard/92回收.apk
復制設備文件到本地指定路徑,第一個設備文件路徑,第二個本地存放路徑 adb pull /sdcard/92回收.apk e:\temp\apk\92回收.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命令大全》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM