ADB 操作命令詳解及用法大全
ADB 操作命令詳解及用法大全
- 一、ADB是什麼?
- 二、ADB有什麼作用?
- 三、ADB命令語法
- 四、ADB常用命令
- 4.1 基本命令
- 4.1.1 檢視adb的版本資訊
- 4.1.2 啟動adb
- 4.1.3 停止adb
- 4.1.4 以 root 許可權執行 adbd
- 4.1.5 指定 adb server 的網路埠
- 4.1.5 查詢已連線的裝置/模擬器列表
- 4.2 裝置連線管理
- 4.3 應用管理
- 4.3.1 檢視應用列表
- 4.3.1.1 檢視所有應用
- 4.3.1.2 檢視系統應用
- 4.3.1.3 檢視第三方應用
- 4.3.1.4 包名包含某字串的應用
- 4.3.2 安裝應用
- 4.3.3 解除安裝應用
- 4.3.4 清除應用資料與快取
- 4.3.5 檢視前臺 Activity
- 4.3.6 檢視正在執行的 Services
- 4.3.7 檢視應用詳細資訊
- 4.3.7 檢視應用安裝路徑
- 4.4 與應用互動
- 4.5 檔案管理
- 4.5.1 從模擬器/裝置下載指定的檔案到計算機
- 4.5.2 將指定的檔案從計算機上傳到模擬器/裝置
- 4.5.4 列出指定目錄的內容
- 4.5.5 切換到目標目錄
- 4.5.6 刪除檔案或目錄
- 4.5.7 建立目錄
- 4.5.8 建立空檔案或改變檔案時間戳
- 4.5.9 輸出當前目錄路徑
- 4.5.10 複製檔案和目錄
- 4.5.11 移動或重新命名檔案
- 4.6 網路管理
- 4.7 模擬按鍵/輸入
- 4.7.1 電源鍵
- 4.7.2 選單鍵
- 4.7.3 HOME 鍵
- 4.7.4 返回鍵
- 4.7.5 音量控制
- 4.7.6 媒體控制
- 4.7.7 點亮/熄滅螢幕
- 4.7.8 滑動解鎖
- 4.7.9 輸入文字
- 4.8 日誌列印
- 4.8.1 Android 日誌
- 4.8.1.1 按級別過濾日誌
- 4.8.1.2 按 tag 和級別過濾日誌
- 4.8.1.3 將日誌格式化輸出
- 4.8.1.3 清空已存在的日誌
- 4.8.1.4 將日誌顯示在控制檯
- 4.8.1.5 將日誌輸出到檔案
- 4.8.1.6 載入一個可使用的日誌緩衝區供檢視
- 4.8.1.7 列印指定日誌緩衝區的大小
- 4.8.2 核心日誌
- 4.9 檢視 Android 裝置系統屬性
- 4.9.1 檢視裝置型號
- 4.9.2 檢視裝置電池狀況
- 4.9.3 檢視裝置螢幕解析度
- 4.9.4 檢視裝置螢幕密度
- 4.9.5 檢視裝置顯示屏引數
- 4.9.6 檢視裝置 android_id
- 4.9.7 檢視裝置IMEI
- 4.9.8 檢視裝置 Android 系統版本
- 4.9.9 檢視裝置 IP 地址
- 4.9.10 檢視裝置 Mac 地址
- 4.9.11 檢視裝置 CPU 資訊
- 4.9.12 檢視裝置記憶體資訊
- 4.9.13 檢視裝置更多硬體與系統屬性
- 4.10 修改設定
- 4.10.1 修改解析度
- 4.10.2 修改螢幕密度
- 4.10.3 修改顯示區域
- 4.10.4 修改關閉 USB 除錯模式
- 4.10.5 修改允許/禁止訪問非 SDK API
- 4.10.6 修改狀態列和導航欄的顯示隱藏
- 4.11 實用功能
- 4.11.1 螢幕截圖
- 4.11.2 錄製螢幕
- 4.11.3 檢視連線過的 WiFi 密碼
- 4.11.4 設定系統日期和時間
- 4.11.5 重啟手機
- 4.11.6 檢測裝置是否已 root
- 4.11.7 使用 Monkey 進行壓力測試
- 4.11.8 開啟/關閉 WiFi
- 4.12 刷機相關命令
- 4.13 安全相關命令
- 五、參考
一、ADB是什麼?
ADB,即 Android Debug Bridge 是一種允許模擬器或已連線的 Android 裝置進行通訊的命令列工具,它可為各種裝置操作提供便利,如安裝和除錯應用,並提供對 Unix shell(可用來在模擬器或連線的裝置上執行各種命令)的訪問。可以在Android SDK/platform-tools中找到 adb 工具或下載 ADB Kits 。
二、ADB有什麼作用?
ADB 是 Android SDK 裡的一個工具, 用這個工具可以直接操作管理Android模擬器或者真實的Android裝置。它的主要功能有:
- 在裝置上執行Shell命令; 將本地APK軟體安裝至模擬器或Android裝置;
- 管理裝置或手機模擬器上的預定埠;
- 在裝置或手機模擬器上覆制或貼上檔案。
ADB 是一個客戶端-伺服器程式程式,包括三個元件:
- 客戶端:該元件傳送命令。客戶端在開發計算機上執行。您可以通過發出 adb 命令從命令列終端呼叫客戶端。
- 後臺程式:該元件在裝置上執行命令。後臺程式在每個模擬器或裝置例項上作為後臺程序執行。
- 伺服器:該元件管理客戶端和後臺程式之間的通訊。伺服器在開發計算機上作為後臺程序執行。
三、ADB命令語法
adb 命令的基本語法如下:
adb [-d|-e|-s <serial-number>] <command>
單一裝置/模擬器連線
如果只有一個裝置/模擬器連線時,可以省略掉 [-d|-e|-s <serial-number>]
這一部分,直接使用 adb <command>
。
多個裝置/模擬器連線
如果有多個裝置/模擬器連線,則需要為命令指定目標裝置,下表是指定目標裝置的命令選項:
引數 | 含義 |
---|---|
-d | 指定當前唯一通過 USB 連線的 Android 裝置為命令目標 |
-e | 指定當前唯一執行的模擬器為命令目標 |
-s | <serial-number> 指定相應裝置序列號的裝置/模擬器為命令目標 |
在多個裝置/模擬器連線的情況下較常用的是 -s <serial-number>
引數,serial-number
是指裝置的裝置序列號,可以通過 adb devices
命令獲取。
四、ADB常用命令
4.1 基本命令
4.1.1 檢視adb的版本資訊
adb version
4.1.2 啟動adb
adb start-server
一般無需手動執行此命令,在執行 adb 命令時若發現 adb server 沒有啟動會自動調起。
4.1.3 停止adb
adb kill-server
4.1.4 以 root 許可權執行 adbd
adb root
4.1.5 指定 adb server 的網路埠
adb -P <port> start-server
ADB的預設埠為 5037。
4.1.5 查詢已連線的裝置/模擬器列表
adb devices
4.2 裝置連線管理
4.2.1 USB 連線
通過 USB 連線來正常使用 adb 需要以下步驟:
- 確認硬體狀態正常(包括 Android 裝置處於正常開機狀態,USB 連線線和各種介面完好)。
- Android 裝置的開發者選項和 USB 除錯模式已開啟(可以在「設定」-「開發者選項」-「USB除錯」開啟USB除錯)。
- 確認裝置驅動狀態正常(安裝ADB驅動程式)。
- 通過 USB 線連線好電腦和裝置後確認狀態。
- 通過
adb devices
命令檢視裝置連線情況。
4.2.2 WLAN 連線(需要 USB 線)
藉助 USB 通過 WiFi 連線來正常使用 adb 需要以下步驟:
操作步驟:
- 將 Android 裝置與要執行 adb 的電腦連線到同一個 WiFi。
- 將裝置與電腦通過 USB 線連線(可通過
adb devices
命令檢視裝置連線情況)。 - 通過
adb tcpip 5555
命令讓裝置在 5555 埠監聽 TCP/IP 連線。 - 斷開 USB 連線。
- 找到裝置的 IP 地址(可以在「設定」-「關於手機」-「狀態資訊」-「IP地址」檢視 IP 地址)。
- 通過
adb connect <device-ip-address>
命令使用 IP 地址將 Android 裝置與電腦連線。 - 通過
adb devices
命令檢視裝置連線情況。 - 使用完畢後可通過
adb disconnect <device-ip-address>
命令斷開無線連線。
4.2.3 WLAN 連線(無需藉助 USB 線)
注:需要 root 許可權。不借助 USB 通過 WiFi 連線來正常使用 adb 需要以下步驟:
-
在 Android 裝置上安裝一個終端模擬器(可通過Terminal Emulator for Android Downloads下載)。
-
將 Android 裝置與要執行 adb 的電腦連線到同一個 WiFi。
-
開啟 Android 裝置上的終端模擬器,在裡面依次執行命令:
su
setprop service.adb.tcp.port 5555 -
找到裝置的 IP 地址(可以在「設定」-「關於手機」-「狀態資訊」-「IP地址」檢視 IP 地址)。
-
通過
adb connect <device-ip-address>
命令使用 IP 地址將 Android 裝置與電腦連線。 -
通過
adb devices
命令檢視裝置連線情況。
4.2.4 WiFi 連線轉為 USB 連線
通過adb usb
命令以USB模式重新啟動ADB:
adb usb
4.3 應用管理
4.3.1 檢視應用列表
檢視應用列表的基本命令格式是:
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
adb shell pm list packages
後面可以跟一些可選引數進行過濾檢視不同的列表,可用引數及含義如下:
引數 | 顯示列表 |
---|---|
無 | 所有應用 |
-f | 顯示應用關聯的 apk 檔案 |
-d | 只顯示 disabled 的應用 |
-e | 只顯示 enabled 的應用 |
-s | 只顯示系統應用 |
-3 | 只顯示第三方應用 |
-i | 顯示應用的 installer |
-u | 包含已解除安裝應用 |
<filter> |
包名包含 <filter> 字串 |
4.3.1.1 檢視所有應用
adb shell pm list packages
4.3.1.2 檢視系統應用
adb shell pm list packages -s
4.3.1.3 檢視第三方應用
adb shell pm list packages -3
4.3.1.4 包名包含某字串的應用
比如要檢視包名包含字串 huawei 的應用列表,命令:
adb shell pm list packages huawei
4.3.2 安裝應用
安裝應用的基本命令格式是:
adb install [-l] [-r] [-t] [-s] [-d] [-g] <apk-file>
adb install
後面可以跟一些可選引數來控制安裝 APK 的行為,可用引數及含義如下:
引數 | 含義 |
---|---|
-l | 將應用安裝到保護目錄 /mnt/asec |
-r | 允許覆蓋安裝 |
-t | 允許安裝 AndroidManifest.xml 裡 application 指定 android:testOnly=“true” 的應用 |
-s | 將應用安裝到 sdcard |
-d | 允許降級覆蓋安裝 |
-g | 授予所有執行時許可權 |
執行命令後可以看到輸出內容,包含安裝進度和狀態,安裝狀態如下:
- Success:代表安裝成功。
- Failure:代表安裝失敗。APK 安裝失敗的情況有很多,Failure狀態之後有安裝失敗輸出程式碼。常見安裝失敗輸出程式碼、含義及可能的解決辦法如下:
輸出程式碼 | 含義 | 解決辦法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 應用已經存在,或解除安裝了但沒解除安裝乾淨 | adb install 時使用 -r 引數,或者先 adb uninstall 再安裝 |
INSTALL_FAILED_INVALID_APK | 無效的 APK 檔案 | |
INSTALL_FAILED_INVALID_URI | 無效的 APK 檔名 | 確保 APK 檔名裡無中文 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空間不足 | 清理空間 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已經存在同名程式 | |
INSTALL_FAILED_NO_SHARED_USER | 請求的共享使用者不存在 | |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 以前安裝過同名應用,但解除安裝時資料沒有移除;或者已安裝該應用,但簽名不一致 | 先 adb uninstall 再安裝 |
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 請求的共享使用者存在但簽名不一致 | |
INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安裝包使用了裝置上不可用的共享庫 | |
INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替換時無法刪除 | |
INSTALL_FAILED_DEXOPT | dex 優化驗證失敗或空間不足 | |
INSTALL_FAILED_OLDER_SDK | 裝置系統版本低於應用要求 | |
INSTALL_FAILED_CONFLICTING_PROVIDER | 裝置裡已經存在與應用裡同名的 content provider | |
INSTALL_FAILED_NEWER_SDK | 裝置系統版本高於應用要求 | |
INSTALL_FAILED_TEST_ONLY | 應用是 test-only 的,但安裝時沒有指定 -t 引數 | |
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不相容裝置 CPU 應用程式二進位制介面的 native code | |
INSTALL_FAILED_MISSING_FEATURE | 應用使用了裝置不可用的功能 | |
INSTALL_FAILED_CONTAINER_ERROR | 1. sdcard 訪問失敗;2. 應用簽名與 ROM 簽名一致,被當作內建應用。 | 1. 確認 sdcard 可用,或者安裝到內建儲存;2. 打包時不與 ROM 使用相同簽名。 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 1. 不能安裝到指定位置;2. 應用簽名與 ROM 簽名一致,被當作內建應用。 | 1. 切換安裝位置,新增或刪除 -s 引數;2. 打包時不與 ROM 使用相同簽名。 |
INSTALL_FAILED_MEDIA_UNAVAILABLE | 安裝位置不可用 | 一般為 sdcard,確認 sdcard 可用或安裝到內建儲存 |
INSTALL_FAILED_VERIFICATION_TIMEOUT | 驗證安裝包超時 | |
INSTALL_FAILED_VERIFICATION_FAILURE | 驗證安裝包失敗 | |
INSTALL_FAILED_PACKAGE_CHANGED | 應用與呼叫程式期望的不一致 | |
INSTALL_FAILED_UID_CHANGED | 以前安裝過該應用,與本次分配的 UID 不一致 | 清除以前安裝過的殘留檔案 |
INSTALL_FAILED_VERSION_DOWNGRADE | 已經安裝了該應用更高版本 | 使用 -d 引數 |
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安裝 target SDK 支援執行時許可權的同名應用,要安裝的版本不支援執行時許可權 | |
INSTALL_PARSE_FAILED_NOT_APK | 指定路徑不是檔案,或不是以 .apk 結尾 | |
INSTALL_PARSE_FAILED_BAD_MANIFEST | 無法解析的 AndroidManifest.xml 檔案 | |
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到異常 | |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安裝包沒有簽名 | |
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安裝該應用,且簽名與 APK 檔案不一致 | 先解除安裝裝置上的該應用,再安裝 |
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING | 解析 APK 檔案時遇到 CertificateEncodingException | |
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME | manifest 檔案裡沒有或者使用了無效的包名 | |
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID | manifest 檔案裡指定了無效的共享使用者 ID | |
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED | 解析 manifest 檔案時遇到結構性錯誤 | |
INSTALL_PARSE_FAILED_MANIFEST_EMPTY | 在 manifest 檔案裡找不到找可操作標籤(instrumentation 或 application) | |
INSTALL_FAILED_INTERNAL_ERROR | 因系統問題安裝失敗 | |
INSTALL_FAILED_USER_RESTRICTED | 使用者被限制安裝應用 | |
INSTALL_FAILED_DUPLICATE_PERMISSION | 應用嘗試定義一個已經存在的許可權名稱 | |
INSTALL_FAILED_NO_MATCHING_ABIS | 應用包含裝置的應用程式二進位制介面不支援的 native code | |
INSTALL_CANCELED_BY_USER | 應用安裝需要在裝置上確認,但未操作裝置或點了取消 | 在裝置上同意安裝 |
INSTALL_FAILED_ACWF_INCOMPATIBLE | 應用程式與裝置不相容 | |
INSTALL_FAILED_TEST_ONLY | APK 檔案是使用 Android Studio 直接 RUN 編譯出來的檔案 | 通過 Gradle 的 assembleDebug 或 assembleRelease 重新編譯,或者 Generate Signed APK |
does not contain AndroidManifest.xml | 無效的 APK 檔案 | |
is not a valid zip file | 無效的 APK 檔案 | |
Offline | 裝置未連線成功 | 先將裝置與 adb 連線成功 |
unauthorized | 裝置未授權允許除錯 | |
error: device not found | 沒有連線成功的裝置 | 先將裝置與 adb 連線成功 |
protocol failure | 裝置已斷開連線 | 先將裝置與 adb 連線成功 |
Unknown option: -s | Android 2.2 以下不支援安裝到 sdcard | 不使用 -s 引數 |
No space left on device | 空間不足 | 清理空間 |
Permission denied … sdcard … | sdcard 不可用 | |
signatures do not match the previously installed version; ignoring! | 已安裝該應用且簽名不一致 | 先解除安裝裝置上的該應用,再安裝 |
參考:PackageManager.java
adb install
實際是分三步完成:
push apk
檔案到/data/local/tmp
。- 呼叫
pm install
安裝。 - 刪除
/data/local/tmp
下的對應 apk 檔案。
4.3.3 解除安裝應用
解除安裝應用的基本命令格式是:
adb uninstall [-k] <package-name>
<package-name>
表示應用的包名,-k 引數可選,表示解除安裝應用但保留資料和快取目錄。
4.3.4 清除應用資料與快取
adb shell pm clear <package-name>
<package-name>
表示應用名包,這條命令的效果相當於在設定裡的應用資訊介面點選了「清除快取」和「清除資料」。
4.3.5 檢視前臺 Activity
adb shell dumpsys activity activities | grep mFocusedActivity
4.3.6 檢視正在執行的 Services
adb shell dumpsys activity services [<package-name>]
<package-name>
引數不是必須的,指定 <package-name>
表示檢視與某個包名相關的 Services,不指定表示檢視所有 Services。<package-name>
不一定要給出完整的包名,可以只給一部分,那麼所給包名相關的 Services 都會列出來。
4.3.7 檢視應用詳細資訊
adb shell dumpsys package <package-name>
<package-name>
表示應用包名。執行次命令的輸出中包含很多資訊,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝後的檔案資原始碼等路徑、版本資訊、許可權資訊和授予狀態、簽名版本資訊等。
4.3.7 檢視應用安裝路徑
adb shell pm path <package-name>
4.4 與應用互動
與應用互動主要是使用 am <command>
命令,常用的 <command>
如下:
command | 用途 |
---|---|
start [options] <intent> |
啟動 <intent> 指定的 Activity |
startservice [options] <intent> |
啟動 <intent> 指定的 Service |
broadcast [options] <intent> |
傳送 <intent> 指定的廣播 |
force-stop <package-name> |
停止 <package-name> 相關的程序 |
<intent>
引數很靈活,和寫 Android 程式時程式碼裡的 Intent 相對應。
用於決定 intent 物件的選項如下:
引數 | 含義 |
---|---|
-a <action> |
指定 action,比如 android.intent.action.VIEW |
-c <category> |
指定 category,比如 android.intent.category.APP_CONTACTS |
-n <component> |
指定完整 component 名,用於明確指定啟動哪個 Activity |
<intent>
裡還能帶資料,就像寫程式碼時的 Bundle 一樣:
引數 | 含義 |
---|---|
--esn <extra-key> |
null 值(只有 key 名) |
-e|--es <extra-key> <extra-string-value> |
string 值 |
--ez <extra-key> <extra-boolean-value> |
boolean 值 |
--ei <extra-key> <extra-int-value> |
integer 值 |
--el <extra-key> <extra-long-value> |
long 值 |
--ef <extra-key> <extra-float-value> |
float 值 |
--eu <extra-key> <extra-uri-value> |
URI |
--ecn <extra-key> <extra-component-name-value> |
component name |
--eia <extra-key> <extra-int-value>[,<extra-int-value...] |
integer 陣列 |
--ela <extra-key> <extra-long-value>[,<extra-long-value...] |
long 陣列 |
4.4.1 啟動應用/ 調起 Activity
adb shell am start [options] <intent>
例如:
adb shell am start -a android.settings.SETTINGS # 開啟系統設定頁面
adb shell am start -a android.intent.action.DIAL -d tel:10086 # 開啟撥號頁面
adb shell am start -n com.android.mms/.ui.ConversationList # 開啟簡訊會話列表
options 是一些改變其行為的選項,支援的可選引數及含義如下:
選項 | 含義 |
---|---|
-D | 啟用除錯 |
-W | 等待啟動完成 |
–start-profiler file | 啟動分析器並將結果傳送到 file |
-P file | 類似於 --start-profiler,但當應用進入空閒狀態時分析停止 |
-R count | 重複 Activity 啟動次數 |
-S | 啟動 Activity 前強行停止目標應用 |
–opengl-trace | 啟用 OpenGL 函式的跟蹤 |
–user user_id | current |
4.4.2 調起 Service
adb shell am startservice [options] <intent>
一個典型的用例是如果裝置上原本應該顯示虛擬按鍵但是沒有顯示,可以試試這個:
adb shell am startservice -n com.android.systemui/.SystemUIService
4.4.3 停止 Service
adb shell am stopservice [options] <intent>
4.4.4 傳送廣播
adb shell am broadcast [options] <INTENT>
可以向所有元件廣播,也可以只向指定元件廣播。
例如,向所有元件廣播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
又例如,只向 com.android.receiver.test/.BootCompletedReceiver
廣播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver
這類用法在測試的時候很實用,比如某個廣播的場景很難製造,可以考慮通過這種方式來發送廣播。
既能傳送系統預定義的廣播,也能傳送自定義廣播。如下是部分系統預定義廣播及正常觸發時機:
action | 觸發時機 |
---|---|
android.net.conn.CONNECTIVITY_CHANGE | 網路連線發生變化 |
android.intent.action.SCREEN_ON | 螢幕點亮 |
android.intent.action.SCREEN_OFF | 螢幕熄滅 |
android.intent.action.BATTERY_LOW | 電量低,會彈出電量低提示框 |
android.intent.action.BATTERY_OKAY | 電量恢復了 |
android.intent.action.BOOT_COMPLETED | 裝置啟動完畢 |
android.intent.action.DEVICE_STORAGE_LOW | 儲存空間過低 |
android.intent.action.DEVICE_STORAGE_OK | 儲存空間恢復 |
android.intent.action.PACKAGE_ADDED | 安裝了新的應用 |
android.net.wifi.STATE_CHANGE | WiFi連線狀態發生變化 |
android.net.wifi.WIFI_STATE_CHANGED | WiFi狀態變為啟用/關閉/正在啟動/正在關閉/未知 |
android.intent.action.BATTERY_CHANGED | 電池電量發生變化 |
android.intent.action.INPUT_METHOD_CHANGED | 系統輸入法發生變化 |
android.intent.action.ACTION_POWER_CONNECTED | 外部電源連線 |
android.intent.action.ACTION_POWER_DISCONNECTED | 外部電源斷開連線 |
android.intent.action.DREAMING_STARTED | 系統開始休眠 |
android.intent.action.DREAMING_STOPPED | 系統停止休眠 |
android.intent.action.WALLPAPER_CHANGED | 桌布發生變化 |
android.intent.action.HEADSET_PLUG | 插入耳機 |
android.intent.action.MEDIA_UNMOUNTED | 解除安裝外部介質 |
android.intent.action.MEDIA_MOUNTED | 掛載外部介質 |
android.os.action.POWER_SAVE_MODE_CHANGED | 省電模式開啟 |
(以上廣播均可使用 adb 觸發)
4.4.5 強制停止應用
adb shell am force-stop <packagename>
4.4.6 收緊記憶體
adb shell am send-trim-memory <pid> <level>
引數說明:
- pid: 程序 ID
- level:HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
4.5 檔案管理
4.5.1 從模擬器/裝置下載指定的檔案到計算機
從模擬器/裝置下載指定的檔案到計算機的基本命令格式是:
adb pull <remote> [local]
引數說明:
- remote: 模擬器/裝置裡的檔案路徑
- local:計算機上的目錄,引數可以省略,預設複製到當前目錄
例如,將 /sdcard/music.mp4
下載到計算機的當前目錄:
adb pull /sdcard/music.mp4
將 /sdcard/music.mp4
下載到計算機的當前目錄(目錄需存在):
adb pull /sdcard/music.mp4 D:\Download
4.5.2 將指定的檔案從計算機上傳到模擬器/裝置
將指定的檔案從計算機上傳到模擬器/裝置的基本命令格式是:
adb push <local> <remote>
引數說明:
- local:計算機上的檔案路徑
- remote: 模擬器/裝置裡的目錄
例如,將 D:\Download\music.mp4
下載到裝置的/sdcard/music/
目錄:
adb push D:\Download\music.mp4 /sdcard/music/
4.5.4 列出指定目錄的內容
列出模擬器/裝置上指定目錄的內容的基本命令格式是:
adb shell ls [options] <directory>
<directory>
表示指定目錄,可以省略,表示列出根目錄下的所有檔案和目錄。
adb shell ls
後面可以跟一些可選引數進行過濾檢視不同的列表,可用引數及含義如下:
引數 | 顯示列表 |
---|---|
無 | 列出目錄下的所有檔案和目錄 |
-a | 列出目錄下的所有檔案(包括隱藏的) |
-i | 列出目錄下的所有檔案和索引編號 |
-s | 列出目錄下的所有檔案和檔案大小 |
-n | 列出目錄下的所有檔案及其 UID和 GID |
-R | 列出目錄下的所有子目錄中的檔案 |
4.5.5 切換到目標目錄
adb shell cd <directory>
第一步:執行adb shell
命令;
第二步:執行cd <directory>
命令切換到目標目錄。
4.5.6 刪除檔案或目錄
adb shell rm [options] <files or directory>
第一步:執行adb shell
命令;
第二步:執行rm [options] <files or directory>
命令刪除檔案或目錄。
rm 後面可以跟一些可選引數進行不同的操作,可用引數及含義如下:
引數 | 含義 |
---|---|
無 | 刪除檔案 |
-f | 強制刪除檔案,系統不提示 |
-r | 強制刪除指定目錄中的所有檔案和子目錄 |
-d | 刪除指定目錄,即使它是一個非空目錄 |
-i | 互動式刪除,刪除前提示 |
rm -d
等同於 rmdir
命令,有些版本不包含-d 引數。
4.5.7 建立目錄
adb shell mkdir [options] <directory-name>
第一步:執行adb shell
命令;
第二步:執行mkdir [options] <directory-name>
命令建立目錄。
mkdir
後面可以跟一些可選引數進行不同的操作,可用引數及含義如下:
引數 | 含義 |
---|---|
無 | 建立指定目錄 |
-m | 建立指定目錄並賦予讀寫許可權 |
-p | 建立指定目錄及其父目錄 |
4.5.8 建立空檔案或改變檔案時間戳
adb shell touch [options] <file>
第一步:執行adb shell
命令;
第二步:執行touch [options] <file>
命令建立空檔案或改變檔案時間戳。
可通過ls -n <directory>
命令檢視檔案的時間。
4.5.9 輸出當前目錄路徑
adb shell pwd
第一步:執行adb shell
命令;
第二步:執行pwd命令輸出當前目錄路徑。
4.5.10 複製檔案和目錄
adb shell cp [options] <source> <dest>
第一步:執行adb shell
命令;
第二步:執行cp [options] <source> <dest>
命令複製檔案和目錄。
引數說明:
- source:原始檔路徑
- dest: 目標檔案路徑
4.5.11 移動或重新命名檔案
adb shell mv [options] <source> <dest>
第一步:執行adb shell
命令;
第二步:執行mv [options] <source> <dest>
命令移動或重新命名檔案。
引數說明:
- source:原始檔路徑
- dest: 目標檔案路徑
4.6 網路管理
4.6.1 檢視網路統計資訊
adb shell netstat
也可以將網路統計資訊輸出到指定檔案:
adb shell netstat><file-path>
例如,可以通過 adb shell netstat>D:\netstat.log
將日誌輸出到 D:\netstat.log
中。
4.6.2 測試兩個網路間的連線和延遲
ping 命令的格式如下:
adb shell ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
例如,ping一個域名:
adb shell ping www.google.com
不結束的話會一直ping下去,可以按 Ctrl + C 停止ping操作。
也可以指定ping的次數:
adb shell ping -c 4 www.google.com
4.6.3 通過配置檔案配置和管理網路連線
netcfg 命令的格式如下:
adb shell netcfg [<interface> {dhcp|up|down}]
輸出示例:
rmnet_ims10 DOWN 0.0.0.0/0 0x00001002
rmnet_ims00 DOWN 0.0.0.0/0 0x00001002
rmnet_tun04 DOWN 0.0.0.0/0 0x00001002
rmnet_tun03 DOWN 0.0.0.0/0 0x00001002
rmnet_tun02 DOWN 0.0.0.0/0 0x00001002
rmnet_tun01 DOWN 0.0.0.0/0 0x00001002
rmnet_tun00 DOWN 0.0.0.0/0 0x00001002
rmnet_tun14 DOWN 0.0.0.0/0 0x00001002
rmnet_tun13 DOWN 0.0.0.0/0 0x00001002
rmnet_tun12 DOWN 0.0.0.0/0 0x00001002
rmnet_tun11 DOWN 0.0.0.0/0 0x00001002
rmnet_tun10 DOWN 0.0.0.0/0 0x00001002
rmnet1 DOWN 0.0.0.0/0 0x00001002
rmnet0 DOWN 0.0.0.0/0 0x00001002
rmnet4 DOWN 0.0.0.0/0 0x00001002
rmnet3 DOWN 0.0.0.0/0 0x00001002
rmnet2 DOWN 0.0.0.0/0 0x00001002
rmnet6 DOWN 0.0.0.0/0 0x00001002
rmnet5 DOWN 0.0.0.0/0 0x00001002
dummy0 UP 0.0.0.0/0 0x000000c3
rmnet_r_ims10 DOWN 0.0.0.0/0 0x00001002
rmnet_r_ims00 DOWN 0.0.0.0/0 0x00001002
rmnet_emc0 DOWN 0.0.0.0/0 0x00001002
lo UP 127.0.0.1/8 0x00000049
sit0 DOWN 0.0.0.0/0 0x00000080
wlan0 UP 10.0.38.176/23 0x00001043
4.6.4 顯示、操作路由、裝置、策略路由和隧道
ip 命令的格式如下:
adb shell ip [ options ] object
-
options := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve]
|-f[amily] { inet | inet6 | ipx | dnet | link } |-l[oops] {
maximum-addr-flush-attempts } |-o[neline] | -t[imestamp] | -b[atch]
[filename] |-rc[vbuf] [size]} -
object := { link | addr | addrlabel | route | rule | neigh | ntable
|tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |netns |
l2tp }
options 是一些修改ip行為或者改變其輸出的選項。所有的選項都是以-字元開頭,分為長、短兩種形式,支援的可選引數及含義如下:
選項 | 含義 |
---|---|
-V,-Version | 列印ip的版本並退出 |
-s,-stats,-statistics | 輸出更為詳盡的資訊(如果這個選項出現兩次或者多次,輸出的資訊將更為詳盡) |
-f,-family | 強調使用的協議種類(包括:inet、inet6或者link) |
-4 | 是-family inet的簡寫 |
-6 | 是-family inet6的簡寫 |
-0 | 是-family link的簡寫 |
-o,-oneline | 對每行記錄都使用單行輸出,回行用字元代替 |
-r,-resolve | 查詢域名解析系統,用獲得的主機名代替主機IP地址 |
object 是你要管理或者獲取資訊的物件。目前ip認識的物件包括:
引數 | 顯示列表 |
---|---|
link | 網路裝置 |
address | 一個裝置的協議(IP或者IPV6)地址 |
neighbour | ARP或者NDISC緩衝區條目 |
route | 路由表條目 |
rule | 路由策略資料庫中的規則 |
maddress | 多播地址 |
mroute | 多播路由緩衝區條目 |
tuntap | 管理 TUN/TAP 裝置 |
netns | 管理網路空間 |
例如,檢視 WiFi IP 地址:
adb shell ip -f inet addr show wlan0
4.7 模擬按鍵/輸入
在 adb shell
裡有個很實用的命令叫 input,通過它可以做一些有趣的事情。
可以執行adb shell input
命令檢視完整 help 資訊如下:
Usage: input [<source>] <command> [<arg>...]
The sources are:
dpad
keyboard
mouse
touchpad
gamepad
touchnavigation
joystick
touchscreen
stylus
trackball
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
比如使用 adb shell input keyevent <keycode>
命令,不同的 keycode 能實現不同的功能,完整的 keycode 列表詳見 KeyEvent,摘引部分我覺得有意思的如下:
keycode | 含義 |
---|---|
3 | HOME 鍵 |
4 | 返回鍵 |
5 | 開啟撥號應用 |
6 | 結束通話電話 |
24 | 增加音量 |
25 | 降低音量 |
26 | 電源鍵 |
27 | 拍照(需要在相機應用裡) |
64 | 開啟瀏覽器 |
82 | 選單鍵 |
85 | 播放/暫停 |
86 | 停止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移動游標到行首或列表頂部 |
123 | 移動游標到行末或列表底部 |
126 | 恢復播放 |
127 | 暫停播放 |
164 | 靜音 |
176 | 開啟系統設定 |
187 | 切換應用 |
207 | 開啟聯絡人 |
208 | 開啟日曆 |
209 | 開啟音樂 |
210 | 開啟計算器 |
220 | 降低螢幕亮度 |
221 | 提高螢幕亮度 |
223 | 系統休眠 |
224 | 點亮螢幕 |
231 | 開啟語音助手 |
276 | 如果沒有 wakelock 則讓系統休眠 |
下面是 input
命令的一些用法舉例。
4.7.1 電源鍵
adb shell input keyevent 26
執行效果相當於按電源鍵。
4.7.2 選單鍵
adb shell input keyevent 82
4.7.3 HOME 鍵
adb shell input keyevent 3
4.7.4 返回鍵
adb shell input keyevent 4
4.7.5 音量控制
增加音量:
adb shell input keyevent 24
降低音量:
adb shell input keyevent 25
靜音:
adb shell input keyevent 164
4.7.6 媒體控制
播放/暫停:
adb shell input keyevent 85
停止播放:
adb shell input keyevent 86
播放下一首:
adb shell input keyevent 87
播放上一首:
adb shell input keyevent 88
恢復播放:
adb shell input keyevent 126
暫停播放:
adb shell input keyevent 127
4.7.7 點亮/熄滅螢幕
點亮螢幕:
adb shell input keyevent 224
熄滅螢幕:
adb shell input keyevent 223
4.7.8 滑動解鎖
如果鎖屏沒有密碼,是通過滑動手勢解鎖,那麼可以通過 input swipe 來解鎖。
命令(引數以機型 Nexus 5,向上滑動手勢解鎖舉例):
adb shell input swipe 300 1000 300 500
引數 300 1000 300 500 分別表示起始點x座標 起始點y座標 結束點x座標 結束點y座標。
4.7.9 輸入文字
在焦點處於某文字框時,可以通過 input 命令來輸入文字。
adb shell input text hello
4.8 日誌列印
Android 系統的日誌分為兩部分,底層的 Linux 核心日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。
4.8.1 Android 日誌
檢視 Android 裝置系統屬性的基本命令格式是:
adb logcat [option] [filter-specs]
如果需要停止 logcat 日誌列印,可以按 Ctrl + C 停止日誌監控。
4.8.1.1 按級別過濾日誌
按級別過濾日誌的基本命令格式是:
adb logcat [filter-specs]
Android 的日誌分為如下幾個優先順序(priority):
級別 | 含義 |
---|---|
*:V | 過濾只顯示 Verbose 及以上級別(優先順序最低) |
*:D |
過濾只顯示 Debug 及以上級別 |
*:I | 過濾只顯示 Info 及以上級別 |
*:W | 過濾只顯示 Warning 及以上級別 |
*:E | 過濾只顯示 Error 及以上級別 |
*:F | 過濾只顯示 Fatal 及以上級別 |
*:S | 過濾只顯示 Silent 及以上級別(優先順序最高,什麼也不輸出) |
按某級別過濾日誌則會將該級別及以上的日誌輸出。
比如,命令:
adb logcat *:W
會將 Warning、Error、Fatal 和 Silent 日誌輸出。
(注: 在 macOS 下需要給 *:W 這樣以 * 作為 tag 的引數加雙引號,如 adb logcat "*:W"
,不然會報錯 no matches found: *:W
。)
4.8.1.2 按 tag 和級別過濾日誌
按 tag 和級別過濾日誌的基本命令格式是:
adb logcat [tag:level] [tag:level] ...
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示輸出 tag ActivityManager 的 Info 以上級別日誌,輸出 tag MyApp 的 Debug 以上級別日誌,及其它 tag 的 Silent 級別日誌(即遮蔽其它 tag 日誌)。
4.8.1.3 將日誌格式化輸出
可以用 adb logcat -v <format>
選項指定日誌輸出格式。
日誌支援按以下幾種 <format>
:
引數 | 顯示格式 |
---|---|
brief | <priority>/<tag>(<pid>): <message> |
process | <priority>(<pid>) <message> |
tag | <priority>/<tag>: <message> |
raw | <message> |
time | <datetime> <priority>/<tag>(<pid>): <message> |
threadtime | <datetime> <pid> <tid> <priority> <tag>: <message> |
long | [ <datetime> <pid>:<tid> <priority>/<tag> ] <message> |
日誌格式預設為 brief,指定格式可與上面的過濾同時使用。比如:
adb logcat -v long ActivityManager:I *:S
4.8.1.3 清空已存在的日誌
adb logcat -c
4.8.1.4 將日誌顯示在控制檯
adb logcat -d
4.8.1.5 將日誌輸出到檔案
adb logcat -f <file-path>
4.8.1.6 載入一個可使用的日誌緩衝區供檢視
adb logcat -b <Buffer>
Android log 輸出量巨大,特別是通訊系統的log,因此,Android把log輸出到不同的緩衝區中,目前定義了四個log緩衝區:
緩衝區 | 含義 |
---|---|
Radio | 輸出通訊系統的 log |
System | 輸出系統元件的 log |
Event | 輸出 event 模組的 log |
Main | 所有 java 層的 log 以及不屬於上面3層的 log |
緩衝區主要給系統元件使用,一般的應用不需要關心,應用的log都輸出到main緩衝區中。預設log輸出(不指定緩衝區的情況下)是輸出System和Main緩衝區的log。
4.8.1.7 列印指定日誌緩衝區的大小
adb logcat -g
4.8.2 核心日誌
adb shell dmesg
輸出示例:
<