赞
踩
adb会一些简单使用,但是有些用的还不合适,比如我经常用adb logcat加上grep来过滤,但是对于查看某个程序的所有日志信息却不甚了解。这里整理下我常用的adb命令,以后新学习的有关内容更新到此博客。
命令:
adb devices
一般输出格式为:
- List of devices attached
- AKC7N18407000033 device
-
- adb server version (39) doesn't match this client (40); killing...
- * daemon started successfully
这就说明设备准备就绪了。
命令:
adb shell ps
输出一般如下:
- USER PID PPID VSZ RSS WCHAN ADDR S NAME
- root 1 0 36148 2728 0 0 S init
- root 2 0 0 0 0 0 S [kthreadd]
- root 3 2 0 0 0 0 S [ksoftirqd/0]
- root 5 2 0 0 0 0 S [kworker/0:0H]
- root 7 2 0 0 0 0 S [rcu_preempt]
- root 8 2 0 0 0 0 S [rcu_sched]
- root 9 2 0 0 0 0 S [rcu_bh]
第一排就是用户,有root,logd,system,bluetooth,media,secure_element,audioserver,nfc,wifi,cameraserver,graphics,drm,incidentd等,还有很多就不罗列了。
第二排是进程ID就是PID,第三排是父进程ID也就是PPID。
第四排是虚拟内存大小,VSZ就是Virtual Set Size,这个用处不大,很少用于判断进程实际内存使用量。
第五排就是RSS,也就是Resident Set Size,表示实际驻留在内存中的内存大小,用处也不大。这里没有展示另一个USS也就是Unique Set Size的值,它表示了进程独自占用的物理内存大小,能准确反映一个进程的实际内存占用。这是题外话,这里不深究。
命令:
adb logcat
这样就会让手机日志不断刷新到终端窗口,对于我测试用的华为P20Pro手机,它的日志输出特别多,每秒几十上百的日志输出,很容易将你想要调试的程序日志冲没了。形式如下:
- 07-15 10:11:13.210 1218 1634 D HwArpVerifier: performPollAndLog:
- 07-15 10:11:13.218 1218 1634 D hw_netstat: total/112/80,android.uid.system:1000/80/80,unknown:0/32/0
- 07-15 10:11:13.364 1707 1707 I Net.216115NetworkSpeedM: mIsStop = false
- 07-15 10:11:13.364 1707 1884 I Net.216116NetworkSpeedM: runInThread getTetherStats
- 07-15 10:11:13.369 1707 1707 I Net.216116NetworkSpeedM: runInUI refreshSpeed
- 07-15 10:11:13.370 1707 1707 I Net.216116NetworkSpeedM: value=10.666667speed = 11
- 07-15 10:11:13.370 1707 1707 I Net.216116NetworkSpeedM: B/smIsShowLastSpeedValuefalse
- 07-15 10:11:13.370 1707 1707 I NetworkSpeedView: /update(), speed=11
- 07-15 10:11:13.370 1707 1707 I NetworkSpeedView: B/s
- 07-15 10:11:13.372 1707 1707 I chatty : uid=10032(com.huawei.desktop.systemui) com.android.systemui identical 1 line
- 07-15 10:11:13.372 1707 1707 I NetworkSpeedView: /update(), speed=11
- 07-15 10:11:13.372 1707 1707 I NetworkSpeedView: B/s
- 07-15 10:11:13.389 1707 1707 W HwKeyguardDragHelper: AnimationBlocked
- 07-15 10:11:13.424 29538 29880 I ctaifs : <华为手机助手>[华为手机助手][com.huawei.hisuite]:[SurfaceControl.screenshot] 后台截屏
- 07-15 10:11:13.428 596 596 I GRALLOC : getCallingPid=648, shrFd=31,fmt=0x1,intFmt=0x1,btStrd=4352,size=9748480,pid=596
- 07-15 10:11:13.428 596 596 I GRALLOC : yuv=2,w=1080,h=2240,Stride u=0 v=0,offset u=0 v=0
- 07-15 10:11:13.428 596 596 I GRALLOC : iova_size=9748480,conUsg=0x306,proUsg=0x366, strd=1088,[afbc]HdrStrd=0 PyldStrd=0 Scrmbl=0,ionhnd = 1
- 07-15 10:11:13.432 648 648 D Layer : Skip in Layer::computeScreenBounds 1
- 07-15 10:11:13.435 648 648 I chatty : uid=1000(system) /system/bin/surfaceflinger identical 6 lines
- 07-15 10:11:13.435 648 648 D Layer : Skip in Layer::computeScreenBounds 1
- 07-15 10:11:13.435 648 648 W SurfaceFlinger: FloatTasksLayerIsVisible[0], SecureScreenShotLayerIsVisible[0], RoundCornerDisplayLayerIsVisible[1]
- 07-15 10:11:13.435 648 648 D SurfaceFlinger: not ScreenShot for this layer
- 07-15 10:11:13.436 648 648 W SurfaceFlinger: FloatTasksLayerIsVisible[0], SecureScreenShotLayerIsVisible[0], RoundCornerDisplayLayerIsVisible[1]
- 07-15 10:11:13.436 648 648 D SurfaceFlinger: not ScreenShot for this layer
- 07-15 10:11:13.584 1707 1707 D StatusBarIconController: setIconVisibility icon is null or visibility not change visibility=false
- 07-15 10:11:13.584 1707 1707 E ndroid.systemu: Invalid ID 0x00000000.
- 07-15 10:11:13.585 1707 1707 E HwNotchUtils: setIconForView iconId is not found
- 07-15 10:11:13.585 1707 1707 D StatusBarIconController: setIconVisibility icon is null or visibility not change visibility=false
- 07-15 10:11:13.585 1707 1707 E ndroid.systemu: Invalid ID 0x00000000.
- 07-15 10:11:13.585 1707 1707 E HwNotchUtils: setIconForView iconId is not found
- 07-15 10:11:13.585 1707 1707 D StatusBarIconController: setIconVisibility icon is null or visibility not change visibility=false
- 07-15 10:11:13.585 1707 1707 E ndroid.systemu: Invalid ID 0x00000000.
- 07-15 10:11:13.585 1707 1707 E HwNotchUtils: setIconForView iconId is not found
- 07-15 10:11:13.769 1869 2013 D HwWifiStatStore: handleMessage : 200
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
07-15是日期,紧接着是时间,第三排是进程ID,也就是PID。第四排我尝试按照父进程PID来理解的,但是好像用ps命令也没看到对应的线程,也有可能是运行一下立即结束了,不过感觉这是输出日志的常驻进程,应该不会运行就停止,再继续启动和停止,这里同样不深究(后来发现应该是线程ID,也就是TID)。
接着的I、W、D、E等就是日志级别了,这个是后续使用中要重点关注的。
adb logcat会将手机上的日志都输出,如果有新的日志产生,就在当前窗口自动更新。有时候日志数量特别大,比如Unity中写在Update方法中的日志,会导致卡住。因此在调试输出自己的日志之前可以先进行清空:
adb logcat -c
命令:
adb logcat > D:/log.log
我这里是Windows平台,用的Mobaxterm而不是系统自带的cmd或者powershell,指定路径的时候用斜杠可以,反斜杠则不行。该命令等几秒钟写入文件,手动ctrl+c结束它,不然它就一直刷。
对于某些需要详细分析的日志,可以导出到日志文件中。
我常用Unity开发,它的日志会包含Unity字样,所以我一般这么查:
adb logcat | grep -i unity
这里grep查找字符串,参数i表示ignore,区分大小写的意思。
前面也提到了日志级别,从低到高就是:
V:verbose,详细模式;
D:debug,调试信息;
I:info,信息级别;
W:warning,经过级别;
E:error,错误级别;
F:fatal,严重错误;
S:silent,无加载。
查看Error及以上级别的信息如下:
adb logcat *:E
前面的字符串查找方式,感觉有时候可能会少几条信息。根据pid过滤可能就比较全,可以把grep中的字符串就替换成ps命令中查找的pid来过滤日志。二者基本一样,这里就不用贴命令了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。