adb调试技巧

概述

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

adb安装

  1. Linux上安装adb

  2. Windows上安装adb

  3. Mac上安装adb

adb入门命令

adb详细语法查看

  • 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 install [-lrtsdg] <file> -l:锁定该应用程序 -r:替换已存在的应用,也就是说强制安装 -t:允许安装测试包 -s:把应用程序安装到sd卡上 -d:允许安装低版本的应用 -g:为应用程序授予所有运行时的权限 卸载应用

  • adb uninstall <package> 开始adb服务

  • adb start-server 杀掉adb服务

  • adb kill-server 重启设备

  • adb reboot 获取root权限

  • adb 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抓取日志 1.1 logcat详细语法查看

  • adb logcat --help 1.2 用法

  • logcat [options] [filterspecs] 1.3 详细说明 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命令,用于过滤/搜索的特定字符 2.1 grep详细语法查看

  • grep --help 2.2 用法

  • grep [选项]... PATTERN [FILE]...,在每个 FILE 或是标准输入中查找 PATTERN 2.3 详细说明 选项包括

  • -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的日志 获取进程号的方式

  • 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 shell "ps | grep $pg_name")

    用法举例

  • 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) am详细语法查看

  • 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)

pm详细语法查看

  • adb shell pm help 用法举例

  • adb shell pm list packages [列出所有安装应用的包名]

  • adb shell pm clear &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

  • (从Bugreport)过滤应用的所有日志:grep -rE "VA" temp/log.txt 注:小爱所有日志的TAG都会添加前缀“VA” Activity跳转查看

  • 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 先root获取权限:adb root 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"' 进入到fastboot界面

  • adb reboot fastboot 进入到引导安装界面

  • adb reboot bootloader

dump pcm数据方法

dump pcm数据是音频工程师常用的debug手段,我理解的是 音频数据流在传递的过程中是不是在任何一个节点都可以dump出来 进行分析

注意:AP侧解码或者第三方音乐播放器解码后通过audiotrack 写数据 如果啊udiotrack这个节点的raw data有杂音 音量异常

framework

FILE *fp1 = fopen("/data/audio_spk.pcm", "a+");
if (fp1) {
     int flen = fwrite((char *)buffer, 1, bytes, fp1);
     fclose(fp1);
}
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值