1. 程式人生 > >第4章4節《MonkeyRunner原始碼剖析》ADB協議及服務: ADB命令列客戶端使用簡介(原創)

第4章4節《MonkeyRunner原始碼剖析》ADB協議及服務: ADB命令列客戶端使用簡介(原創)

天地會珠海分舵注:本來這一系列是準備出一本書的,詳情請見早前博文“尋求合作伙伴編寫《深入理解 MonkeyRunner》書籍“。但因為諸多原因,沒有如願。所以這裡把草稿分享出來,所以錯誤在所難免。有需要的就參考下吧,轉發的話還請保留每篇文章結尾的出處等資訊。

從前面幾個小節我們知道ADB命令列客戶端是存在與主機端的一個命令,使用者可以使用該命令來發送服務請求到ADB伺服器,ADB伺服器再判斷該服務請求是主機服務請求還是本地服務請求來決定是否應該將請求傳送給遠端adbd守護程序進行執行。

在測試過程中,我們經常會用到ADB這個命令列客戶端來輔助測試,那麼我們這裡就對我們經常會用到的命令進行學習和實踐。

ADB命令之-列出所有裝置資訊:”adb devices -l”。

該命令的作用是將所有連線上來的安卓裝置的基本資訊給列出來,比如該裝置的裝置id,有了該id後我們編寫指令碼的時候就可以在MonkeyRunner類的waitForConnection中指定該id來建立MonkeyRunner後臺和目標安卓機器的連線。

圖4-4-1 列出所有裝置資訊

圖4-4-1 列出所有裝置資訊

ADB命令之-指定一個裝置進行通訊:”adb -s”。

如上面列出來的資訊中顯示有多個裝置掛載上了主機,那麼我們如何才能傳送一個命令到想要的一個裝置上面了,比如進入到目標裝置的互動shell。這個時候我們就可以通過”-s”選項來指定目標裝置的裝置id來指定想要連線的目標裝置來發送想要的命令了,比如”adb -s 192.168.1.103:5555 shell”。下圖顯示了該命令傳送後的結果,紅色圈起來的部分代表已經進入到目標安卓機器的互動shell。

圖4-4-2 傳送命令到指定目標裝置
圖4-4-2 傳送命令到指定目標裝置

當然,如果當前掛載上來的只有一個裝置的話,你也可以不知道ing任何裝置就能傳送命令。但如果有多過裝置而沒有指定目標裝置的話,命令會因為不知道傳送到哪個裝置而報錯:

圖4-4-3 傳送命令到沒有指定的裝置的錯誤輸出
這裡寫圖片描述

ADB命令之-通過TCP連線目標裝置。

有時候可能你不想通過USB線直接連上你的主機來進行測試,因為USB連線畢竟是物理連線,在測試執行過程中可能你不小心動了下USB連線就會導致整個測試需要重頭再來。這個時候你就可以考慮使用TCP協議來連線你的目標安卓裝置了。但連線之前,你需要先在USB有線連線的基礎上保證目標安卓機器上的adbd有在監聽預設TCP埠5555,否則主機端是不能連線上adbd的(當然你也可以指定adbd去監聽其他TCP埠,只是這樣的話,主機端就需要指定該埠進行連線了)。預設情況下adbd是沒有開啟該TCP埠監聽的。

我們可以通過往目標安卓機器傳送“adb shell getprop service.adb.tcp.port”命令去檢查adbd是否有設定監聽任何TCP埠,安卓的getpropr命令是去獲取一個系統屬性,這個在上一章我們已經描述過,這裡指定的”service.adb.tcp.port”這個系統屬性指的就是adbd監聽的TCP埠。當然,如果你對linux命令比較熟悉的話,也可以直接傳送‘adb shell netstat|grep 5555”命令去檢查當前是否有任何服務在監聽該埠。這裡給出當沒有設定監聽的時候的兩個命令的輸出結果如下:

