概述
??ADB捶惜,即Android Debug Bridge批钠,就是通過(guò)命令查看我們需要的信息,比如手機(jī)ROM配置信息怠苔,日志等等同廉,是開發(fā)和測(cè)試工程師必備的技能之一。
常見命令
一嘀略、<sudo>adb常見命令: sudo超級(jí)權(quán)限模式
- adb --help
adb devices 設(shè)備連接狀態(tài)
adb pull <remote> <local> 將設(shè)備存儲(chǔ)器的文件拷貝出來(lái)恤溶,例如:
adb pull /sdcard/Android/data/&package_name/files/MIUI/debug_log/&package_name temp/adb push <local> <remote> 將文件拷貝到設(shè)備指定目錄, 與adb pull相反
adb install [-lrtsdg] <file> 安裝應(yīng)用
(-r: replace existing application)
(-d: allow version code downgrade)
(-g: grant all runtime permissions)adb uninstall <package> 卸載應(yīng)用
adb start-server 開始adb服務(wù)
adb kill-server 殺掉adb服務(wù)
adb reboot 重啟設(shè)備
adb root 獲取root權(quán)限
adb remount 將/system, /vendor (if present) and /oem (if present)置為可寫模式帜羊,前提是先root
注:remount后的設(shè)備咒程,可以直接安裝apk,不受版本號(hào)限制讼育,adb push out/NaviLauncher00/Launcher.apk system/app
二帐姻、日志過(guò)濾
- adb logcat抓取日志: adb logcat --help
用法: logcat [options] [filterspecs]
options包括:
- -s 過(guò)濾TAG
- -f 輸出日志到到手機(jī)的sd卡
- -v 設(shè)置日志消息的輸出格式
?brief — 顯示優(yōu)先級(jí)/標(biāo)記和原始進(jìn)程的PID (默認(rèn)格式)
?process — 僅顯示進(jìn)程PID
?tag — 僅顯示優(yōu)先級(jí)/標(biāo)記
?thread — 顯示優(yōu)先級(jí)/標(biāo)記稠集,消息線程的PID和TID
?raw — 顯示原始的日志信息,沒(méi)有其他的元數(shù)據(jù)字段
?time — 顯示日期饥瓷,調(diào)用時(shí)間剥纷,優(yōu)先級(jí)/標(biāo)記,PID
?threadtime — 顯示日期呢铆,調(diào)用時(shí)間晦鞋,優(yōu)先級(jí)/標(biāo)記以及發(fā)出消息的線程的PID和TID
?long — 顯示所有的元數(shù)據(jù)字段并且用空行分隔消息內(nèi)容- -c 清除緩存區(qū)的日志,Clear (flush) the entire log and exit
- -b 查看日志消息的緩沖區(qū)棺克, 包括'main','system', 'radio', 'events', 'crash', 'default' or 'all'
- --pid=<pid> 打印指定進(jìn)程的日志
filterspecs格式:
- <tag>[:priority]:不指定的話悠垛,默認(rèn)就是所有級(jí)別的所有日志
- 日志的優(yōu)先級(jí),從低到高:
V — Verbose (lowest priority, 冗長(zhǎng)的) 對(duì)應(yīng)于Log.v(tag)系列函數(shù)
D — Debug (調(diào)試用) 對(duì)應(yīng)于Log.d()系列函數(shù)
I — Info(線上用) 對(duì)應(yīng)于Log.i()系列函數(shù)
W — Warning(警告日志) 對(duì)應(yīng)于Log.w()系列函數(shù)
E — Error (發(fā)生錯(cuò)誤) 對(duì)應(yīng)于Log.e()系列函數(shù)
F — Fatal (What a Terrible Failure娜谊,引起程序崩潰)對(duì)應(yīng)于Log.wtf()系列函數(shù)
S — Silent (highest priority, on which nothing is ever printed)用法舉例:
- adb logcat -s ActivityManager [打印TAG為ActivityManager的日志]
- adb logcat -v time -s ActivityManager [日志的打印格式為time]
- adb logcat -c 或adb locat -c all [清除緩存區(qū)所有類型的日志]
- adb logcat -c main crash [清除緩存區(qū)main和crash類型的日志]
- adb logcat -b radio [查看包含無(wú)線裝置/電話相關(guān)消息的緩沖區(qū)日志]
- adb logcat --pid="2661" [打印進(jìn)程號(hào)是2661的日志]
- adb logcat -f /sdcard/log.txt [保存日志到手機(jī)的log.txt文件]
- adb logcat -s ActivityManager:I WindowManager:W [輸出TAG為"ActivityManager"并且優(yōu)先級(jí)大于等于"Info"和TAG為"WindowManager"并且優(yōu)先級(jí)大于等于"Warn"的日志]
- grep命令确买,用于過(guò)濾/搜索的特定字符: grep --help
用法: grep [選項(xiàng)]... PATTERN [FILE]...
在每個(gè) FILE 或是標(biāo)準(zhǔn)輸入中查找 PATTERN。
選項(xiàng)包括:
- -E 指定字符串做為查找文件內(nèi)容的樣式纱皆,一個(gè)可擴(kuò)展的正則表達(dá)式湾趾;
- -r 指定要查找的目錄或文件(默認(rèn)當(dāng)前目錄);
- -i 忽略字符大小寫派草;
- -n 輸出的同時(shí)打印行號(hào)搀缠;
- -a 等同于 --binary-files=text, 有二進(jìn)制輸出時(shí),不中斷打印
用法舉例
- adb logcat -v threadtime | grep -inE "ActivityManager|WindowManager" [打印包含ActivityManager和WindowManager關(guān)鍵字的日志澳眷,關(guān)鍵字不區(qū)分大小寫胡嘿,顯示日志所在行數(shù)]
- grep -rE "Child_" temp/log.txt [過(guò)濾電腦temp/log.txt文件中包含“Child_”關(guān)鍵字的日志并顯示在終端]
- grep -rE "ActivityManager|WindowManager" temp/log.txt > output.text [過(guò)濾ActivityManager和WindowManager關(guān)鍵字的日志,并輸出到當(dāng)前目錄output.text文件中]
- 過(guò)濾進(jìn)程$pid的日志
獲取應(yīng)用進(jìn)程號(hào)見:“八钳踊、工作中高頻使用命令總結(jié)”
用法舉例:
- adb logcat --pid="$pid"
- adb logcat -v threadtime | grep -E "$pid"
三衷敌、系統(tǒng)屬性的獲取和修改
獲取系統(tǒng)屬性
- adb shell getprop [獲取Android系統(tǒng)所有的配置信息,包括各種版本號(hào)拓瞪,內(nèi)存分配大小缴罗,手機(jī)型號(hào)等等]
- adb shell getprop >temp/prop.txt [獲取所有配置信息并保存到本地文件]
- adb shell getprop | grep "dalvik.vm.heapgrowthlimit" [獲取內(nèi)存分配的配置]
- adb pull /system/build.prop temp/prop.txt [拷貝編譯配置文件,getprop包括build.prop信息]
修改系統(tǒng)屬性祭埂,前提是這些配置是可寫的:adb shell setprop [key] [value]
- adb shell setprop dalvik.vm.heapgrowthlimit 512m [將分配內(nèi)存修改為512MB]
修改日志等級(jí)面氓,前提是配置文件可寫:adb shell setprop log.tag.YOUR_LOG_TAG [LEVEL]
作用:比如你的TAG只能打印INFO等級(jí)的日志,DEBUG不打印無(wú)法分析問(wèn)題蛆橡,怎么辦舌界?修改等級(jí),包括系統(tǒng)類泰演,比如ActivityManager等等呻拌,也可以修改,方便分析問(wèn)題睦焕。
- adb shell setprop log.tag.EngineBridge DEBUG [將TAG為EngineBridge的日志打印級(jí)別改為DEBUG]
四藐握、dumpsys命令
查看所有系統(tǒng)服務(wù)信息
- adb shell dumpsys
查看ActvityManagerService的信息
- adb shell dumpsys activity [查看ActvityManagerService所有信息]
- adb shell dumpsys activity package &package_name [查看當(dāng)前應(yīng)用]
- adb shell dumpsys activity activities [查看Activity組件信息]
- adb shell dumpsys activity top [查看當(dāng)前界面的UI信息(View Hierarchy)]
- adb shell dumpsys activity services [查看Service組件信息]
- adb shell dumpsys activity providers [查看ContentProvider組件信息]
- adb shell dumpsys activity broadcasts [查看BraodcastReceiver信息]
查看應(yīng)用信息
- adb shell dumpsys meminfo [查看系統(tǒng)進(jìn)程內(nèi)存信息分布情況]
- adb shell dumpsys meminfo &package_name [查看當(dāng)前應(yīng)用內(nèi)存情況]
- adb shell dumpsys package [查看安裝包信息]
- adb shell dumpsys package &package_name [查看當(dāng)前應(yīng)用安裝包信息]
輸出系統(tǒng)崩潰日志
系統(tǒng)應(yīng)用:
- adb shell dumpsys dropbox system_app_crash --print > crash.txt
- adb shell dumpsys dropbox system_app_anr --print > anr.txt
三方應(yīng)用:- adb shell dumpsys dropbox data_app_crash --print > crash.txt
- adb shell dumpsys dropbox data_app_anr --print > anr.txt
五靴拱、am命令(ActivityManager):adb shell am help
參數(shù)包括
- -n表示組件;-a表示動(dòng)作猾普;-d表示傳入的數(shù)據(jù)袜炕;-t表示傳入的類型;--es表示傳入鍵值對(duì)
用法舉例
adb shell am start -a android.intent.action.CALL -d tel:10086 [ 撥打電話]
adb shell am start -n com.android.browser/.BrowserActivity [啟動(dòng)瀏覽器]
adb shell am start -W com.android.browser/.BrowserActivity [統(tǒng)計(jì)啟動(dòng)時(shí)間]
adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com [打開網(wǎng)址]
adb shell am stack list [查看所有activity的堆棧和任務(wù)信息]
六初家、pm命令(PackageManager):adb shell pm help
- adb shell pm list packages [列出所有安裝應(yīng)用的包名]
- adb shell pm clear &package_name [刪除指定應(yīng)用的數(shù)據(jù)]
七偎窘、項(xiàng)目日志使用舉例
查看所有原始下發(fā)語(yǔ)音指令:adb logcat -v threadtime | grep -a -iE "A"
如果覺得還不夠清晰,可以加關(guān)鍵字:
adb logcat -v threadtime | grep -a -iE "A|B"
如果你不知道跳轉(zhuǎn)界面的Activity:adb logcat -b events
過(guò)濾所有的小愛日志:grep -rE "Child_" temp/log.txt
見:“一评架、<sudo>adb常見命令”
獲取進(jìn)程號(hào)的方式
- Android7.0以下:
打印所有進(jìn)程號(hào):adb shell ps
打印指定應(yīng)用進(jìn)程號(hào):adb shell ps | grep -E "&package_name"- Android7.0及以上:
打印所有進(jìn)程號(hào):adb shell ps -A
打印指定應(yīng)用進(jìn)程號(hào):adb shell ps -A | grep -E "&package_name"
日志查看
- 清除所有的緩存日志:adb locat -c 或 adb locat -c all 或 adb logcat -c main events radio system crash
- 查看日志:adb logcat -v threadtime | grep -iE "&TAG1|&TAG2|..."
- 查看日志(window不支持grep,測(cè)試同事用方便):adb logcat -s &TAG1 -s &TAG2
- 查看異常日志:
adb logcat -v threadtime | grep -iE "AndroidRuntime"
adb logcat -v threadtime | grep -iE "FATAL"
adb logcat -v threadtime | grep -iE "Exception"
adb logcat -v threadtime | grep -iE "System.err"
adb logcat -v threadtime | grep -iE "ANR"
adb logcat -v threadtime | grep -iE "crash"- 保存日志:adb logcat -v threadtime > log.txt 或 adb logcat |tee log.txt
- 搜索日志:grep -rE "&TAG1|&TAG2" temp/log.txt > output.txt
- 查看界面跳轉(zhuǎn):adb logcat -b events
查看應(yīng)用內(nèi)存信息
- 查看實(shí)時(shí)內(nèi)存:adb shell dumpsys meminfo &package_name
操作應(yīng)用
- 清除應(yīng)用所有數(shù)據(jù):adb shell pm clear &package_name
- 強(qiáng)制停止應(yīng)用進(jìn)程:adb shell am force-stop &package_name
啟動(dòng)Activity
- 通過(guò)intent啟動(dòng)Activity: