ADB原理,Wi-Fi連接,常用命令及拓展

Android 開發筆記 onGithub

文章多處鏈接需要科學上網

本文按順序主要講解了ADB的原理,使用Wi-Fi連接設備,ADB常用命令,在Java代碼中執行shell命令,使用ddmlib進行擴展。

ADB的原理

參考 官方文檔

ADB(Android Debug Bridge)是一個通用的命令行工具,能讓你和模擬器或連接的Android手機通信。

ADB的結構是一個client-server的結構,包含3個部分:

  • A Client : 發送命令。客戶端在你開發的PC上運行,當你在shell里使用Adb命令的時候就會開啟一個client。(其實你的shell就是一個client)

  • A daemon : 在設備上執行命令。守護進程在設備上后臺運行。(也就是一個叫做aabd的東西,運行在Andriod設備的底層)

  • A server : 管理客戶端(client)和守護進程(daemon)的連接。server在開發app的PC上后臺運行。

你可以在 /platform-tools 找到adb工具

ADB是如何工作的?

當你開啟一個adb client,client會首先檢查adb server是否運行,如果沒有的話先啟動一個adb server,當server啟動后,server默認綁定到本地(PC)的TCP端口5037(這個端口號可以設置,后文有述)并開始監聽從client發送的命令。(所有的adb client都會用5037端口和server通信)

然后server會建立和所有正在運行的設備或模擬器的通信連接。server通過掃描5555至5585之間的奇數號端口查找設備(這就是說設備所使用的端口號一定是5555-5585之間的奇數),如果server找到了一個守護進程daemon(運行在設備上的),那么server就會在這個端口建立一個連接(server是client和daemon的中間的橋梁)

注意:每一個設備需要一對連續的端口號,奇數端口號用來建立adb連接,偶數端口號用于控制臺連接(原文是console connections,據我理解應該是指 控制模擬器用的console連接)

像這樣:

Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557
and so on...復制代碼

上一個結構圖:

*上面的圖片來自于一篇很早比較詳細的文章 android adb adbd analyse *

有可能有人會問:5555-5585的奇數端口號是指定設備的,那么設備有沒有上限呢?

答案是沒有,原因如下:

  • 1.adb可以使用WiFi連接,也就是通過無線網絡連接。下文會講無線連接如何使用
  • 2.adb可以為adb server指定端口號,指定端口號后可以開啟多個server(不過Android Studio在調試程序時只識別5037端口的server)。

像這樣:

可以通過大寫的-P指定端口號,指定端口號后會開啟一個新的server,這樣的缺點就是,如果以后想查看5038端口server的一系列操作,比如查看連接的設備也必須加 -P 5038,否則查看的只是5037的server連接的設備。 如果之前已經開啟了5037的server,那么現在你的PC上現在已經有了兩個server,這里注意,你的設備只能和其中一個server通信。

正式因為上面結構圖的結構,才能使得adb能夠通過wifi進行連接。

使用wi-fi連接的使用方法:

1.將你的Android設備和你的開發機器連接到同一個Wi-Fi網絡環境下,記住是同一個。不是所有的無線節點都可以匹配,你也許需要使用支持adb的防火墻配置。(我將防火墻關閉了)

2.將你的設備和電腦通過USB連接

3.將你的手機設置成在端口5555監聽TCP/ip連接(在PC上執行,端口號自己指定)

$ adb tcpip 5555

4.斷開USB數據線

5.查看你的手機的IP地址(在手機連接的WiFi網絡的心里了能看到,每個手機的配置不一樣~)

6.通過指定IP地址進行連接 $ adb connect <device-ip-address>

7.看看效果吧,確定你的電腦是否已經連接上你的手機了

$ adb devices
List of devices attached
<device-ip-address>:5555 device
復制代碼

如果沒有連接上

  • 確定連在同一個wifi環境下
  • 重試adb connect或重啟adb server adb kill-server & adb start-server

熟悉Android Studio的人應該知道有一個叫做 ADBWIFI 的調試插件,里面用到的也是這些命令原理,剛開始我還覺得能自己開發一款Android Studio的插件很神奇,其實你打開那個鏈接琢磨琢磨,你也可以。里面用到了ddmlib這個jar包,文章的最后簡要介紹一下(感興趣的話可以好好研究。。)

ADB常用命令

