高级调试技巧之adb常见命令

概述

  ADB,即Android Debug Bridge,就是通过命令查看我们需要的信息,比如手机ROM配置信息,日志等等,是开发和测试工程师必备的技能之一。

常见命令

一、<sudo>adb常见命令: sudo超级权限模式

  • adb --help

adb devices 设备连接状态

adb pull <remote> <local> 将设备存储器的文件拷贝出来,例如:
adb pull /sdcard/Android/data/&package_name/files/MIUI/debug_log/&package_name temp/

adb push <local> <remote> 将文件拷贝到设备指定目录, 与adb pull相反

adb install [-lrtsdg] <file> 安装应用
(-r: replace existing application)
(-d: allow version code downgrade)
(-g: grant all runtime permissions)

adb uninstall <package> 卸载应用

adb start-server 开始adb服务
adb kill-server 杀掉adb服务

adb reboot 重启设备

adb root 获取root权限
adb remount 将/system, /vendor (if present) and /oem (if present)置为可写模式,前提是先root
注:remount后的设备,可以直接安装apk,不受版本号限制,adb push out/NaviLauncher00/Launcher.apk system/app

二、日志过滤

  1. adb logcat抓取日志: adb logcat --help
    用法: logcat [options] [filterspecs]

options包括:

  • -s 过滤TAG
  • -f 输出日志到到手机的sd卡
  • -v 设置日志消息的输出格式
     brief — 显示优先级/标记和原始进程的PID (默认格式)
     process — 仅显示进程PID
     tag — 仅显示优先级/标记
     thread — 显示优先级/标记,消息线程的PID和TID
     raw — 显示原始的日志信息,没有其他的元数据字段
     time — 显示日期,调用时间,优先级/标记,PID
     threadtime — 显示日期,调用时间,优先级/标记以及发出消息的线程的PID和TID
     long — 显示所有的元数据字段并且用空行分隔消息内容
  • -c 清除缓存区的日志,Clear (flush) the entire log and exit
  • -b 查看日志消息的缓冲区, 包括'main','system', 'radio', 'events', 'crash', 'default' or 'all'
  • --pid=<pid> 打印指定进程的日志

filterspecs格式:

  • <tag>[:priority]:不指定的话,默认就是所有级别的所有日志
  • 日志的优先级,从低到高:
    V — Verbose (lowest priority, 冗长的) 对应于Log.v(tag)系列函数
    D — Debug (调试用) 对应于Log.d()系列函数
    I — Info(线上用) 对应于Log.i()系列函数
    W — Warning(警告日志) 对应于Log.w()系列函数
    E — Error (发生错误) 对应于Log.e()系列函数
    F — Fatal (What a Terrible Failure,引起程序崩溃)对应于Log.wtf()系列函数
    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 [清除缓存区所有类型的日志]
  • adb logcat -c main crash [清除缓存区main和crash类型的日志]
  • adb logcat -b radio [查看包含无线装置/电话相关消息的缓冲区日志]
  • adb logcat --pid="2661" [打印进程号是2661的日志]
  • adb logcat -f /sdcard/log.txt [保存日志到手机的log.txt文件]
  • adb logcat -s ActivityManager:I WindowManager:W [输出TAG为"ActivityManager"并且优先级大于等于"Info"和TAG为"WindowManager"并且优先级大于等于"Warn"的日志]
  1. grep命令,用于过滤/搜索的特定字符: grep --help
    用法: grep [选项]... PATTERN [FILE]...
    在每个 FILE 或是标准输入中查找 PATTERN。

选项包括:

  • -E 指定字符串做为查找文件内容的样式,一个可扩展的正则表达式;
  • -r 指定要查找的目录或文件(默认当前目录);
  • -i 忽略字符大小写;
  • -n 输出的同时打印行号;
  • -a 等同于 --binary-files=text, 有二进制输出时,不中断打印

用法举例

  • adb logcat -v threadtime | grep -inE "ActivityManager|WindowManager" [打印包含ActivityManager和WindowManager关键字的日志,关键字不区分大小写,显示日志所在行数]
  • grep -rE "Child_" temp/log.txt [过滤电脑temp/log.txt文件中包含“Child_”关键字的日志并显示在终端]
  • grep -rE "ActivityManager|WindowManager" temp/log.txt > output.text [过滤ActivityManager和WindowManager关键字的日志,并输出到当前目录output.text文件中]
  1. 过滤进程$pid的日志

获取应用进程号见:“八、工作中高频使用命令总结”

用法举例:

  • adb logcat --pid="$pid"
  • adb logcat -v threadtime | grep -E "$pid"

三、系统属性的获取和修改

