一、ADB是什麼?
ADB,即 Android Debug Bridge 是一種允許模擬器或已連線的 Android 裝置進行通訊的命令列工具,它可為各種裝置操作提供便利,如安裝和除錯應用,並提供對 Unix shell
(可用來在模擬器或連線的裝置上執行各種命令)的訪問。可以在Android SDK/platform-tools
中找到 adb
工具或下載 ADB Kits 。
注: 有部分命令的支援情況可能與 Android 系統版本及定製 ROM 的實現有關。
二、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 <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
實際是分三步完成:
- 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
: 程式 IDlevel
: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
複製程式碼
輸出示例:
<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
那一行前面的時間就是。
4.9 檢視 Android 裝置系統屬性
檢視 Android 裝置系統屬性的基本命令格式是:
adb shell getprop [options]
複製程式碼
除了可以檢視 Android 裝置系統屬性之外,還可以設定系統屬性,設定系統屬性的基本命令格式是:
adb shell setprop <key> <value>
複製程式碼
4.9.1 檢視裝置型號
adb shell getprop ro.product.model
複製程式碼
輸出示例:
Nexus 5
複製程式碼
4.9.2 檢視裝置電池狀況
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% 的電量。
4.9.3 檢視裝置螢幕解析度
adb shell wm size
複製程式碼
輸出示例:
Physical size: 1080x1920
複製程式碼
該裝置螢幕解析度為 1080px * 1920px。
如果使用命令修改過,那輸出可能是:
Physical size: 1080x1920
Override size: 480x1024
複製程式碼
表明裝置的螢幕解析度原本是 1080px * 1920px,當前被修改為 480px * 1024px。
4.9.4 檢視裝置螢幕密度
adb shell wm density
複製程式碼
輸出示例:
Physical density: 420
複製程式碼
該裝置螢幕密度為 420dpi。
如果使用命令修改過,那輸出可能是:
Physical density: 480
Override density: 160
複製程式碼
表明裝置的螢幕密度原來是 480dpi,當前被修改為 160dpi。
4.9.5 檢視裝置螢幕引數
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。
4.9.6 檢視裝置 android_id
adb shell settings get secure android_id
複製程式碼
輸出示例:
51b6be48bac8c569
複製程式碼
4.9.7 檢視裝置IMEI
在 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
4.9.8 檢視裝置 Android 系統版本
adb shell getprop ro.build.version.release
複製程式碼
輸出示例:
5.0.2
複製程式碼
4.9.9 檢視裝置 IP 地址
adb shell ifconfig | grep Mask
複製程式碼
在有的裝置上這個命令沒有輸出,如果裝置連著 WiFi,可以使用如下命令來檢視區域網 IP:
adb shell ifconfig wlan0
複製程式碼
如果以上命令仍然不能得到期望的資訊,那可以試試以下命令(部分系統版本里可用):
adb shell netcfg
複製程式碼
4.9.10 檢視裝置 Mac 地址
adb shell cat /sys/class/net/wlan0/address
複製程式碼
輸出示例:
f8:a9:d0:17:42:4d
複製程式碼
這檢視的是區域網 Mac 地址,行動網路或其它連線的資訊可以通過前面的小節「IP 地址」裡提到的 adb shell netcfg
命令來檢視。
4.9.11 檢視裝置 CPU 資訊
adb shell cat /proc/cpuinfo
複製程式碼
4.9.12 檢視裝置記憶體資訊
adb shell cat /proc/meminfo
複製程式碼
4.9.13 檢視裝置更多硬體與系統屬性
裝置的更多硬體與系統屬性可以通過如下命令檢視:
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
複製程式碼
4.10 修改設定
注: 修改設定之後,執行恢復命令有可能顯示仍然不太正常,可以執行 adb reboot
重啟裝置,或手動重啟。
修改設定的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 裡存放的設定值。
4.10.1 修改解析度
adb shell wm size 480x1024
複製程式碼
表示將解析度修改為 480px * 1024px。
恢復原解析度命令:
adb shell wm size reset
複製程式碼
4.10.2 修改螢幕密度
adb shell wm density 160
複製程式碼
表示將螢幕密度修改為 160dpi。
恢復原螢幕密度命令:
adb shell wm density reset
複製程式碼
4.10.3 修改顯示區域
adb shell wm overscan 0,0,0,200
複製程式碼
四個數字分別表示距離左、上、右、下邊緣的留白畫素,以上命令表示將螢幕底部 200px 留白。
恢復原顯示區域命令:
adb shell wm overscan reset
複製程式碼
4.10.4 修改關閉 USB 除錯模式
adb shell settings put global adb_enabled 0
複製程式碼
用命令恢復不了了,畢竟關閉了 USB 除錯 adb 就連線不上 Android 裝置了。 去裝置上手動恢復吧:「設定」-「開發者選項」-「Android 除錯」。
4.10.5 修改允許/禁止訪問非 SDK API
允許訪問非 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 | 禁止呼叫黑名單中的介面,但允許呼叫深灰名單中的介面。 |
4.10.6 修改狀態列和導航欄的顯示隱藏
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
的所有應用裡隱藏導航欄。
4.11 實用功能
4.11.1 螢幕截圖
截圖儲存到電腦:
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
複製程式碼
4.11.2 錄製螢幕
錄製螢幕以 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 | 輸出更多資訊。 |
4.11.3 檢視連線過的 WiFi 密碼
注:需要 root 許可權。
adb shell
su
cat /data/misc/wifi/*.conf
複製程式碼
4.11.4 設定系統日期和時間
注:需要 root 許可權。
adb shell
su
date -s 20160823.131500
複製程式碼
表示將系統日期和時間更改為 2016 年 08 月 23 日 13 點 15 分 00 秒。
4.11.5 重啟手機
adb reboot
複製程式碼
4.11.6 檢測裝置是否已 root
adb shell
su
複製程式碼
此時命令列提示符是 $
則表示沒有 root 許可權,是 #
則表示已 root。
4.11.7 使用 Monkey 進行壓力測試
Monkey 可以生成偽隨機使用者事件來模擬單擊、觸控、手勢等操作,可以對正在開發中的程式進行隨機壓力測試。
簡單用法:
adb shell monkey -p <packagename> -v 500
複製程式碼
表示向 <packagename>
指定的應用程式傳送 500 個偽隨機事件。
Monkey 的詳細用法參考 官方文件。
4.11.8 開啟/關閉 WiFi
注:需要 root 許可權。
- 開啟 WiFi:
adb root
adb shell svc wifi enable
複製程式碼
- 關閉 WiFi:
adb root
adb shell svc wifi disable
複製程式碼
若執行成功,輸出為空;若未取得 root 許可權執行此命令,將執行失敗,輸出 Killed
。
4.12 刷機相關命令
4.12.1 重啟到 Recovery 模式
adb reboot recovery
複製程式碼
4.12.2 從 Recovery 重啟到 Android
adb reboot
複製程式碼
4.12.2 重啟到 Fastboot 模式
adb reboot bootloader
複製程式碼
4.12.4 通過 sideload 更新系統
如果我們下載了 Android 裝置對應的系統更新包到電腦上,那麼也可以通過 adb 來完成更新。
以 Recovery 模式下更新為例:
- 重啟到 Recovery 模式。
adb reboot recovery
複製程式碼
-
在裝置的 Recovery 介面上操作進入
Apply update
-Apply from ADB
。 注:不同的 Recovery 選單可能與此有差異,有的是一級選單就有Apply update from ADB
。 -
通過 adb 上傳和更新系統。
adb sideload <path-to-update.zip>
複製程式碼
4.13 安全相關命令
4.13.1 啟用/禁用 SELinux
啟用 SELinux
adb root
adb shell setenforce 1
複製程式碼
禁用 SELinux
adb root
adb shell setenforce 0
複製程式碼
4.13.2 啟用/禁用 dm_verity
啟用 dm_verity
adb root
adb enable-verity
複製程式碼
禁用 dm_verity
adb root
adb disable-verity
複製程式碼
4.14 更多 adb shell 命令
Android 系統是基於 Linux 核心的,所以 Linux 裡的很多命令在 Android 裡也有相同或類似的實現,在 adb shell
裡可以呼叫。本文件前面的部分內容已經用到了 adb shell
命令。
4.14.1 檢視程式狀態
adb shell ps
複製程式碼
輸出資訊各列含義:
列名 | 含義 |
---|---|
USER | 所屬使用者 |
PID | 程式 ID |
PPID | 父程式 ID |
NAME | 程式名 |
4.14.2 檢視處理器實時狀態
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 | 程式名 |
4.14.3 檢視程式 UID
有兩種方案:
adb shell dumpsys package <packagename> | grep userId=
如:
adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394
複製程式碼
- 通過 ps 命令找到對應程式的 pid 之後
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:/ $ 複製程式碼