Android常用ADB调试命令汇总

1. 查看是否存在谷歌原生模糊

adb shell getprop ro.surface_flinger.supports_background_blur

2. 跳过开机引导

adb root
 
adb shell settings put secure user_setup_complete 1
 
adb shell settings put global device_provisioned 1
 
adb reboot

3. 查看手机中模糊配置所在位置

/system/build.prop文件 这里主要记录了系统的属性信息
 
 
adb root
 
adb pull system/build.prop .
 
code build.prop

4. 查看CPU信息

adb shell

cat proc/cpuinfo CPU的具体信息就在该文本中

Hardware : MT6833P CPU型号

5. 更改终端标签页名称

输入如下命令: 所打开文件

vim ~/.bashrc

在打开的文件末尾追加上下面代码并保存 所添加的文本

function title() {`` ``if` `[[ -z ``"$ORIG"` `]]; then``  ``ORIG=$PS1`` ``fi`` ``TITLE=``"\[\e]2;$*\a\]"`` ``PS1=${ORIG}${TITLE}``}

重新打开终端,输入title自定义的名称

title L10-code

6. 刷机后跳过登录小米帐号命令

adb root
 
adb shell pm disable com.xiaomi.account

7. 通过命令查看查看机器offset

可以参考文档:Vsync offsethttps://wiki.n.miui.com/display/~xuyingfeng/Vsync+offset

分高刷和低刷。

修改offset,只能通过修改app-phase和sf-phase,通过两者差值来修改offset。
 
前提条件:
需要设置VsyncConfiguration为PhaseOffsets
adb shell setprop debug.sf.use_phase_offsets_as_durations 0 
需要将高通的offset配置给关闭。
adb shell setprop debug.sf.enable_advanced_sf_phase_offset 0 
 
120hz设置offset为0(实际上是高刷都会修改,90,120)
adb shell setprop "debug.sf.high_fps_late_app_phase_offset_ns" 0;
adb shell setprop "debug.sf.high_fps_late_sf_phase_offset_ns" 0;
adb shell stop;adb shell start;
adb shell dumpsys SurfaceFlinger | grep -iE "app phase|app duration|VSYNC period"
 
60hz设置offset为0(默认就是0)(实际上是低刷都会修改,30,60)
adb shell setprop "debug.sf.early_phase_offset_ns" 0;
adb shell setprop "debug.sf.early_app_phase_offset_ns" 0;
adb shell stop;adb shell start;
adb shell dumpsys SurfaceFlinger | grep -iE "app phase|app duration|VSYNC period"

8、快速填充手机内存的方法【小米适用】

https://wiki.n.miui.com/pages/viewpage.action?pageId=357250118

一、快速填充手机内存的方法,步骤如下:

1.将eatmem程序push进手机
adb push eatmem /data/local/tmp
2.修改eatmem执行权限
adb shell chmod 755 /data/local/tmp/eatmem
3.每次吃掉100MB
adb shell /data/local/tmp/eatmem 100 &
4.查看MemAvailable变化
adb shell cat /proc/meminfo | grep MemAvailable

附件:eatmem

二、快速填充手机存储的方法

adb shell fallocate -l 1G /data/test,就会在data下面创建一个1G的test文件

1. 内存信息

1.1 分析应用进程的内存占用情况:

1.1.1 分析应用进程详细内存占用分布情况:

adb shell dumpsys meminfo pid or pkgName

1.1.2 分析应用进程虚拟内存占用情况:

对于32位的应用,虚拟内存占用超过4G时会出现Crash或白屏等稳定性问题。

adb shell showmap pid
 
adb shell pmap -x pid
 
adb shell "cat proc/pid/smaps" //记录着应用进程的全部虚拟内存占用详情
 
adb shell "cat proc/pid/status" VmSize // 表示应用进程占用的虚拟内存总大小

Android系统中32位应用进程的虚拟内存地址空间分布如下图所示

企业微信截图_16680722423976.png

1.1.3 分析进程的kgsl显示内存占用情况:

adb shell cat d/kgsl/proc/4131/mem >launcher_kgsl_mem.txt (其中:gl metrack GPU显示内存,egl metrack Surface显存)

1.1.4 dump应用进程的内存快照(分析Java Heap内存泄漏问题):

adb shell am dumpheap pkgName

然后使用Android SDK提供的相关脚本进行格式转换后,用MAT工具分析抓取到的hprof内存快照文件。

1.1.5 dump应用进程的内存快照(分析Native Heap内存泄漏问题):

1.  adb shell setenforce 0
2.  adb shell chmod 0777 /data/local/tmp
3.  adb shell setprop libc.debug.malloc.program XXX
4.  adb shell setprop libc.debug.malloc.options "backtrace_enable_on_signal leak_track"
5.  adb shell kill -9 pid
6.  adb shell kill -45 pid //enable backtrace
7.  adb shell kill-47 pid //在/data/locat/tmp/目录下会生成名为 backtrace_heap.<pid>.txt
8.  python development/scripts/native_heapdump_viewer.py --verbose --html backtrace_heap.1585.txt --symbols /out/target/product/qssi/symbols >backtrace _heap.html

1.2 分析系统总体内存占用情况:

分析系统总体内存占用情况:

adb shell "cat proc/meminfo"

分析所有进程内存占用分布情况:

adb shell procrank(结果排行是以PSS的大小而排序)

分析所有进程内存占用分布情况且包括进程优先级信息:

adb shell dumpsys meminfo

2. CPU和GPU信息

2.1 查看运行主频信息:

2.1.1 查看CPU主频信息:

查看CPU当前运行主频:

adb shell "cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_cur_freq"

查看CPU可用主频信息:

adb shell "cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_available_frequencies"

查看CPU最高主频:

adb shell "cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq"

查看CPU可用的governor管理策略:

adb shell "cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_available_governors"

查看CPU硬件真实主频:

adb shell "cat /sys/kernel/debug/clk/measure_only_apcs_goldplus_post_acd_clk/clk_measure"

开启CPU perf性能模式

码adb shell "echo performance >/sys/devices/system/cpu/cpufreq/policy0/scaling_governor"
 
adb shell "echo performance >/sys/devices/system/cpu/cpufreq/policy4/scaling_governor"
 
adb shell "echo performance >/sys/devices/system/cpu/cpufreq/policy7/scaling_governor"

查看最近一段时间系统各进程的CPU占用分布情况:

adb shell dumpsys cpuinfo

2.1.2 查看GPU主频信息:

查看GPU当前运行主频:

adb shell "cat /sys/class/kgsl/kgsl-3d0/gpuclk"

查看GPU支持的运行主频:

adb shell "cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies"

查看GPU支持的最高主频:

adb shell "cat /sys/class/kgsl/kgsl-3d0/max_gpuclk"

查看GPU可用的governor管理策略:

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors

开启GPU perf性能模式(通过修改min_pwrlevel值来控制修改GPU的运行主频):

adb shell "echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel"

监测GPU的运行负载和主频信息

adb shell "while true; do sleep 1; cat /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage; cat /sys/class/kgsl/kgsl-3d0/gpuclk; done;"

3. 显示问题

3.1 界面显示异常问题:

查看window信息:

adb shell dumpsys window -a (mFocusedWindow 为焦点窗口)

查看SurfaceFlinger侧的Layer图层信息:

adb shell dumpsys SurfaceFlinger

查看activity堆栈信息:

adb shell dumpsys activity activities (结果中mResumedActivity为栈顶前台Activity)

查看display信息:

adb shell dumpsys display

3.2 显示性能掉帧卡顿问题:

查看应用绘制相关信息:

adb shell dumpsys gfxinfo pkgName

应用界面流畅度评估:

1.  首先确定要测试的包名,到 App 界面准备好操作;
 
2.  执行2-3次 adb shell dumpsys gfxinfo tv.danmaku.bili framestats reset ,这一步的目的是清除历数据;
 
3.  开始操作(比如使用命令行左右滑动,或者自己用手指滑动);
 
4.  操作结束后,执行 adb shell dumpsys gfxinfo tv.danmaku.bili framestats 这时候会有一堆数据输出,我们只需要关注其中的一部分数据即可;
 
5.  重点关注:
 
    Janky frames :超过 Vsync 周期的 Frame,不一定出现卡顿
 
    95th percentile :95% 的值
 
    HISTOGRAM 原始数值
 
    PROFILEDATA :每一帧的详细原始数据

main日志中搜索如下日志:

adb shell logcat -s OpenGLRenderer (搜索关键字Davey,UI线程卡顿超过700ms,谷歌定位为“冻帧”卡顿,就会打印日志)

3.3 屏幕刷新率问题:

获取屏幕刷新率信息(或者开发者选项开启显示屏幕刷新率):

adb shell dumpsys SurfaceFlinger --dispsync

