ADB除錯命令大全
ADB,即 Android Debug Bridge,它是 Android 開發/測試人員不可替代的強大工具,也是 Android 裝置玩家的好玩具。
自己總結常用的如下:
獲取系統版本:adb shell getprop ro.build.version.release
獲取系統api版本:adb shell getprop ro.build.version.sdk
adb shell getprop 檢視機器的全部資訊引數
adb shell getprop ro.serialno 檢視機器的SN號
adb shell getprop ro.carrier 檢視機器的CID號
adb shell getprop ro.hardware 檢視機器板子代號
adb shell getprop ro.bootloader:檢視SPL(Hboot)版本號getprop:檢視機器的全部資訊引數在這能看到你機器的全部的資訊引數,從你的硬體資訊到所刷的ROM版本資訊。
adb logcat -c 清除所有以前的日誌
adb logcat -d 這個命令是在時間上倒過來用的 就是你先操作 然後敲這個命令 打出來的log就是你剛操作那段時間的log 而且自動退出log模式
adb logcat -s XXX這個是設定過濾用的 比如你只想檢視FirstDemo的日誌 就替換最後的XXX
《轉載》 以下內容來自GitHub:
注:有部分命令的支援情況可能與 Android 系統版本及定製 ROM 的實現有關。
基本用法
命令語法
adb 命令的基本語法如下:
adb [-d|-e|-s <serialNumber>] <command>
如果只有一個裝置/模擬器連線時,可以省略掉 [-d|-e|-s <serialNumber>]
這一部分,直接使用 adb <command>
。
為命令指定目標裝置
如果有多個裝置/模擬器連線,則需要為命令指定目標裝置。
引數 | 含義 |
---|---|
-d | 指定當前唯一通過 USB 連線的 Android 裝置為命令目標 |
-e | 指定當前唯一執行的模擬器為命令目標 |
-s <serialNumber> |
指定相應 serialNumber 號的裝置/模擬器為命令目標 |
在多個裝置/模擬器連線的情況下較常用的是 -s <serialNumber>
引數,serialNumber 可以通過 adb devices
命令獲取。如:
$ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
輸出裡的 cf264b8f
和 emulator-5554
即為 serialNumber。比如這時想指定 cf264b8f
這個裝置來執行 adb 命令獲取螢幕解析度:
adb -s cf264b8f shell wm size
遇到多裝置/模擬器的情況均使用這幾個引數為命令指定目標裝置,下文中為簡化描述,不再重複。
啟動/停止
啟動 adb server 命令:
adb start-server
(一般無需手動執行此命令,在執行 adb 命令時若發現 adb server 沒有啟動會自動調起。)
停止 adb server 命令:
adb kill-server
檢視 adb 版本
命令:
adb version
示例輸出:
Android Debug Bridge version 1.0.32
Revision 09a0d98bebce-android
以 root 許可權執行 adbd
adb 的執行原理是 PC 端的 adb server 與手機端的守護程序 adbd 建立連線,然後 PC 端的 adb client 通過 adb server 轉發命令,adbd 接收命令後解析執行。
所以如果 adbd 以普通許可權執行,有些需要 root 許可權才能執行的命令無法直接用 adb xxx
執行。這時可以 adb shell
然後 su
後執行命令,也可以讓 adbd 以 root 許可權執行,這個就能隨意執行高許可權命令了。
命令:
adb root
正常輸出:
restarting adbd as root
現在再執行 adb shell
,看看命令列提示符是不是變成 #
了?
有些手機 root 後也無法通過 adb root
命令讓 adbd 以 root 許可權執行,比如三星的部分機型,會提示 adbd cannot run as root in production builds
,此時可以先安裝 adbd Insecure,然後 adb root
試試。
相應地,如果要恢復 adbd 為非 root 許可權的話,可以使用 adb unroot
命令。
指定 adb server 的網路埠
命令:
adb -P <port> start-server
預設埠為 5037。
裝置連線管理
查詢已連線裝置/模擬器
命令:
adb devices
輸出示例:
List of devices attached
cf264b8f device
emulator-5554 device
輸出格式為 [serialNumber] [state]
,serialNumber 即我們常說的 SN,state 有如下幾種:
offline
—— 表示裝置未連線成功或無響應。device
—— 裝置已連線。注意這個狀態並不能標識 Android 系統已經完全啟動和可操作,在裝置啟動過程中裝置例項就可連線到 adb,但啟動完畢後系統才處於可操作狀態。no device
—— 沒有裝置/模擬器連線。
以上輸出顯示當前已經連線了兩臺裝置/模擬器,cf264b8f
與 emulator-5554
分別是它們的 SN。從 emulator-5554
這個名字可以看出它是一個 Android 模擬器。
常見異常輸出:
沒有裝置/模擬器連線成功。
List of devices attached
裝置/模擬器未連線到 adb 或無響應。
List of devices attached cf264b8f offline
USB 連線
通過 USB 連線來正常使用 adb 需要保證幾點:
硬體狀態正常。
包括 Android 裝置處於正常開機狀態,USB 連線線和各種介面完好。
Android 裝置的開發者選項和 USB 除錯模式已開啟。
可以到「設定」-「開發者選項」-「Android 除錯」檢視。
如果在設定裡找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設定」-「關於手機」連續點選「版本號」7 次。
裝置驅動狀態正常。
這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「裝置管理器」裡檢視相關裝置上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了。否則可以下載一個手機助手類程式來安裝驅動先。
通過 USB 線連線好電腦和裝置後確認狀態。
adb devices
如果能看到
xxxxxx device
說明連線成功。
無線連線
除了可以通過 USB 連線裝置與電腦來使用 adb,也可以通過無線連線——雖然連線過程中也有需要使用 USB 的步驟,但是連線成功之後你的裝置就可以在一定範圍內擺脫 USB 連線線的限制啦!
操作步驟:
將 Android 裝置與將執行 adb 的電腦連線到同一個區域網,比如連到同一個 WiFi。
將裝置與電腦通過 USB 線連線。
應確保連線成功(可執行
adb devices
看是否能列出該裝置)。讓裝置在 5555 埠監聽 TCP/IP 連線:
adb tcpip 5555
斷開 USB 連線。
找到裝置的 IP 地址。
一般能在「設定」-「關於手機」-「狀態資訊」-「IP地址」找到。
通過 IP 地址連線裝置。
adb connect <device-ip-address>
這裡的
<device-ip-address>
就是上一步中找到的裝置 IP 地址。確認連線狀態。
adb devices
如果能看到
<device-ip-address>:5555 device
說明連線成功。
如果連線不了,請確認 Android 裝置與電腦是連線到了同一個 WiFi,然後再次執行 adb connect <device-ip-address>
那一步;
如果還是不行的話,通過 adb kill-server
重新啟動 adb 然後從頭再來一次試試。
斷開無線連線
命令:
adb disconnect <device-ip-address>
應用管理
檢視應用列表
檢視應用列表的基本命令格式是
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
輸出示例:
package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.protips
package:com.android.documentsui
package:com.android.gallery
package:com.android.externalstorage
...
// other packages here
...
系統應用
命令:
adb shell pm list packages -s
第三方應用
命令:
adb shell pm list packages -3
包名包含某字串的應用
比如要檢視包名包含字串 mazhuang
的應用列表,命令:
adb shell pm list packages mazhuang
當然也可以使用 grep 來過濾:
adb shell pm list packages | grep mazhuang
安裝 APK
命令:
adb install <apk file>
引數:
adb install
後面可以跟一些引數來控制安裝 APK 的行為,常用引數及含義如下:
引數 | 含義 |
---|---|
-r | 允許覆蓋安裝。 |
-s | 將應用安裝到 sdcard。 |
-d | 允許降級覆蓋安裝。 |
完整引數列表及含義可以直接執行 adb
命令然後檢視 adb install [-lrtsdg] <file>
一節。
如果見到類似如下輸出(狀態為 Success
)代表安裝成功:
12040 KB/s (22205609 bytes in 1.801s)
pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
而如果狀態為 Failure
則表示安裝失敗。常見安裝失敗輸出程式碼、含義及可能的解決辦法如下:
輸出 | 含義 | 解決辦法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 應用已經存在 | 使用 -r 引數 |
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 | 已經安裝過簽名不一樣的同名應用,且資料沒有移除 | |
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 | sdcard 訪問失敗 | 確認 sdcard 可用,或者安裝到內建儲存 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 不能安裝到指定位置 | 切換安裝位置,新增或刪除 -s 引數 |
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 | 應用程式與裝置不相容 | |
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 devicerm | 空間不足 | 清理空間 |
Permission denied … sdcard … | sdcard 不可用 |
解除安裝應用
命令:
adb uninstall [-k] <packagename>
<packagename>
表示應用的包名,-k
引數可選,表示解除安裝應用但保留資料和快取目錄。
命令示例:
adb uninstall com.qihoo360.mobilesafe
表示解除安裝 360 手機衛士。
清除應用資料與快取
命令:
adb shell pm clear <packagename>
<packagename>
表示應用名包,這條命令的效果相當於在設定裡的應用資訊介面點選了「清除快取」和「清除資料」。
命令示例:
adb shell pm clear com.qihoo360.mobilesafe
表示清除 360 手機衛士的資料和快取。
檢視前臺 Activity
命令:
adb shell dumpsys activity activities | grep mFocusedActivity
輸出示例:
mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher
就是當前處於前臺的 Activity。
與應用互動
主要是使用 am <command>
命令,常用的 <command>
如下:
command | 用途 |
---|---|
start [options] <INTENT> |
啟動 <INTENT> 指定的 Activity |
startservice [options] <INTENT> |
啟動 <INTENT> 指定的 Service |
broadcast [options] <INTENT> |
傳送 <INTENT> 指定的廣播 |
force-stop <packagename> |
停止 <packagename> 相關的程序 |
<INTENT>
引數很靈活,和寫 Android 程式時程式碼裡的 Intent 相對應。
用於決定 intent 物件的選項如下:
引數 | 含義 |
---|---|
-a <ACTION> |
指定 action,比如 android.intent.action.VIEW |
-c <CATEGORY> |
指定 category,比如 android.intent.category.APP_CONTACTS |
-n <COMPONENT> |
指定完整 component 名,用於明確指定啟動哪個 Activity,如 com.example.app/.ExampleActivity |
<INTENT>
裡還能帶資料,就像寫程式碼時的 Bundle 一樣:
引數 | 含義 |
---|---|
--esn <EXTRA_KEY> |
null 值(只有 key 名) |
`-e | –es ` |
--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 陣列 |
調起 Activity
命令格式:
adb shell am start [options] <INTENT>
例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示調起微信主介面。
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
表示調起 org.mazhuang.boottimemeasure/.MainActivity
並傳給它 string 資料鍵值對 toast - hello, world
。
調起 Service
命令格式:
adb shell am startservice [options] <INTENT>
例如:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示調起微信的某 Service。
傳送廣播
命令格式:
adb shell am broadcast [options] <INTENT>
例如:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
表示向 org.mazhuang.boottimemeasure/.BootCompletedReceiver
傳送一個 BOOT_COMPLETED
廣播,這類用法在測試的時候很實用,比如某個廣播的場景很難製造,可以考慮通過這種方式來發送廣播。
強制停止應用
命令:
adb shell am force-stop <packagename>
命令示例:
adb shell am force-stop com.qihoo360.mobilesafe
表示停止 360 安全衛士的一切程序與服務。
檔案管理
複製裝置裡的檔案到電腦
命令:
adb pull <裝置裡的檔案路徑> [電腦上的目錄]
其中 電腦上的目錄
引數可以省略,預設複製到當前目錄。
例:
adb pull /sdcard/sr.mp4 ~/tmp/
小技巧:裝置上的檔案路徑可能需要 root 許可權才能訪問,如果你的裝置已經 root 過,可以先使用 adb shell
和 su
命令在 adb shell 裡獲取 root 許可權後,先 cp /path/on/device /sdcard/filename
將檔案複製到 sdcard,然後 adb pull /sdcard/filename /path/on/pc
。
複製電腦裡的檔案到裝置
命令:
adb push <電腦上的檔案路徑> <裝置裡的目錄>
例:
adb push ~/sr.mp4 /sdcard/
小技巧:裝置上的檔案路徑普通許可權可能無法直接寫入,如果你的裝置已經 root 過,可以先 adb push /path/on/pc /sdcard/filename
,然後 adb shell
和 su
在 adb shell 裡獲取 root 許可權後,cp /sdcard/filename /path/on/device
。
模擬按鍵/輸入
在 adb shell
裡有個很實用的命令叫 input
,通過它可以做一些有趣的事情。
input
命令的完整 help 資訊如下:
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
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)
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
HOME 鍵
命令:
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
現在 hello
出現在文字框了。
檢視日誌
Android 系統的日誌分為兩部分,底層的 Linux 核心日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。
Android 日誌
命令格式:
[adb] logcat [<option>] ... [<filter-spec>] ...
常用用法列舉如下:
按級別過濾日誌
Android 的日誌分為如下幾個級別:
- V —— Verbose(最低,輸出得最多)
- D —— Debug
- I —— Info
- W —— Warning
- E —— Error
- F —— Fatal
- S —— Silent(最高,啥也不輸出)
按某級別過濾日誌則會將該級別及以上的日誌輸出。
比如,命令:
adb logcat *:W
會將 Warning、Error、Fatal 和 Silent 日誌輸出。
按 tag 和級別過濾日誌
比如,命令:
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>
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
process
格式為:
<priority>(<pid>) <message>
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
tag
格式為:
<priority>/<tag>: <message>
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
raw
格式為:
<message>
示例:
Disconnected process message: 10, size: 0
time
格式為:
<datetime> <priority>/<tag>(<pid>): <message>
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
threadtime
格式為:
<datetime> <pid> <tid> <priority> <tag>: <message>
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
long
格式為:
[ <datetime> <pid>:<tid> <priority>/<tag> ] <message>
示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
指定格式可與上面的過濾同時使用。比如:
adb logcat -v long ActivityManager:I *:S
清空日誌
adb logcat -c
核心日誌
命令:
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
那一行前面的時間就是。
檢視裝置資訊
型號
命令:
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。
螢幕密度
命令:
adb shell wm density
輸出示例:
Physical density: 420
該裝置螢幕密度為 420dpi。
顯示屏引數
命令:
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。
android_id
命令:
adb shell settings get secure android_id
輸出示例:
51b6be48bac8c569
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
輸出示例:
Result: Parcel(
0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
0x00000020: 00340030 00000031 '0.4.1... ')
把裡面的有效內容提取出來就是 IMEI 了,比如這裡的是 860955027785041
。
Android 系統版本
命令:
adb shell getprop ro.build.version.release
輸出示例:
5.0.2
Mac 地址
命令:
adb shell cat /sys/class/net/wlan0/address
輸出示例:
f8:a9:d0:17:42:4d
CPU 資訊
命令:
adb shell cat /proc/cpuinfo
輸出示例:
Processor : ARMv7 Processor rev 0 (v7l)
processor : 0
BogoMIPS : 38.40
processor : 1
BogoMIPS : 38.40
processor : 2
BogoMIPS : 38.40
processor : 3
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant : 0x2
CPU part : 0x06f
CPU revision : 0
Hardware : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision : 000b
Serial : 0000000000000000
這是 Nexus 5 的 CPU 資訊,我們從輸出裡可以看到使用的硬體是 Qualcomm MSM 8974
,processor 的編號是 0 到 3,所以它是四核的,採用的架構是 ARMv7 Processor rev 0 (v71)
。
記憶體資訊
命令:
adb shell cat /proc/meminfo
輸出示例:
MemTotal: 1027424 kB
MemFree: 486564 kB
Buffers: 15224 kB
Cached: 72464 kB
SwapCached: 24152 kB
Active: 110572 kB
Inactive: 259060 kB
Active(anon): 79176 kB
Inactive(anon): 207736 kB
Active(file): 31396 kB
Inactive(file): 51324 kB
Unevictable: 3948 kB
Mlocked: 0 kB
HighTotal: 409600 kB
HighFree: 132612 kB
LowTotal: 617824 kB
LowFree: 353952 kB
SwapTotal: 262140 kB
SwapFree: 207572 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 265324 kB
Mapped: 47072 kB
Shmem: 1020 kB
Slab: 57372 kB
SReclaimable: 7692 kB
SUnreclaim: 49680 kB
KernelStack: 4512 kB
PageTables: 5912 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 775852 kB
Committed_AS: 13520632 kB
VmallocTotal: