一、adb的概念
adb工具即Android Debug Bridge(安卓調試橋) tools。它就是一個命令行窗口,用於通過電腦端與模擬器或者真實設備交互。
adb是androidsdk里的一個工具, 用這個工具可以直接操作管理android模擬器或者真實的andriod設備。
它的主要功能有:
1、運行設備的shell(命令行)。
2、管理模擬器或設備的端口映射。
3、計算機和設備之間上傳/下載文件。
4、將本地apk軟件安裝至模擬器或android設備
二、adb的構成和工作原理
adb 包含三個部分:
1. Daemon 守護進程:運行在調試設備中,手機或模擬器器,用來接收並執行 adb 命令;
2. Client端:運行在開發機器中,即你的開發電腦,用來發送 adb 命令;
3. Server端:同樣運行在開發機器中,用來管理 Client 端和手機的 Daemon 之間的通信。
總結下就是adb工具可以在電腦通過終端命令操作安卓手機/模擬器。
三、adb下載安裝
下載地址:https://adbshell.com/downloads
下載完成之后,進行解壓,完成后配置環境adb變量,環境變量配置的地址為adb.exe所在目錄。
完成后可在cmd界面檢查是否成功,指令adb version,出現如下信息,說明安裝完成。
四、adb命令基本使用
1、開啟/關閉adb服務
(通過在adb遇到問題時,一起使用,先關閉再重新開啟)
開啟adb服務:
adb start-server
指定端口啟動服務:
adb -p <port> start-server
關閉adb服務:
adb kill-server
2、查看設備【獲取連接設備】
adb devices
- offline 表示設備沒有連接成功或無響應
- device 表示連接成功
- no device 表示沒有獲取到連接設備
如果存在有多個設備/模擬器連接在電腦情況需要指定設備執行adb命令:
- -d 指定通過USB連接的唯一設備為指定對象
- -s<serialNumber> 指定相應手機設備序列號的設備為指令對象
- -e 指定唯一的模擬器設備為指令對象
3、獲取包名和界面名【應用】
- 包名和界面名的概念:
- 包名(package):決定程序的唯一性(不是應用的名字)
- 界面名(activity):目前可以理解,一個界面名,對應着一個界面。【界面名可能會在和同事溝通交流或網站的文章中翻譯為啟動名】
- 獲取包名和界面名:
- 應用場景:自動化測試需要通過代碼的形式告訴手機測試哪個應用程序的哪一個界面,所以需要通過這個命令進行獲取。
- 使用步驟:1. 打開需要測試的應用程序;2. 輸入 adb 命令
- 命令格式:
- Mac/Linux:
adb shell dumpsys window windows | grep mFocusedApp
- Windows:
adb shell dumpsys window windows | findstr mFocusedApp
- 例如:獲取設置程序的包名和界面名
- 先在模擬器器或手機中打開《設置》應用程序
- 輸入對應平台即不同操作系統獲取包名和界面名的命令
- 結果如下:
mFocusedApp=AppWindowToken{53309da token=Token{2e2fa785 ActivityRecord{2928d4fc u0 com.android.settings/.Settings t1127}}}
- 包名為:
com.android.settings
- 界面名為:
.Settings
4、發送文件到手機
- 應用場景:將手機需要的數據(數據庫文件)在電腦上調整好,直接發送給手機
- 命令格式:
adb push 電腦的文件路徑 手機的文件夾路徑
- 實例:將桌面的 a.txt 發送到手機的 sd 卡
adb push C:\Users\hm\Desktop\a.txt /sdcard
5、從手機中拉取文件
- 應用場景:將手機產生的文件(數據庫文件,日志文件)拉取到電腦中
- 命令格式:
adb pull 手機的文件路徑 電腦的文件夾路徑
- 實例:將手機的 sd 卡的 a.txt 拉取到桌面
adb pull /sdcard/a.txt C:\Users\hm\Desktop
6、獲取 app 啟動時間【應用】
- 應用場景:①如果企業對應用程序的啟動速度有要求,則需要使用這個命令進行測試;②測試標准:參照同類軟件,啟動時間不能超出一倍即可
- 命令格式:
adb shell am start -W 包名/啟動名
- 實例:啟動 com.android.settings 程序並且進入主界面 ( .Settings )
adb shell am start -W com.android.settings/.Settings
- 解釋:
1. ThisTime :該界面 ( activity ) 啟動耗時(毫秒) 2. TotalTime :應用自身啟動耗時 = ThisTime + 應用 application 等資源啟動時間(毫秒) 3. WaitTime :系統啟動應用耗時 = TotalTime + 系統資源啟動時間(毫秒)
7、獲取手機日志【應用】
- 應用場景:將bug的日志信息發送給開發人員,便於開發人員定位bug
- 使用步驟:
- 打開需要測試的應用程序
- 找到觸發bug的位置
- 使用查看日志命令
- 觸發bug
- 獲取日志信息
- 命令格式:
adb logcat
# Linux操作系統查找指定app的運行日志
adb logcat | grep(unix) 包名
# Windows操作系統查找指定app的運行日志
adb logcat | findstr(win) 包名 - 示例:登錄功能存在bug
1. 安裝bug.apk
2. 打開《有bug的程序》應用程序
3. 命令行中輸入 adb logcat 命令
4. 點擊登錄按鈕
5. 獲取日志信息 - 結果如下:
E/AndroidRuntime( 6593): FATAL EXCEPTION: main E/AndroidRuntime( 6593): Process: cn.itcast.myapplication, PID: 6593 E/AndroidRuntime( 6593): java.lang.ArrayIndexOutOfBoundsException: length=5; index=8 E/AndroidRuntime( 6593): at cn.itcast.myapplication.LoginActivity.attemptLogin(LoginActivity.java:149) E/AndroidRuntime( 6593): at cn.itcast.myapplication.LoginActivity.access$000(LoginActivity.java:40) E/AndroidRuntime( 6593): at cn.itcast.myapplication.LoginActivity$2.onClick(LoginActivity.java:89) E/AndroidRuntime( 6593): at android.view.View.performClick(View.java:4780) E/AndroidRuntime( 6593): at android.view.View$PerformClick.run(View.java:19866) E/AndroidRuntime( 6593): at android.os.Handler.handleCallback(Handler.java:739) E/AndroidRuntime( 6593): at android.os.Handler.dispatchMessage(Handler.java:95) E/AndroidRuntime( 6593): at android.os.Looper.loop(Looper.java:135) E/AndroidRuntime( 6593): at android.app.ActivityThread.main(ActivityThread.java:5254) E/AndroidRuntime( 6593): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 6593): at java.lang.reflect.Method.invoke(Method.java:372) E/AndroidRuntime( 6593): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java :903) E/AndroidRuntime( 6593): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
8、其他命令
9、查看屏幕的信息
①查看連接設備屏幕的分辨率:
adb shell wm size
②查看屏幕密度,即屏幕密度是多少dpi:
adb shell wm density
10、adb查看應用列表
命令格式:
adb shell pm list packages [參數]
具體參數的信息以及說明:
例如:
①顯示所有應用信息 adb shell pm list packages ②顯示系統應用 adb shell pm list packages -s ③顯示三方應用 adb shell pm list packages -3
11、安裝apk
命令格式:
# 普通安裝
adb install [參數]
# 覆蓋安裝【將最新版本app安裝在安卓設備上並覆蓋之前的舊版本】
adb install -r [參數]
例如想把電腦上的apk文件直接安裝到安卓設備上:
adb install /Users/xxxxxx/Desktop/xxxx.apk(這個路徑是apk在電腦上的路徑)
12、卸載應用
以360為例子
卸載命令,不保留目錄和緩存數據:
adb uninstall 應用包名(com.qihoo360.mobilesafe)
不卸載app,清除應用的數據和緩存:
adb shell pm clear 應用包名(com.qihoo360.mobilesafe)
卸載APP,但是保留目錄和緩存數據:【-k 卸載APP,但是保留目錄和緩存數據】
adb uninstall [-k] <packagename>
查看應用的安裝路徑:
adb shell pm path <packagename>
13、截取安卓設備屏幕
命令格式:
adb shell screencap -p /sdcard/sc.png
- -p 指定文件保存為png格式
- -d display-id 指定截屏的顯示屏編號(多屏情況下)
14、錄制安卓設備屏幕
命令格式:
adb shell screenrecord /sdcard/filename.mp4
- -size WIDTHxHEIGHT 視頻的尺寸,默認為屏幕的分辨率
- -bite-rate RATE 視屏的比特率,默認是4Mbps
- -time-limit TIME 錄制時長,單位秒
- -verbose 輸出更多信息
15、當前app的CPU情況
第一種方法:
命令格式:
adb shell dumpsys cpuinfo | grep <package_name>
第二種方法:
①進入adb環境(linux環境):
在命令行輸入:
adb shell
② 在adb shell里輸入:
dumpsys meminfo <package_name>
# <package_name> 為軟件包名,如:com.storm.yeelion。
顯示結果如下:
參數含義: dalvik : dalvik使用的內存 native : native堆上的內存,指C\C++堆的內存(android 3.0以后bitmap就是放在這兒) other : 除了dalvik和native的內存,包含C\C++非堆內存······ Pss : 該內存指將共享內存按比例分配到使用了共享內存的進程 allocated : 已使用的內存 free : 空閑的內存 private dirty : 非共享,又不能被換頁出去的內存(比如linux系統中為了提高分配內存速度而緩沖的小對象,即使你的進程已經退出,該內存也不會被釋放) share dirty : 共享,但有不能被換頁出去的內存
16、查看Android手機CPU和內存占用情況
①進入adb環境(linux環境):
在命令行輸入:
adb shell
②在adb環境輸入:
top -m 10 -s cpu
- -m 10表示顯示數量為10
- -s表示按指定行排序
顯示結果如下圖:
參數含義: PID : progress identification,應用程序ID S : 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數 THR : 程序當前所用的線程數 VSS : Virtual Set Size虛擬耗用內存(包含共享庫占用的內存) RSS : Resident Set Size實際使用物理內存(包含共享庫占用的內存) PCY : 前台(fg)和后台(bg)進程 UID : User Identification,用戶身份ID Name : 應用程序名稱
③ 退出adb:ctrl + c
五、adb命令思維導圖