获取游戏应用上帧帧率:

adb shell dumpsys SurfaceFlinger --latency SurfaceView - com.tencent.tmgp.pubgmhd/com.epicgames.ue4.GameActivity#0

4. 应用启动问题

4.1 通用应用启动命令:

测量应用启动时长:

adb shell am start -W -n com.taobao.taobao/com.taobao.tao.TBMainActivity

5. 应用稳定性问题

5.1 Crash崩溃问题:

查看Java crash问题原因:

adb shell logcat -s AndroidRuntime

查看native crash问题原因:

addr2line -e xxx.so addr 根据native crash堆栈日志定位crash源代码具体位置(需要对应的符号表信息)

5.2 ANR卡死问题分析:

获取运行时的trace信息:

adb shell kill -3 pid
 
adb pull data/anr/

查看进程的各个线程的调用堆栈信息 :

adb shell debuggerd -b pid

查看线程的状态的运行状态:

adb shell "ps -A -T pid"

5.3 其它稳定性问题:

一、文件句柄fd泄漏导致的crash:

  1. 查看进程的打开文件的数量的上限:
adb shell "cat proc/pid/limits"
  1. 查看当前已经打开的文件句柄信息:
adb shell
cd proc/pid/fd/

二、监控线程开启数量(开启的线程过多会导致进程内存占用过大而出现OOM Crash):

adb shell "cat /proc/pid/status" (其中Threads 字段表示当前开启的线程数量)

6. ART虚拟机调试机制

一、开启profiler或Jit的日志方法:

adb root
adb shell stop 
adb shell setprop dalvik.vm.extra-opts -verbose:profiler
adb shell start

二、强制编译某个应用为机器码:

码adb shell cmd package compile -m speed -f com.taobao.taobao
adb shell pm compile -r bg-dexopt com.sina.weibo

三、使用profman工具dump查看Jit中profiles生成的热点函数信息文件:

adb shell cmd package dump-profiles com.taobao.taobao 
adb pull data/misc/profman/

四、使用oatdump工具反编译查看oat文件:

adb shell oatdump --boot-image=/apex/com.android.art/javalib/boot.art:/system/framework/boot-framework.art --image=system/framework/arm64/boot-framework.art
 
adb shell oatdump --boot-image=/apex/com.android.art/javalib/boot.art:/system/framework/boot-framework.art --image=system/framework/arm64/boot-framework.art --app-image=/data/app/~~gZqoKJnYCwtZyvy_E7y-kw==/com.ss.android.ugc.aweme-acaqZRCDf8RSUjmXx-TuxQ==/oat/arm64/base.art --app-oat=/data/app/~~gZqoKJnYCwtZyvy_E7y-kw==/com.ss.android.ugc.aweme-acaqZRCDf8RSUjmXx-TuxQ==/oat/arm64/base.odex --header-only >output.txt

7. 应用包信息

查看应用的package信息:

adb shell dumpsys package pkgName (可以查看应用的permission权限申请信息)

打印系统安装的所有第三方包名:

adb shell pm list packages -3

清理应用缓存数据:

adb shell pm clear pkgName

8. input触控事件调试

dump查看系统input机制信息:

adb shell dumpsys input (可以获取EventHub、InputReader、InputDispacher、Global monitors以及当前触控焦点窗口FocusedWindows的信息)

查看屏幕报点情况是否正常:

adb shell "getevent -ltr"

9. 抓取systrace文件

一、查看Systrace支持的TAG:

adb shell atrace --list_categories

二、查看系统trace机制的各种状态信息:

adb shell
 
cd /sys/kernel/debug/tracing

四、抓取atrace文件命令:

开始抓:

adb shell atrace -c -b 32768 --async_start gfx input view webview wm am sm audio video binder_lock binder_driver camera hal res dalvik rs bionic power pm ss database network adb vibrator aidl sched freq idle disk sync -a com.android.systemui

停止:

adb shell atrace -c -b 32768 --async_stop -z gfx input view webview wm am sm audio video binder_lock binder_driver camera hal res dalvik rs bionic power pm ss database network adb vibrator aidl sched freq idle disk sync -a com.android.systemui > atracedump.atrace

10. selinux机制调试

一、动态开关selinux检查机制:

adb shell setenforce 0 //设置成permissive 模式 adb shell setenforce 1 //设置成enforce 模式

二、查看进程的selinux权限组信息:

adb shell "ps -AZ |grep pid"

三、修改selinux权限后,需要单独编译selinux_policy模块替换验证