語法:adb [-d|-e|-s <serialNumber>] <command>

如果你只連接一個物理設備,可以通過-d快速指定物理設備,如果你連接了只連接了一個模擬器,可以通過-e快速指定模擬器。

  • devices : 連接的設備列表,你可以看到serialNumber
  • help : 命令幫助
  • version : adb版本
  • logcat?[option] [filter-specs] :在屏幕上打印log,如果這個命令不會可以輸入adb logcat --help查看怎么使用
  • bugreport : 打印dumpsys,?dumpstate, logcat的信息,為了報告bug,類似adb bugreport > xxx.log
  • start-server : 開啟一個adb server
  • kill-server : 關閉adb server
  • install? :安裝apk(specified as a full path to an .apk file))
  • pull?? : 從你設備的remote拷貝文件到你PC上的local
  • push?? : 從你PC上的local拷貝文件到你設備的remote
  • forward?? : 將你本地的特定端口的信息轉發給你設備的remote端口上。 like this:

adb forward tcp:6100 tcp:7100 ???PC上所有6100端口通信數據將被重定向到手機端7100端口server上 adb forward tcp:6100 local:logd???PC上所有6100端口通信數據將被重定向到手機端UNIX類型socket上

  • get-serialno : 得到設備的序列號,其實就是devices的結果的前半部分
  • get-state : 得到設備的狀態[offline, device, no device]
  • wait-for-device : 直到設備online之后才會繼續執行,否則阻塞執行。like this:

adb wait-for-device install <app>.apk 安裝apk需要設備啟動之后才能執行,和其他adb命令配合使用

jdwp 和 ppp兩個命令沒搞清楚如何使用,歡迎知道的告訴我,互相學習,感謝 :)


adb shell

shell命令運行在android的設備上,命令的二進制文件在手機的/system/bin/...

語法:adb [-d|-e|-s <serialNumber>] shell <shell_command>

am

在shell命令下,你可以通過activity manager 工具(am)執行系統操作,包括開始一個activity, 強制關閉進程,廣播intent,設置設備屏幕參數等。 語法是am <command>,eg : adb shell am start -a android.intent.action.VIEW

內容比較多,建議翻墻詳細看,原文挺簡單的,我就不翻譯了 :)

和am搭配使用的有:

