1. 程式人生 > >使用adb出現假emulator的解決方法

使用adb出現假emulator的解決方法

android開發中最常用的一個工具就是adb了。自己一直是用一臺linux伺服器連線android來做除錯開發,今天在檢視adb連線裝置列表時

#adb devices
List of devices attached
emulator-5554   offline
emulator-5556   offline

這個問題對我來說並不陌生,通常解決的方式都是執行命令adb kill-server,然後再看adb devices,列表就會被清空掉。但是今天無論執行了多少遍adb kill-server,這兩個模擬器裝置仍然存在。網上對於這個問題提供了兩個解決方向,一個是上面重啟adb server,另一個是殺模擬器程序。於是我又去嘗試了emu kill命令關模擬器的方式

#adb -s emulator-5554 emu kill
error: could not connect to TCP port 5554

再去檢視裝置列表,模擬器仍然存在。

根據剛才命令中的報錯資訊,adb這時候是要和埠5554進行通訊,但是卻不能正常通訊。
通過lsof命令把5554,5555,5556埠都看了一遍

#lsof -i :5555
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
circusd 17479 root   18u  IPv4 870827      0t0  TCP localhost:personal-agent
(LISTEN) circusd 17479 root 25u IPv4 870861 0t0 TCP localhost:personal-agent->localhost:34121 (ESTABLISHED) python 17486 root 28u IPv4 870860 0t0 TCP localhost:34121->localhost:personal-agent (ESTABLISHED)

原來是有circus佔用了5555埠。
於是去android開發者平臺查了一下adb通訊的埠號:

啟動一個 adb 客戶端時,此客戶端首先檢查是否有已執行的 adb 伺服器程序。如果沒有,它將啟動伺服器程序。當伺服器啟動時,它與本地 TCP 埠 5037 繫結,並偵聽從 adb 客戶端傳送的命令—所有 adb 客戶端均使用埠 5037 與 adb 伺服器通訊。

然後,伺服器設定與所有執行的模擬器/裝置例項的連線。它通過掃描 5555 到 5585 之間(模擬器/裝置使用的範圍)的奇數號埠查詢模擬器/裝置例項。伺服器一旦發現 adb 後臺程式,它將設定與該埠的連線。請注意,每個模擬器/裝置例項將獲取一對按順序排列的埠 — 用於控制檯連線的偶數號埠和用於 adb 連線的奇數號埠。例如:

模擬器 1,控制檯:5554
模擬器 1,adb:5555
模擬器 2,控制檯:5556
模擬器 2,adb:5557
以此類推…

如上所示,在埠 5555 與 adb 連線的模擬器例項與偵聽埠 5554 的控制檯的例項相同。

由於circus佔用了5555,5556,5557三個埠,adb server在啟動時,掃描埠號在5555-5585之間的奇數埠,誤把5555和5557當成了兩臺Android模擬器裝置。所以解決問題方法就很明確了,修改circus的配置檔案,將circus的端口占用改成5555-5585以外的值。