圖4-4-4 判斷adbd是否有監聽TCP預設埠
圖4-4-4 判斷adbd是否有監聽TCP預設埠

這個時候我們就需要把”service.adb.tcp.port”這個屬性設定成預設監聽埠5555,需要傳送的命令是”adb shell setprop service.adb.tcp.port 5555”。當設定好該監聽埠後我們再通過上面的兩個命令去檢視該埠是否有起效:

圖4-4-5 adbd預設TCP監聽埠已開啟
圖4-4-5 adbd預設TCP監聽埠已開啟

下一步我們要做的就是獲得安卓目標裝置的IP地址了,可以通過傳送命令”adb shell netcfg”來獲得:

圖4-4-6 獲得目標安卓機器ip地址
圖4-4-6 獲得目標安卓機器ip地址

最後我們就可以通過”adb connect”命令來連線上指定的ip地址所表示的安卓裝置了,下圖給出了連線前後的”adb devices -l”列出來的連線上來的裝置資訊對比,可以看到比連線前多了個已IP:port為裝置id的安卓裝置資訊:

圖4-4-7 連線前後裝置列表對比
圖4-4-7 連線前後裝置列表對比

ADB命令之-埠轉發

使用者可以通過ADB命令列客戶端的埠轉發選項把一個本地埠轉發到目標安卓裝置的對應埠,這樣本地應用就能直接跟本地埠進行通訊,其效果有如直接跟遠端對應埠進行通訊。比如我們可以將本地4939埠設定成對目標安卓裝置的ViewServer服務監聽埠4939的轉發,這樣我們就可以直接操作該本地埠進行ViewServer通訊了。下圖顯示瞭如何通過”adb forward”命令對該埠進行轉發,然後通過”adb forward –list”命令將所有設定了埠轉發的連線給列出來。

圖4-4-8 埠轉發命令示例
圖4-4-8 埠轉發命令示例

ADB命令之-安裝應用

可以通過“adb install”命令將指定路徑的安裝包安裝到目標安卓機器上面,請看下圖示例:

圖4-4-9 安裝應用命令示例
圖4-4-9 安裝應用命令示例

ADB命令之-解除安裝應用

可以通過”adb uninstall”命令解除安裝指定包名的應用。通過安卓系統的”pm”包管理命令”pm list packages”可以列出所有已經安裝的包名,然後找到需要解除安裝的應用包。

圖4-4-10 列出所有已安裝應用包
圖4-4-10   列出所有已安裝應用包

在找到需要解除安裝的應用包後就可以通過”adb uninstall”命令將其解除安裝掉了,請看下圖:

圖4-4-11 解除安裝應用命令示例
圖4-4-11 解除安裝應用命令示例

ADB命令之-推送檔案到目標裝置

通過”adb push local remote”命令可以把本地local的一個檔案推送到目標安卓裝置的remote這個地址下面。下例就是通過該命令把本地的NotePade.apk命令推送到遠端裝置的”/data/local/tmp/”這個目錄下面,並最終通過”ls”命令把該檔案列出來:

圖4-4-12 push檔案示例
圖4-4-12 push檔案示例

ADB命令之-下拉檔案到本地

有時我們需要從目標安卓裝置下載一些檔案到主機這邊,比如需要分析系統log的時候。這時我們就可以通過”adb pull remote local”命令將遠端remote路徑指定的一個檔案下拉到本地local指定的位置。下圖顯示了將遠端“/data/local/tmp/1.png”這個檔案下拉到本地當前目錄的命令示例:

圖4-4-13 push檔案示例
圖4-4-13 push檔案示例

ADB命令之-實時檢視logcat記錄

可以通過”adb logcat”命令來檢視logcat列印的實時除錯資訊,方便我們在開發的過程中除錯系統問題。下圖給出了”adb logcat”命令的一部分列印輸出:

圖4-4-14 adb logcat 輸出示例
圖4-4-14 adb logcat 輸出示例

