ADB,即 Android Debug Bridge 是一種容許模擬器或已鏈接的 Android 設備進行通訊的命令行工具,它可爲各類設備操做提供便利,如安裝和調試應用,並提供對 Unix shell
(可用來在模擬器或鏈接的設備上運行各類命令)的訪問。能夠在Android SDK/platform-tools
中找到 adb
工具或下載 ADB Kits 。html
注: 有部分命令的支持狀況可能與 Android 系統版本及定製 ROM 的實現有關。java
ADB
是 Android SDK
裏的一個工具, 用這個工具能夠直接操做管理Android模擬器或者真實的Android設備。它的主要功能有:android
ADB
是一個客戶端-服務器程序
程序,包括三個組件:git
adb 命令的基本語法以下:github
adb [-d|-e|-s <serial-number>] <command>
複製代碼
若是隻有一個設備/模擬器鏈接時,能夠省略掉 [-d|-e|-s <serial-number>]
這一部分,直接使用 adb <command>
。shell
若是有多個設備/模擬器鏈接,則須要爲命令指定目標設備,下表是指定目標設備的命令選項:數據庫
參數 | 含義 |
---|---|
-d | 指定當前惟一經過 USB 鏈接的 Android 設備爲命令目標 |
-e | 指定當前惟一運行的模擬器爲命令目標 |
-s <serial-number> |
指定相應設備序列號的設備/模擬器爲命令目標 |
在多個設備/模擬器鏈接的狀況下較經常使用的是 -s <serial-number>
參數,serial-number
是指設備的設備序列號,能夠經過 adb devices
命令獲取。api
adb version
複製代碼
adb start-server
複製代碼
通常無需手動執行此命令,在運行 adb 命令時若發現 adb server 沒有啓動會自動調起。數組
adb kill-server
複製代碼
adb root
複製代碼
adb -P <port> start-server
複製代碼
ADB的默認端口爲 5037。瀏覽器
adb devices
複製代碼
經過 USB 鏈接來正常使用 adb 須要如下步驟:
adb devices
命令查看設備鏈接狀況。藉助 USB 經過 WiFi 鏈接來正常使用 adb 須要如下步驟: 操做步驟:
adb devices
命令查看設備鏈接狀況)。adb tcpip 5555
命令讓設備在 5555 端口監聽 TCP/IP 鏈接。adb connect <device-ip-address>
命令使用 IP 地址將 Android 設備與電腦鏈接。adb devices
命令查看設備鏈接狀況。adb disconnect <device-ip-address>
命令斷開無線鏈接。注:須要 root 權限。 不借助 USB 經過 WiFi 鏈接來正常使用 adb 須要如下步驟:
su
setprop service.adb.tcp.port 5555
複製代碼
adb connect <device-ip-address>
命令使用 IP 地址將 Android 設備與電腦鏈接。adb devices
命令查看設備鏈接狀況。經過adb usb
命令以USB模式從新啓動ADB:
adb usb
複製代碼
查看應用列表的基本命令格式是:
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> 字符串 |
adb shell pm list packages
複製代碼
adb shell pm list packages -s
複製代碼
adb shell pm list packages -3
複製代碼
好比要查看包名包含字符串 huawei
的應用列表,命令:
adb shell pm list packages huawei
複製代碼
安裝應用的基本命令格式是:
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 <packagename> 再安裝 |
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 <packagename> 再安裝 |
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! | 已安裝該應用且簽名不一致 | 先卸載設備上的該應用,再安裝 |
adb install
實際是分三步完成:
卸載應用的基本命令格式是:
adb uninstall [-k] <package-name>
複製代碼
<package-name>
表示應用的包名,-k
參數可選,表示卸載應用但保留數據和緩存目錄。
adb shell pm clear <package-name>
複製代碼
<package-name>
表示應用名包,這條命令的效果至關於在設置裏的應用信息界面點擊了「清除緩存」和「清除數據」。
adb shell dumpsys activity activities | grep mFocusedActivity
複製代碼
adb shell dumpsys activity services [<package-name>]
複製代碼
<package-name>
參數不是必須的,指定 <package-name>
表示查看與某個包名相關的 Services,不指定表示查看全部 Services。<package-name>
不必定要給出完整的包名,能夠只給一部分,那麼所給包名相關的 Services 都會列出來。
adb shell dumpsys package <package-name>
複製代碼
<package-name>
表示應用包名。運行次命令的輸出中包含不少信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝後的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。
adb shell pm path <package-name>
複製代碼
與應用交互主要是使用 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 數組 |
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 |
指定要做爲哪一個用戶運行;若是未指定,則做爲當前用戶運行 |
adb shell am startservice [options] <intent>
複製代碼
一個典型的用例是若是設備上本來應該顯示虛擬按鍵可是沒有顯示,能夠試試這個:
adb shell am startservice -n com.android.systemui/.SystemUIService
複製代碼
adb shell am stopservice [options] <intent>
複製代碼
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 觸發)
adb shell am force-stop <packagename>
複製代碼
adb shell am send-trim-memory <pid> <level>
複製代碼
參數說明:
pid
: 進程 IDlevel
:HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE從模擬器/設備下載指定的文件到計算機的基本命令格式是:
adb pull <remote> [local]
複製代碼
參數說明:
remote
: 模擬器/設備裏的文件路徑local
:計算機上的目錄,參數能夠省略,默認複製到當前目錄例如,將 /sdcard/music.mp4 下載到計算機的當前目錄:
adb pull /sdcard/music.mp4
複製代碼
將 /sdcard/music.mp4 下載到計算機的當前目錄(目錄需存在):
adb pull /sdcard/music.mp4 D:\Download
複製代碼
將指定的文件從計算機上傳到模擬器/設備的基本命令格式是:
adb push <local> <remote>
複製代碼
參數說明:
local
:計算機上的文件路徑remote
: 模擬器/設備裏的目錄例如,將 D:\Download\music.mp4 下載到設備的/sdcard/music/目錄:
adb push D:\Download\music.mp4 /sdcard/music/
複製代碼
列出模擬器/設備上指定目錄的內容的基本命令格式是:
adb shell ls [options] <directory>
複製代碼
<directory>
表示指定目錄,能夠省略,表示列出根目錄下的全部文件和目錄。 adb shell ls
後面能夠跟一些可選參數進行過濾查看不一樣的列表,可用參數及含義以下:
參數 | 顯示列表 |
---|---|
無 | 列出目錄下的全部文件和目錄 |
-a | 列出目錄下的全部文件(包括隱藏的) |
-i | 列出目錄下的全部文件和索引編號 |
-s | 列出目錄下的全部文件和文件大小 |
-n | 列出目錄下的全部文件及其 UID和 GID |
-R | 列出目錄下的全部子目錄中的文件 |
adb shell cd <directory>
複製代碼
第一步:執行adb shell
命令; 第二步:執行cd <directory>
命令切換到目標目錄。
adb shell rm [options] <files or directory>
複製代碼
第一步:執行adb shell
命令; 第二步:執行rm [options] <files or directory>
命令刪除文件或目錄。
rm
後面能夠跟一些可選參數進行不一樣的操做,可用參數及含義以下:
參數 | 含義 |
---|---|
無 | 刪除文件 |
-f | 強制刪除文件,系統不提示 |
-r | 強制刪除指定目錄中的全部文件和子目錄 |
-d | 刪除指定目錄,即便它是一個非空目錄 |
-i | 交互式刪除,刪除前提示 |
rm -d
等同於 rmdir
命令,有些版本不包含-d
參數。
adb shell mkdir [options] <directory-name>
複製代碼
第一步:執行adb shell
命令; 第二步:執行mkdir [options] <directory-name>
命令建立目錄。 mkdir
後面能夠跟一些可選參數進行不一樣的操做,可用參數及含義以下:
參數 | 含義 |
---|---|
無 | 建立指定目錄 |
-m | 建立指定目錄並賦予讀寫權限 |
-p | 建立指定目錄及其父目錄 |
adb shell touch [options] <file>
複製代碼
第一步:執行adb shell
命令; 第二步:執行touch [options] <file>
命令建立空文件或改變文件時間戳。
可經過ls -n <directory>
命令查看文件的時間。
adb shell pwd
複製代碼
第一步:執行adb shell
命令; 第二步:執行pwd
命令輸出當前目錄路徑。
adb shell cp [options] <source> <dest>
複製代碼
第一步:執行adb shell
命令; 第二步:執行cp [options] <source> <dest>
命令複製文件和目錄。 參數說明:
source
:源文件路徑dest
: 目標文件路徑adb shell mv [options] <source> <dest>
複製代碼
第一步:執行adb shell
命令; 第二步:執行mv [options] <source> <dest>
命令移動或重命名文件。 參數說明:
source
:源文件路徑dest
: 目標文件路徑adb shell netstat
複製代碼
也能夠將網絡統計信息輸出到指定文件:
adb shell netstat><file-path>
複製代碼
例如,能夠經過 adb shell netstat>D:\netstat.log
將日誌輸出到 D:\netstat.log
中。
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
複製代碼
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
複製代碼
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
複製代碼
在 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
命令的一些用法舉例。
adb shell input keyevent 26
複製代碼
執行效果至關於按電源鍵。
adb shell input keyevent 82
複製代碼
adb shell input keyevent 3
複製代碼
adb shell input keyevent 4
複製代碼
adb shell input keyevent 24
複製代碼
adb shell input keyevent 25
複製代碼
adb shell input keyevent 164
複製代碼
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
複製代碼
adb shell input keyevent 224
複製代碼
adb shell input keyevent 223
複製代碼
若是鎖屏沒有密碼,是經過滑動手勢解鎖,那麼能夠經過 input swipe
來解鎖。 命令(參數以機型 Nexus 5,向上滑動手勢解鎖舉例):
adb shell input swipe 300 1000 300 500
複製代碼
參數 300 1000 300 500
分別表示起始點x座標 起始點y座標 結束點x座標 結束點y座標
。
在焦點處於某文本框時,能夠經過 input
命令來輸入文本。
adb shell input text hello
複製代碼
Android 系統的日誌分爲兩部分,底層的 Linux 內核日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。
查看 Android 設備系統屬性的基本命令格式是:
adb logcat [option] [filter-specs]
複製代碼
若是須要中止 logcat
日誌打印,能夠按 Ctrl + C
中止日誌監控。
按級別過濾日誌的基本命令格式是:
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
。)
按 tag 和級別過濾日誌的基本命令格式是:
adb logcat [tag:level] [tag:level] ...
複製代碼
好比,命令:
adb logcat ActivityManager:I MyApp:D *:S
複製代碼
表示輸出 tag ActivityManager
的 Info 以上級別日誌,輸出 tag MyApp
的 Debug 以上級別日誌,及其它 tag 的 Silent 級別日誌(即屏蔽其它 tag 日誌)。
能夠用 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
複製代碼
adb logcat -c
複製代碼
adb logcat -d
複製代碼
adb logcat -f <file-path>
複製代碼
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。
adb logcat -g
複製代碼
adb shell dmesg
複製代碼
輸出示例:
<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.
複製代碼
中括號裏的 [14201.684016]
表明內核開始啓動後的時間,單位爲秒。
經過內核日誌咱們能夠作一些事情,好比衡量內核啓動時間,在系統啓動完畢後的內核日誌裏找到 Freeing init memory
那一行前面的時間就是。
查看 Android 設備系統屬性的基本命令格式是:
adb shell getprop [options]
複製代碼
除了能夠查看 Android 設備系統屬性以外,還能夠設置系統屬性,設置系統屬性的基本命令格式是:
adb shell setprop <key> <value>
複製代碼
adb shell getprop ro.product.model
複製代碼
輸出示例:
Nexus 5
複製代碼
adb shell dumpsys battery
複製代碼
輸出示例:
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
status: 2
health: 2
present: true
level: 44
scale: 100
voltage: 3872
temperature: 280
technology: Li-poly
複製代碼
其中 scale
表明最大電量,level
表明當前電量。上面的輸出表示還剩下 44% 的電量。
adb shell wm size
複製代碼
輸出示例:
Physical size: 1080x1920
複製代碼
該設備屏幕分辨率爲 1080px * 1920px。
若是使用命令修改過,那輸出多是:
Physical size: 1080x1920
Override size: 480x1024
複製代碼
代表設備的屏幕分辨率本來是 1080px * 1920px,當前被修改成 480px * 1024px。
adb shell wm density
複製代碼
輸出示例:
Physical density: 420
複製代碼
該設備屏幕密度爲 420dpi。
若是使用命令修改過,那輸出多是:
Physical density: 480
Override density: 160
複製代碼
代表設備的屏幕密度原來是 480dpi,當前被修改成 160dpi。
adb shell dumpsys window displays
複製代碼
輸出示例:
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false
複製代碼
其中 mDisplayId
爲 顯示屏編號,init
是初始分辨率和屏幕密度,app
的高度比 init
裏的要小,表示屏幕底部有虛擬按鍵,高度爲 1920 - 1794 = 126px 合 42dp。
adb shell settings get secure android_id
複製代碼
輸出示例:
51b6be48bac8c569
複製代碼
在 Android 4.4 及如下版本可經過以下命令獲取 IMEI:
adb shell dumpsys iphonesubinfo
複製代碼
輸出示例:
Phone Subscriber Info:
Phone Type = GSM
Device ID = 860955027785041
複製代碼
其中的 Device ID
就是 IMEI。
而在 Android 5.0 及以上版本里這個命令輸出爲空,得經過其它方式獲取了(須要 root 權限):
adb shell
su
service call iphonesubinfo 1
複製代碼
把裏面的有效內容提取出來就是 IMEI 了,好比這裏的是 860955027785041
。
參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop
adb shell getprop ro.build.version.release
複製代碼
輸出示例:
5.0.2
複製代碼
adb shell ifconfig | grep Mask
複製代碼
在有的設備上這個命令沒有輸出,若是設備連着 WiFi,可使用以下命令來查看局域網 IP:
adb shell ifconfig wlan0
複製代碼
若是以上命令仍然不能獲得指望的信息,那能夠試試如下命令(部分系統版本里可用):
adb shell netcfg
複製代碼
adb shell cat /sys/class/net/wlan0/address
複製代碼
輸出示例:
f8:a9:d0:17:42:4d
複製代碼
這查看的是局域網 Mac 地址,移動網絡或其它鏈接的信息能夠經過前面的小節「IP 地址」裏提到的 adb shell netcfg
命令來查看。
adb shell cat /proc/cpuinfo
複製代碼
adb shell cat /proc/meminfo
複製代碼
設備的更多硬件與系統屬性能夠經過以下命令查看:
adb shell cat /system/build.prop
複製代碼
這會輸出不少信息,包括前面幾個小節提到的「型號」和「Android 系統版本」等。
輸出裏還包括一些其它有用的信息,它們也可經過 adb shell getprop <屬性名>
命令單獨查看,列舉一部分屬性以下:
屬性名 | 含義 |
---|---|
ro.build.version.sdk | SDK 版本 |
ro.build.version.release | Android 系統版本 |
ro.build.version.security_patch | Android 安全補丁程序級別 |
ro.product.model | 型號 |
ro.product.brand | 品牌 |
ro.product.name | 設備名 |
ro.product.board | 處理器型號 |
ro.product.cpu.abilist | CPU 支持的 abi 列表[節注一] |
persist.sys.isUsbOtgEnabled | 是否支持 OTG |
dalvik.vm.heapsize | 每一個應用程序的內存上限 |
ro.sf.lcd_density | 屏幕密度 |
節注一:
一些小廠定製的 ROM 可能修改過 CPU 支持的 abi 列表的屬性名,若是用 ro.product.cpu.abilist
屬性名查找不到,能夠這樣試試:
adb shell cat /system/build.prop | grep ro.product.cpu.abi
複製代碼
示例輸出:
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
複製代碼
注: 修改設置以後,運行恢復命令有可能顯示仍然不太正常,能夠運行 adb reboot
重啓設備,或手動重啓。
修改設置的原理主要是經過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 裏存放的設置值。
adb shell wm size 480x1024
複製代碼
表示將分辨率修改成 480px * 1024px。
恢復原分辨率命令:
adb shell wm size reset
複製代碼
adb shell wm density 160
複製代碼
表示將屏幕密度修改成 160dpi。
恢復原屏幕密度命令:
adb shell wm density reset
複製代碼
adb shell wm overscan 0,0,0,200
複製代碼
四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px 留白。
恢復原顯示區域命令:
adb shell wm overscan reset
複製代碼
adb shell settings put global adb_enabled 0
複製代碼
用命令恢復不了了,畢竟關閉了 USB 調試 adb 就鏈接不上 Android 設備了。 去設備上手動恢復吧:「設置」-「開發者選項」-「Android 調試」。
容許訪問非 SDK API:
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
複製代碼
禁止訪問非 SDK API:
adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
複製代碼
不須要設備得到 Root 權限。
命令最後的數字的含義:
值 | 含義 |
---|---|
0 | 禁止檢測非 SDK 接口的調用。該狀況下,日誌記錄功能被禁用,而且令 strict mode API,即 detectNonSdkApiUsage() 無效。不推薦。 |
1 | 僅警告——容許訪問全部非 SDK 接口,但保留日誌中的警告信息,可繼續使用 strick mode API。 |
2 | 禁止調用深灰名單和黑名單中的接口。 |
3 | 禁止調用黑名單中的接口,但容許調用深灰名單中的接口。 |
adb shell settings put global policy_control <key-values>
複製代碼
<key-values>
可由以下幾種鍵及其對應的值組成,格式爲 <key1>=<value1>:<key2>=<value2>
。
key | 含義 |
---|---|
immersive.full | 同時隱藏 |
immersive.status | 隱藏狀態欄 |
immersive.navigation | 隱藏導航欄 |
immersive.preconfirms | ? |
這些鍵對應的值可則以下值用逗號組合:
value | 含義 |
---|---|
apps |
全部應用 |
* |
全部界面 |
package-name |
指定應用 |
-package-name |
排除指定應用 |
例如:
adb shell settings put global policy_control immersive.full=*
複製代碼
表示設置在全部界面下都同時隱藏狀態欄和導航欄。
adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
複製代碼
表示設置在包名爲 com.package1
和 com.package2
的應用裏隱藏狀態欄,在除了包名爲 com.package3
的全部應用裏隱藏導航欄。
截圖保存到電腦:
adb exec-out screencap -p > sc.png
複製代碼
若是 adb 版本較老,沒法使用 exec-out
命令,這時候建議更新 adb 版本。沒法更新的話可使用如下麻煩點的辦法:
先截圖保存到設備裏:
adb shell screencap -p /sdcard/sc.png
複製代碼
而後將 png 文件導出到電腦:
adb pull /sdcard/sc.png
複製代碼
可使用 adb shell screencap -h
查看 screencap
命令的幫助信息,下面是兩個有意義的參數及含義:
參數 | 含義 |
---|---|
-p | 指定保存文件爲 png 格式 |
-d display-id | 指定截圖的顯示屏編號(有多顯示屏的狀況下) |
實測若是指定文件名以 .png
結尾時能夠省略 -p 參數;不然須要使用 -p 參數。若是不指定文件名,截圖文件的內容將直接輸出到 stdout。
另一種一行命令截圖並保存到電腦的方法: Linux 和 Windows
adb shell screencap -p | sed "s/\r$//" > sc.png
複製代碼
Mac OS X
adb shell screencap -p | gsed "s/\r$//" > sc.png
複製代碼
這個方法須要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 文件夾下也有。若是確實找不到該命令,能夠下載 sed for Windows 並將 sed.exe 所在文件夾添加到 PATH 環境變量裏。
而在 Mac 下使用系統自帶的 sed 命令會報錯:
sed: RE error: illegal byte sequence
複製代碼
須要安裝 gnu-sed,而後使用 gsed 命令:
brew install gnu-sed
複製代碼
錄製屏幕以 mp4 格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
複製代碼
須要中止時按 Ctrl-C,默認錄製時間和最長錄製時間都是 180 秒。
若是須要導出到電腦:
adb pull /sdcard/filename.mp4
複製代碼
可使用 adb shell screenrecord --help
查看 screenrecord
命令的幫助信息,下面是常見參數及含義:
參數 | 含義 |
---|---|
--size WIDTHxHEIGHT | 視頻的尺寸,好比 1280x720 ,默認是屏幕分辨率。 |
--bit-rate RATE | 視頻的比特率,默認是 4Mbps。 |
--time-limit TIME | 錄製時長,單位秒。 |
--verbose | 輸出更多信息。 |
注:須要 root 權限。
adb shell
su
cat /data/misc/wifi/*.conf
複製代碼
注:須要 root 權限。
adb shell
su
date -s 20160823.131500
複製代碼
表示將系統日期和時間更改成 2016 年 08 月 23 日 13 點 15 分 00 秒。
adb reboot
複製代碼
adb shell
su
複製代碼
此時命令行提示符是 $
則表示沒有 root 權限,是 #
則表示已 root。
Monkey 能夠生成僞隨機用戶事件來模擬單擊、觸摸、手勢等操做,能夠對正在開發中的程序進行隨機壓力測試。
簡單用法:
adb shell monkey -p <packagename> -v 500
複製代碼
表示向 <packagename>
指定的應用程序發送 500 個僞隨機事件。 Monkey 的詳細用法參考 官方文檔。
注:須要 root 權限。
adb root
adb shell svc wifi enable
複製代碼
adb root
adb shell svc wifi disable
複製代碼
若執行成功,輸出爲空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed
。
adb reboot recovery
複製代碼
adb reboot
複製代碼
adb reboot bootloader
複製代碼
若是咱們下載了 Android 設備對應的系統更新包到電腦上,那麼也能夠經過 adb 來完成更新。
以 Recovery 模式下更新爲例:
adb reboot recovery
複製代碼
在設備的 Recovery 界面上操做進入 Apply update
-Apply from ADB
。 注:不一樣的 Recovery 菜單可能與此有差別,有的是一級菜單就有 Apply update from ADB
。
經過 adb 上傳和更新系統。
adb sideload <path-to-update.zip>
複製代碼
啓用 SELinux
adb root
adb shell setenforce 1
複製代碼
禁用 SELinux
adb root
adb shell setenforce 0
複製代碼
啓用 dm_verity
adb root
adb enable-verity
複製代碼
禁用 dm_verity
adb root
adb disable-verity
複製代碼
Android 系統是基於 Linux 內核的,因此 Linux 裏的不少命令在 Android 裏也有相同或相似的實現,在 adb shell
裏能夠調用。本文檔前面的部份內容已經用到了 adb shell
命令。
adb shell ps
複製代碼
輸出信息各列含義:
列名 | 含義 |
---|---|
USER | 所屬用戶 |
PID | 進程 ID |
PPID | 父進程 ID |
NAME | 進程名 |
adb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
複製代碼
adb shell top
後面能夠跟一些可選參數進行過濾查看不一樣的列表,可用參數及含義以下:
參數 | 含義 |
---|---|
-m | 最多顯示多少個進程 |
-n | 刷新多少次後退出 |
-d | 刷新時間間隔(單位秒,默認值5) |
-s | 按某列排序(可用col值:cpu, vss, rss, thr) |
-t | 顯示線程信息 |
-h | 顯示幫助文檔 |
輸出信息各列含義:
列名 | 含義 |
---|---|
PID | 進程 ID |
PR | 優先級 |
CPU% | 當前瞬間佔用 CPU 百分比 |
S | 進程狀態(R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程) |
#THR | 線程數 |
VSS | Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存) |
RSS | Resident Set Size 實際使用物理內存(包含共享庫佔用的內存) |
PCY | 調度策略優先級,SP_BACKGROUND/SPFOREGROUND |
UID | 進程全部者的用戶 ID |
NAME | 進程名 |
有兩種方案:
adb shell dumpsys package <packagename> | grep userId=
如:adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394
複製代碼
adb shell cat /proc/<pid>/status | grep Uid
如:adb shell
gemini:/ $ ps | grep org.mazhuang.guanggoo
u0_a394 28635 770 1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
gemini:/ $ cat /proc/28635/status | grep Uid
Uid: 10394 10394 10394 10394
gemini:/ $
複製代碼