ComandDescription
start [options] Start an?Activity?specified by?
startservice [options] Start the?Service specified by?.
force-stop Force stop everything associated with? (the app's package name).
kill [options] Kill all processes associated with? (the app's package name). This command kills only processes that are safe to kill and that will not impact the user experience.

pm

在shell命令下,你可以通過package manager(pm)執行和包相關的操作。語法是pm <command>,eg :?adb shell pm uninstall com.example.MyApp,和am類似,這里就不一一展開了,需要請看官方文檔。

截圖

像這樣eg: $ adb shell screencap /sdcard/screen.png 你還可以這樣,截屏后從手機copy一份。

$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png
復制代碼

錄屏

僅支持?Android 4.4 (API level 19)及以上

Note:?Audio is not recorded with the video file. 僅僅是畫面而已

還有很多參數可以設置,這里不展開 eg: $ adb shell screenrecord /sdcard/demo.mp4

其他

dumpsys

dumpsys [options]meminfo 顯示內存信息cpuinfo 顯示CPU信息account 顯示accounts信息activity 顯示所有的activities的信息window 顯示鍵盤,窗口和它們的關系wifi 顯示wifi信息and so on復制代碼

eg:adb shell dumpsys meminfo [packageName]

By the way....你可以在java代碼中執行這些命令,并將結果寫到文件中,然后將文件發送到你的服務器上進行分析~~

參考: Running Shell commands though java code on Android? writing dumpstate to file android

ADB擴展

這里只簡單的說一些。 ADBWIFI 插件的源碼下載下來后你可以看到里面有一個ddmlib的類庫,它的位置在你的android-sdk下面的/sdk/tools/lib?目錄下,這個目錄下還有ddmuilib.jar,ddms.jar等。

那么這些工具有什么用呢?

通過這些工具你可以在你的代碼中

1.創建ADB

AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
復制代碼

2.獲得ADB連接的設備

IDevice devices[] = bridge.getDevices();
復制代碼

3.操作設備

device.installPackage(path, true, args);  //device instance of IDevice
device.uninstallPackage(pakagename);  
復制代碼

4.執行adb命令

device.executeShellCommand(cmd, receiver);
// receiver extends MultiLineReceiver
// cmd like "dumpsys meminfo [packageName]" adb shell command
復制代碼

是不是很酷?如果能夠再深入下去應該能發掘更多有意思的東西,感興趣的自己研究研究吧,東西挺多的 :)

可以參考 使用ddmlib實現android 性能監控 或直接閱讀 ADBWIFI?的源代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277972.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Flow快速開發Teams小應用

繼續我的上一篇博客&#xff0c;這篇繼續介紹BUILD大會里的內容&#xff1a;Flow。 Flow是微軟power平臺的一個服務&#xff0c;通過簡單的拖拽就可以完成一個業務邏輯的處理&#xff0c;現在Flow和Teams的結合十分緊密。我們來試一下。 先點擊Teams左邊的Flow菜單。 如果你的…

python正則中如何匹配漢字以及encode(‘utf-8’)和decode(‘utf-8’)的互轉

正則表達式&#xff1a;  [\u2E80-\u9FFF]$ 匹配所有東亞區的語言   [\u4E00-\u9FFF]$ 匹配簡體和繁體   [\u4E00-\u9FA5]$ 匹配簡體   <input type"text" name"username" οnkeyup"valuevalue.replace([\u4E00-\u9FA5]$)"> 正則表…

【區塊鏈】認識區塊鏈的基本概念

2018年區塊鏈技術風卷全球&#xff0c;似乎大家都在談論區塊鏈&#xff0c;那到底什么區塊鏈&#xff0c;區塊鏈到底能干什么&#xff0c;對普通人會有什么影響&#xff0c;很多人還是稀里糊涂&#xff0c;那么就談談我的一些理解吧&#xff0c;拋磚引玉歡迎探討。 我是如何接觸…

Java 分割、合并byte數組

場景&#xff1a;上傳文件較大&#xff0c;把存放文件內容byte數組拆分成小的。下載的時候按照順序合并。 起初覺得挺麻煩的&#xff0c;寫完覺得挺簡單。 切割&#xff1a; /*** 拆分byte數組* * param bytes* 要拆分的數組* param size* 要按幾個組成一…

Java版本的Bot Framework SDK

微軟為了鼓勵Java開發人員開發bot&#xff0c;在上個月推出了Java的Bot SDK v4.6版本&#xff0c;目前還在Preview版本&#xff0c;相信不用多久就可以趕上其他版本了。 我的java還停留在 n 年前的水平&#xff0c;但是處于好奇&#xff0c;決定玩一下這套sdk。 這套sdk目前建…

jquery方法.serializeArray()獲取name和value并轉為json數組

jquery的.serializeArray()方法可以獲取形如以下 [ {name: firstname, value: Hello}, {name: lastname, value: World}, ] name value組成的對象數組&#xff0c;如果我們想得到key為name,value為value的json對象&#xff0c;則如下轉換&#xff1a; var m {}; $.each($(&quo…

Teams Bot 如何使用新的 System.Text.Json 庫

我最近把 LuckyDraw的代碼升級到了 .net core 3.1&#xff0c;當然我也很想使用最新的微軟json庫&#xff0c;System.Text.Json這個庫的性能比之前Newtonsoft.Json速度更快&#xff0c;而且就我本人愛好來說&#xff0c;更加喜歡System.Text.Json的命名&#xff0c;之前一直覺得…

將Teams Template升級到dotnet core 3.1

為了方便開發者開發Teams應用&#xff0c;我在2018年做了dotnet c#的一套模板&#xff0c;這套模塊一共有三種類型&#xff0c;一個是Teams OutgoingWebhook&#xff0c;一個是MessagingExtension&#xff0c;還有一個就是Tab。 今天特地去nuget上看了一下&#xff0c;下載量還…

【動態規劃】cf1034C. Region Separation

質因數分解套路的復雜度分析的動態規劃 題目大意 有一顆$n$個節點有點權的樹&#xff0c;初始整棵樹為$1$號區域&#xff0c;要求滿足下列規則&#xff1a; 除非$i$是最后一個等級&#xff0c;否則每一個$i$級區域都要被分成至少兩個$i1$級區域對于每種等級&#xff0c;每個點必…

阿里大魚短信介入demo分享

下面是關于大魚短信平臺對接的例子&#xff0c;發短信的話&#xff0c;可以用這個&#xff0c;很好用 /*** 通過阿里短信接口發送短信驗證碼* ***/ public class SendSmsUtil {private static Logger logger Logger.getLogger(SendSmsUtil.class);/*** 生成驗證碼* return*/pu…

GraphAPI 1.0中新增加的Teams API

這篇繼續介紹BUILD大會里的內容&#xff1a;兩個新加入GraphAPI 1.0的關于Teams的API。 這兩個新增api是關于在頻道Channel里發送消息和回復消息的。實際上這兩個api在beta版本中早就已經加入&#xff0c;上個月build大會中公布的只是把這兩個api正式發布到1.0版本&#xff0c…

【數據結構】線性表(一):順序列表

線性表(linear_list)是最常用且最簡單的一種數據結構&#xff0c;簡言之&#xff0c;一個線性表是n個數據元素的有序序列。 例如&#xff1a;&#xff08;a1 , ... , ai-1 , ai , ai1 , ... , an)&#xff1a;ai-1 是 ai 的直接前驅&#xff0c;ai1 是 ai 的直接后驅。 并且&am…

Python_XlrdXlwt

1 import xlrd 2 # \U 開始的字符被編譯器認為是八進制 解決方法 r 3 objWB xlrd.open_workbook(rC:\Users\IBM\Desktop\S1\7月下旬入庫表.xlsx) 4 # 索引號 objTable objWB.sheet_by_index(0) 5 objTable objWB.sheet_by_name(7月下旬入庫表) 6 # 單元格3種讀取方式 7 print…

校招需要看的書 鞏固的知識

前言 感謝教練&#xff0c;學長們&#xff0c;隊友&#xff0c;lollipop&#xff0c;貓哥&#xff0c;李哥&#xff0c;表哥&#xff0c;雞哥&#xff0c;樣樣&#xff0c;咸糖&#xff0c;茗記&#xff0c;明沙&#xff0c;嘻&#xff0c;樹佬(排名不分先后)等等太多太多的人的…

新的Teams API權限控制

這篇繼續介紹BUILD大會里的內容&#xff1a;新的Teams API權限。這些新的權限讓開發者可以更加細粒度的設置權限。 之前有些開發人員有問過我&#xff0c;為什么Graph API的權限這么多&#xff0c;為什么不針對Teams弄一個總的權限&#xff0c;這樣不是更加簡單嗎&#xff1f;…

物料主數據(MM03)跳轉函數

CP_08_MATERIAL_SHOW 使用感覺能使自己的代碼顯得更改高端些。 其中參數MTSTA_IMP的選值參照表T132。轉載于:https://www.cnblogs.com/tangcy1110/p/9081380.html

二叉樹的蛇形遍歷 leetcode 103

給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層次遍歷。&#xff08;即先從左往右&#xff0c;再從右往左進行下一層遍歷&#xff0c;以此類推&#xff0c;層與層之間交替進行&#xff09;。 例如&#xff1a;給定二叉樹 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回…

Teams Tab的Single Sign-On

在我寫這篇文章的時候&#xff0c;這個SSO機制還是在 Developer Preview 階段&#xff0c;可能在發布前還會有一些改進。不過我覺得這個功能很好&#xff0c;所以先和大家分享一下。 如果大家之前已經開發過Teams的tab應用&#xff0c;可能會發現如果你需要一個當前用戶的toke…

vim編輯器的使用--轉自MJ學長

一、引言 1. vim是一款功能強大的文本編輯器&#xff0c;如果使用熟練&#xff0c;將會有效幫助我們提高編輯文本、程序的效率。vim編輯器的上手使用門檻比較高&#xff0c;很多人怯于要記很多命令&#xff0c;往往在學習的初期階段就望而卻步。 2. vim的學習需要不斷的練習、使…

算法引入

算法的概念&#xff1a; 解決問題的思路。 時間復雜度&#xff1a; 定義&#xff1a; 基本運算的執行數量。是算法效率的衡量的量。 計算準則&#xff1a; 基本操作&#xff1a;即只有常數項。復雜度認為1順序&#xff0c;按照加法計算循環&#xff0c;按照乘法計算條件。按照最…