11. 屏幕点亮速度分析

adb shell "logcat -s PowerManagerService |grep 'Screen on'"

12. 应用安装速度分析

1.  分析apk文件拷贝的IO性能是否慢?
 
    a.IO拷贝前注意使用如下命令释放磁盘缓存:adb shell "echo 3 > /proc/sys/vm/drop_caches";
 
    b.是否存在fuse的影响?
 
    c.安全检测逻辑的影响?
 
    d.磁盘性能是否存在差异,安兔兔测试跑一下存储?确认是否是三星的存储器和WDC存储器的性能差异(重启手机后,运行命令:adb shell "logcat | grep scsi")?
 
    e.通过adb shell logcat -s InstallStaging // 日志查看安装时的I/O拷贝时长。
 
2.  dex2oat安装的cpuset配置和是否存在限频等:adb shell logcat -s dex2oat64
 
3.  查看设备UFS型号信息:adb shell "cat sys/devices/platform/soc/1d84000.ufshc/string_descriptors/product_name"
 
    KLUEG8UHDC-B0E1 SUMSUMG 256G
 
    KLUDG4UHDC-B0E1 SUMSUMG 128G
 
    KLUFG8RHDB-B0E1 SUMSUMG 512G
 
    SDINFDK4-256G SANDISK

13. 系统Cgroup进程资源隔离机制调试

13.1 cpuset控制

一、查看设备上的cpuset场景分组信息,限制进程运行在哪个CPU核心:

adb shell
 
cd dev/cpuset/

二、查看进程的cpuset配置信息:

adb shell "cat proc/pid/status"

14. 打印代码调用堆栈的方法

一、Native的调试调用堆栈打印:

Linux Kernel

dump_stack() 
WARN_ON(x)

Native C++

#include "utils/CallStack.h"
android::CallStack cs(“haha”);

Android.bp中加入:

shared_libs [
....
"libutilscallstack",
....
]

Native C

extern "C" void dumping_callstack(void);
 
void dumping_callstack(void) {
   android::CallStack cs("Jamie");
}

二、Java调用堆栈打印:

android.os.Debug.getCallers(n)

15. Power电源相关调试

去除电池挂载

adb shell dumpsys battery unplug

查看电源信息以及系统电源锁持锁状况:

adb shell dumpsys power

16.开机速度慢问题分析

一、bootchart的使用

a.生成数据文件和Log
 
1.adb shell touch /data/bootchart/enabled
 
2.adb shell "echo 120 > /data/bootchart/start"
 
3.adb reboot
 
b.压缩、导出:
 
1. adb shell
 
2.cd /data/bootchart/
 
3.tar -zcf boochart.tgz *
 
4.adb pull xxx xxx
 
5.exit
 
c.生成图表:
 
java -jar bootchart.jar bootchart.taz

二、日志测量开机速度的方式:

adb shell "logcat -b events |grep -iE 'boot_progress|sf_stop|wm_boot'"

17. 抓取bugreport日志

一、使用如下命令抓取bugreport日志(包含各类dumpsys信息、内存信息、各类日志信息等,还可用于分析功耗问题):

adb shell bugreportz -p

二、使用chkbugreport工具jar包工具将日志转化为可视化网页:

java -jar chkbugreport.jar xxxx.txt

其它

一、使用adb跑整机monkey命令:

adb shell monkey --throttle 500 --ignore-timeouts --ignore-crashes --ignore-native-crashes --ignore-security-exceptions --pct-syskeys 10 --pct-touch 45 --pct-motion 25 --pct-appswitch 20 -c android.intent.category.LAUNCHER -c android.intent.category.MONKEY -c android.intent.category.DEFAULT -v -v 500000

二、设备解锁刷fastboot方法:

1.  开机进入开发者选项,使能OEM锁;
2.  adb reboot bootloader
3.  fastboot flashing unlock 音量下键 选择 UNLOCK选项,机器恢复
4.  解锁成功,然后刷版本就可以了手机正常启动;
5.  进入fastboot模式:adb reboot bootloader
6.  查看是否有设备:fastboot devices
7.  erase 擦除:fastboot erase dtbo
8.  刷入img:fastboot flash dtbo dtbo.img
9.  重启:fastboot reboot

三、adb查看settings数据库各个字段值的命令:

adb shell settings list global/system
 
adb shell settings put global/system xxx value
 
adb shell settings get global/system xxx

四、设备恢复出厂设置:

adb reboot recovery