本文嘗試列舉客戶端能夠傳送給adb伺服器的所有請求。關於adb客戶端、adb伺服器、adbd守護程序、adb服務的概念,以及這些元件如何相互配合完成adb工作的細節,請參考之前發的文章《android debug bridge 技術實現》。
******************************
主機服務
******************************
host:version
請求adb伺服器的內部版本號。作為乙個特殊的例外,伺服器將用4位元組的十六進製制字串回應,返回伺服器內部版本號,回應中沒有「okay」和「fail」。
host:kill
請求adb伺服器立即退出。用於adb客戶端檢測到在公升級之後有廢棄的adb伺服器仍在執行的情況。
host:devices
請求返回可用的android裝置及其狀態的列表。在「okay」之後是4個位元組的長度定義,然後是指定長度的表明當前裝置狀況的字串,返回之後連線關閉。
host:track-devices
「host:devices」的乙個變種,它不關閉連線;相反,每次新增或移除裝置或者指定裝置的狀態發生變化,乙個新的裝置列表描述被傳送。這就使得像ddms這樣的工具能夠實時跟蹤連線裝置的狀態,而不用重複輪訓伺服器。
host:emulator:
這是乙個特殊的請求,當啟動乙個新的模擬器時,該請求被傳送到adb伺服器。是乙個十進位制數字代表模擬器的adb協議埠號,比如:模擬器將自動**到adbd守護程序的tcp埠號。這個機制使得adb伺服器能夠知道新的模擬器例項啟動。
host:transport:
請求切換連線到指示的裝置或模擬器。接到「okay」回應之後,所有的客戶端請求將被直接傳送給執行在指定裝置上的adbd守護程序。(用來實現-s)
host:transport-usb
請求切換連線到通過usb連線到主機的裝置上。如果存在多個這樣的裝置,請求將失敗。(用來實現-d)
host:transport-local
請求切換連線到通過tcp連線的模擬器。如果有多個這樣的模擬器例項在執行,請求將失敗。(用來實現-e)
host:transport-any
另乙個「host:transport」變種。請求切換連線到已連線的裝置或正在執行的模擬器。如果可用的裝置或模擬器多於乙個,請求將失敗。(用在-s、-d、-e都不被提供時)
host-serial::
這是乙個特殊形式的請求,字首「host-serial::」表明客戶端正在請求adb伺服器獲得指定裝置的資訊。可以是下述格式的一種。
host-usb:
host-serial的乙個變種,用於將連線到主機的唯一usb裝置作為目標。如果沒有這樣的裝置或有多個這樣的裝置,請求將失敗。
host-local:
host-serial的乙個變種,用於將執行在主機上唯一的模擬器例項作為目標。如果沒有這樣的模擬器或有多個這樣的模擬器,請求將失敗。
host:
當請求裝置相關的資訊時,「host:」也能被解釋為「任何連線到主機的唯一裝置或執行在主機上的唯一模擬器」。
:get-product
暫無解釋。
:get-serialno
返回對應裝置或模擬器的序列號。注意模擬器序列號是「emulator-5544」的形式。
:get-state
返回指定裝置的狀態字串。
:forward:;
請求adb伺服器將本地連線從轉移到指定裝置上的位址。
這裡的可以是上面描述的host-serial、host-usb、host-local、host的任意乙個,它表明目標是哪個裝置或模擬器。
的格式有以下幾種:
tcp:-> 在localhost:上的tcp連線
local:-> 在上的unix本地域套接字(unix domain socket)
的格式有以下幾種:
tcp:-> 在裝置上localhost:的tcp連線
local:-> 在裝置上的unix本地域套接字
jdwp:-> 在虛擬機器程序中的jdwp執行緒
或者下面所描述的本地服務的任何一種。
******************************
本地服務
******************************
下面所有的請求都假設你已經切換傳輸到實際的裝置,或者你使用上面所描述的請求字首。
shell:command arg1 arg2 ...
在裝置的shell中執行「command arg1 arg2 ...」,返回輸出流及錯誤流。注意命令引數必須用空格分隔。如果乙個引數包含空格,應該對它使用雙引號。引數不能包含雙引號和其他會導致錯誤的符號。
這是「adb shell」的非互動版本。
shell:
在裝置上啟動乙個互動的shell會話。恰當的重定向標準輸入、標準輸出和標準錯誤輸出。adb伺服器使用這個服務來實現「adb shell」,但是在輸入被傳送到裝置之前,adb伺服器也會對輸入做加工。(參考commandline.c中的interactive_shell()函式)
remount:
請求adbd守護程序重新掛載裝置的檔案系統到讀/寫模式下,而不是唯讀模式。在執行「adb sync」或者「adb push」之前,通常都需要這個服務。
在不允許該操作的特定的系統中,這個請求可能不成功。
dev:
開啟乙個裝置檔案,直接將客戶端連線到這個檔案去執行讀寫。該服務對於除錯除錯很有用,但是需要特殊的許可權,不能在所有的裝置上執行。是從檔案系統根目錄開始的全路徑。
tcp:
嘗試連線到loclhost的tcp埠上。
tcp::
嘗試從裝置連線到所指定機器的tcp埠上。這個服務對除錯只能在裝置上顯示的網路或**問題很有用。
local:
嘗試連線到裝置上的unix域套接字。
localreserved:
localabstract:
localfilesystem:
幾個local:的變種,用來訪問其他android套接字命名空間。
log:
開啟乙個系統日誌(/dev/log/),允許客戶端直接讀取。用來實現「adb logcat」。資料流對客戶端是唯讀的。
framebuffer:
這個服務用來向客戶端傳送framebuffer的快照。它需要足夠的許可權,工作原理如下:
在「okay」之後,服務傳送包含下列欄位的16位元組的二進位制結構(低位優先格式):
depth: uint32_t: framebuffer深度
size: uint32_t: framebuffer大小(單位:位元組)
width: uint32_t: framebuffer寬度(單位:畫素)
height: uint32_t: framebuffer高度(單位:畫素)
在當前的實現中,framebuffer深度總是16,大小總是:寬度*高度*2。
每當客戶端想要乙個快照時,它應該通過通道傳送乙個位元組,觸發服務將framebuffer資料按framebuffer大小指定的位元組數傳送給它。
如果adbd守護程序沒有足夠的許可權開啟framebuffer裝置,那麼連線會立即關閉。
dns:
這個服務是個例外,因為它僅僅執行在adb伺服器中。它被用來實現usb聯網,比如:通過主機為裝置提供乙個網路連線。
它用來在主機上執行gethostbyname(),ip位址以4個位元組的字串返回。
recover:
這個服務上傳乙個recovery影像到裝置中。必須與recovery影像檔案大小一樣。工作原理如下:
- 建立乙個命名為/tmp/update的檔案;
- 從客戶端讀取大小的位元組數,將它們寫入到/tmp/update;
- 當影像檔案成功讀取之後,建立乙個命名為/tmp/update.start的檔案。
只有當裝置處於recovery模式時,這個服務才能工作。此外,如果/tmp目錄不存在,連線會立即關閉。
jdwp:
連線到執行在虛擬機器程序中的jdwp執行緒。
track-jdwp
用於週期性的向客戶端傳送jdwp pids列表。返回資料格式如下:
: 4個字元的十六進製制字串指定所有內容的長度
: 一連串的格式為"/n"的ascii行
ddms使用這個服務知道裝置或模擬器上正在執行哪些可以除錯的程序。
注意沒有僅獲取一次列表的單步服務。
sync:
這個請求啟動檔案系統同步服務,用來實現「adb push」和「adb pull」。因為這個服務相當複雜,需要專門的文章來解釋說明,如果有朋友感興趣,我們以後專門討論。
AngularJS 服務 location詳解
location是基於window.location的服務 可以獲取瀏覽器位址列中的url,也可以修改瀏覽器位址列的url。一.只能獲取位址列資訊方法 1.absurl 2.protocol location.protocol 獲取當前url 協議 location.host 獲取當前url 主機名...
nginx伺服器access log日誌詳解
前言 nginx的log日誌分為 access log 和 error log 其中access log 記錄了哪些使用者,哪些頁面以及使用者瀏覽器 ip和其他的訪問資訊 error log 則是記錄伺服器錯誤日誌 log format 日誌格式語法 log format name 格式名字 格式樣...
vs2010建立web服務以及引用服務詳細步驟
2012 10 15 12 50 vip 無趣 分類 使用 瀏覽5773次 webservice 2012 10 16 11 53 提問者採納 在vs2010裡面 其實不建議用web service的,正如一樓說的 用wcf。1.我們新建乙個web service asmx結尾的 2.我們在新建的可...