获取系统属性

  • adb shell getprop [获取Android系统所有的配置信息,包括各种版本号,内存分配大小,手机型号等等]
  • adb shell getprop >temp/prop.txt [获取所有配置信息并保存到本地文件]
  • adb shell getprop | grep "dalvik.vm.heapgrowthlimit" [获取内存分配的配置]
  • adb pull /system/build.prop temp/prop.txt [拷贝编译配置文件,getprop包括build.prop信息]

修改系统属性,前提是这些配置是可写的:adb shell setprop [key] [value]

  • adb shell setprop dalvik.vm.heapgrowthlimit 512m [将分配内存修改为512MB]

修改日志等级,前提是配置文件可写:adb shell setprop log.tag.YOUR_LOG_TAG [LEVEL]
作用:比如你的TAG只能打印INFO等级的日志,DEBUG不打印无法分析问题,怎么办?修改等级,包括系统类,比如ActivityManager等等,也可以修改,方便分析问题。

  • adb shell setprop log.tag.EngineBridge DEBUG [将TAG为EngineBridge的日志打印级别改为DEBUG]

四、dumpsys命令

查看所有系统服务信息

  • adb shell dumpsys

查看ActvityManagerService的信息

  • adb shell dumpsys activity [查看ActvityManagerService所有信息]
  • adb shell dumpsys activity package &package_name [查看当前应用]
  • adb shell dumpsys activity activities [查看Activity组件信息]
  • adb shell dumpsys activity top [查看当前界面的UI信息(View Hierarchy)]
  • adb shell dumpsys activity services [查看Service组件信息]
  • adb shell dumpsys activity providers [查看ContentProvider组件信息]
  • adb shell dumpsys activity broadcasts [查看BraodcastReceiver信息]

查看应用信息

  • adb shell dumpsys meminfo [查看系统进程内存信息分布情况]
  • adb shell dumpsys meminfo &package_name [查看当前应用内存情况]
  • adb shell dumpsys package [查看安装包信息]
  • adb shell dumpsys package &package_name [查看当前应用安装包信息]

输出系统崩溃日志
系统应用:

  • adb shell dumpsys dropbox system_app_crash --print > crash.txt
  • adb shell dumpsys dropbox system_app_anr --print > anr.txt
    三方应用:
  • 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

参数包括

  • -n表示组件;-a表示动作;-d表示传入的数据;-t表示传入的类型;--es表示传入键值对

用法举例

  • adb shell am start -a android.intent.action.CALL -d tel:10086 [ 拨打电话]

  • adb shell am start -n com.android.browser/.BrowserActivity [启动浏览器]

  • adb shell am start -W com.android.browser/.BrowserActivity [统计启动时间]

  • adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com [打开网址]

  • adb shell am stack list [查看所有activity的堆栈和任务信息]

六、pm命令(PackageManager):adb shell pm help

  • adb shell pm list packages [列出所有安装应用的包名]
  • adb shell pm clear &package_name [删除指定应用的数据]

七、项目日志使用举例

查看所有原始下发语音指令:adb logcat -v threadtime | grep -a -iE "A"
如果觉得还不够清晰,可以加关键字:
adb logcat -v threadtime | grep -a -iE "A|B"

如果你不知道跳转界面的Activity:adb logcat -b events

过滤所有的小爱日志:grep -rE "Child_" temp/log.txt

\color{red}{八、工作中高频使用命令总结}

见:“一、<sudo>adb常见命令”

获取进程号的方式

  • Android7.0以下:
    打印所有进程号:adb shell ps
    打印指定应用进程号:adb shell ps | grep -E "&package_name"
  • Android7.0及以上:
    打印所有进程号:adb shell ps -A
    打印指定应用进程号: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,测试同事用方便):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
  • 查看界面跳转:adb logcat -b events

查看应用内存信息

  • 查看实时内存:adb shell dumpsys meminfo &package_name

操作应用

  • 清除应用所有数据:adb shell pm clear &package_name
  • 强制停止应用进程:adb shell am force-stop &package_name

启动Activity

  • 通过intent启动Activity:
  1. 先root获取权限: adb root
  2. adb shell 'am start "intent://baidu.com#Intent;scheme=https;component=com.android.brower/com.android.brower.WebActivity;S.statusBarTextBlack=true;S.fullScreen=true;S.webFullScreen=true;S.navigationBarColor=%2301000000;B.webviewPaddingForPad=false;end"'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 ...
    指尖劃過諾言阅读 824评论 0 1
  • pull 到电脑的当前路径下 push 到安卓系统文件路径 查看sdcard剩余存储空间 检查文件系统的磁盘空间占...
    Amano阅读 13,936评论 1 6
  • 1、日志相关: adb logcat //显示全部日志 adb logcat > c:\test.log //...
    学习不断阅读 59,045评论 0 11
  • 1、adb 简介 Android Debug Brige 安卓调试桥 2、安装 1)Windows: 1、按照...
    Jane_cd88阅读 1,163评论 1 1
  • 简介 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 A...
    是立品啊阅读 253评论 0 0