ADB命令之-傳送安卓系統shell命令

最後描述的一個命令就是”adb shell”命令,上面其實我們已經見識過它的威力了。如果”adb shell”命令後面沒有加其他命令,那麼就會進入到安卓互動式shell,其效果跟我們直接在安卓命令列終端跟安卓系統進行互動沒有任何區別。如果“adb shell”命令後面跟著一個安卓系統的shell命令,那麼該命令執行完後會立即返回,並不會進入互動式shell。這裡不可能對安卓系統的所有命令進行描述,我們只能在今後碰到的時候針對性的進行描述。

——— 未完待續———

相關推薦

44MonkeyRunner原始碼剖析ADB協議服務: ADB命令客戶使用簡介(原創)

天地會珠海分舵注:本來這一系列是準備出一本書的,詳情請見早前博文“尋求合作伙伴編寫《深入理解 MonkeyRunner》書籍“。但因為諸多原因,沒有如願。所以這裡把草稿分享出來,所以錯誤在所難免。有需要的就參考下吧,轉發的話還請保留每篇文章結尾的出處等資訊

6建立函式-----------(在.bashrc檔案中定義函式、在命令建立函式、在命令中使用函式)

6.6在命令列中使用函式          指令碼函式可以用於建立比較複雜的操作。指令碼函式不僅可以用作shell指令碼命令,也可以用作命令列介面的命令。一旦在shell中定義了函式,可以從系統的任意目錄使用這個函式。不必擔心PATH環境變數是否包含函式檔案所在目錄。關鍵是

144MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-port轉發

是把 atd int set rc4 ccf jna inf xbm 在初始化HierarchyViewer的實例過程中,HierarchyViewer會調用自己的成員方法setupViewServer來把ViewServer裝備好,那麽我們這裏先看下這種方法: 39

55MonkeyRunner原始碼剖析》Monkey原理分析-啟動執行: 獲取系統服務引用(原創)

天地會珠海分舵注:本來這一系列是準備出一本書的,詳情請見早前博文“尋求合作伙伴編寫《深入理解 MonkeyRunner》書籍“。但因為諸多原因,沒有如願。所以這裡把草稿分享出來,所以錯誤在所難免。有需要的就參考下吧,轉發的話還請保留每篇文章結尾的出處等資訊

67MonkeyRunner原始碼剖析》Monkey原理分析-事件源-事件源概覽-注入按鍵事件例項

在事件生成並放入到命令佇列後,Monkey類的runMonkeyCycles就會去呼叫相應事件源的getNextEvent來獲的事件來執行事件注入,那麼這一小節我們通過MonkeyKeyEvent這個事件的注入方法來看下事件注入過程是怎麼樣的。往系統注入按鍵事件最終是通過呼叫

82MonkeyRunner源代碼剖析MonkeyRunner啟動執行過程-解析處理命令行參數

path 轉載 iss 命令 code rst pri bsp ack MonkeyRunnerStarter是MonkeyRunner啟動時的入口類,由於它裏面包括了main方法.它的整個啟動過程主要做了以下幾件事情:解析用戶啟動MonkeyRunner時從命令行傳輸

145MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-查詢ViewServer執行狀態

com bridge turn ngs nor arch prot 我們 microsoft 上一小節我們描寫敘述了HierarchyViewer是怎樣組建ADB協議命令來實現ViewServer的port轉發的。在port轉發設置好後,下一個要做的事情就是去檢測目標

文章翻譯4-6

some load valid 包裝 bili 排序 character input abi 4 Performing cross-validation with the 並包裝卡雷特進行交叉驗證 caret packageThe Caret (classifica

Spring 實戰--4.3 Introductions&@DeclareParents

frame 轉換 ret ger ted integer cati override pub @DeclareParents非常有意思,單獨拿出來,這個可以給實現相同接口的類增加新的共同接口, 這樣在不侵入原有代碼的情況下,轉換成其他類型並擁有新的方法。 這個功能在Sp

Spring 實戰--4.4 使用xml中聲明切面引入新方法

cati sys epp proc oca cover tor ring tex 當不能直接接觸源碼時,同樣的不能給源碼增加註解,這時可以使用xml的方式聲明切面並引入新方法 CompactDisc接口 package main.java.soundsystem;

快學Scala #4答案

數組 第三章 給定 arr val scala 一個 filter array 4.給定一個整數數組,產生一個新的數組,包含原數組中的所有正值,按原有順序排序 之後的元素是所有的零或者負值,按原有順序排序 scala> val arr = Array(1, 2, 3

21天學python——4.1、4.2

4.1.1 if基礎 看了之前的基礎起始已經懂得if的基本用法了 if 《條件》:     《語句》 栗子:   然後if是可以有分支的,其實就是else 和else if,但是else if 只能寫成 elif ,在來個栗子:

作業系統 4 死鎖

1、死鎖(Deadlock): 指多個程序在執行過程中,因爭奪資源而造成的一種僵局。當程序處於這種狀態時,若無外力作用,它們都將無法再向前推進。 死鎖 : 指程序之間無休止地互相等待! 飢餓 :指一個程序無休止地等待! 2、產生死鎖的原因

Vulkan Cookbook 4 建立檢視緩衝區

建立檢視緩衝區 譯者注:示例程式碼點選此處 當我們想要將給定緩衝區用作統一紋理緩衝區或儲存紋理元素緩衝區時,需要為它建立檢視緩衝區。 怎麼做... 1.獲取建立了給定緩衝區的邏輯裝置控制代碼。將其儲存在名為logical_device的VkDevice型別的變數中。 2.獲取建立的緩

Vulkan Cookbook 4 建立儲存影象

建立儲存影象 譯者注:示例程式碼點選此處 儲存影象准許我們從繫結到管道的影象載入(未過濾的)資料。但更重要的是,它還准許我們在影象中儲存著色器中的資料。必須使用指定的VK_IMAGE_USAGE_STORAGE_BIT標誌建立此影象 怎麼做... 獲取物理裝置控制代碼並將其儲存

php原始碼之路第一 (記憶體管理概述)

記憶體是計算機非常關鍵的部件之一,是暫時儲存程式以及資料的空間,CPU只有有限的暫存器可以用於儲存計算資料,而大部分的資料都是儲存在記憶體中的,程式執行都是在記憶體中進行的。和CPU計算能力一樣,記憶體也是決定計算效率的一個關鍵部分。 計算中的資源中主要包含:

springcloud系列—Config—6-4: Spring Cloud Config 客戶端詳解、動態重新整理配置

資料參考:《Spring Cloud 微服務實戰》 目錄 客戶端詳解 uri指定配置中心(Config First Bootstrap) 服務化配置中心(Discovery First Bootstrap) 失敗快速響應與重試 獲取遠端配置 動態重新整理配置 客戶

springcloud系列—Zuul—5-4: Spring Cloud Zuul 異常處理、禁用過濾器、動態載入

資料參考:《Spring Cloud 微服務實戰》 目錄 異常處理 try-catch處理 ErrorFilter處理 不足與優化 自定義異常資訊 禁用過濾器 動態載入          動態路由  

springcloud系列—Hystrix—3-4: Hystrix 請求合併

資料參考:《Spring Cloud 微服務實戰》 目錄 請求合併 服務提供者介面 服務消費者  合併請求和不合並的區別 通過註解實現請求合併   請求合併 在微服務架構中,我們將一個專案拆分成很多個獨立的模組,這些獨立的模組通過遠端呼叫來

php原始碼之路第一 ( Zend虛擬機器)

在前面的章節中,我們瞭解到一個PHP檔案在伺服器端的執行過程包括以下兩個大的過程: 遞給php程式需要執行的檔案, php程式完成基本的準備工作後啟動PHP及Zend引擎, 載入註冊的擴充套件