赞
踩
博主在使用多次Android Studio后,总会出现一个问题:在Android Studio中不停重新构建项目代码并运行APP,Logcat中始终没法发现可调试的APP或者不能正常打印日志。而这会导致在APP开发时无法实时查看Logcat,从而定位APP开发过程中的问题,其中No debuggable processes的问题体现截图如下:
又或者,虽然Logcat中能识别到可调试的APP,但是我们在测试这个APP时,明知测试过程中会生成大量的日志信息,但是Logcat中并未生成任何日志信息,该问题截图如下:
出现这个问题主要有两个原因:
logcat: Unexpected EOF!
的问题,因此我们应该扩大Logcat工具的环形缓冲区空间大小;有时你能看到Logcat生成下述的错误信息:
logcat: Unexpected EOF!
This means that either the device shut down, logd crashed, or this instance of logcat was unable to read log messages as quickly as they were being produced.
If you have enabled significant logging, look into using the -G option to increase log buffer sizes.
logcat:异常的EOF(文件读写到结尾)!
这意味着要么是设备断开了与电脑的连接,要么是Logd崩溃了,要么是这个Logcat实例无法及时读取过快过多生成的日志消息。
如果您已经启用了重要的日志记录功能,请考虑使用-G选项来增加日志缓冲区的大小。
对于此问题有点类似消费者/生产者模型,输出的日志有点像生产者由于没有节制没有规划,导致量大于求,生产过多导致仓库爆单,工厂生产无法正常进行了。而这里的日志缓冲区就是消费者,由于消费者数量有限无法完全消费完生产者生产的产品从而导致整套模型无法正常地运作了。此时就需要扩大内需将消费者扩大。
当我们调试的APP生成的日志过多,或者我们没有对Logcat指定“仅打印选中的进程生成的日志”等过滤条件,那么Logcat会在几秒内打印大量的日志,你甚至会发现当打印的日志到达一定上限时,新打印的日志在生成的同时,最老的日志会依次被删除掉。你可以将Logcat的滑动条拖到最底部并点击Logcat任意一行日志来验证这个问题,你会发现下述截图中蓝色框框中显示的数字分别是光标所在日志的第9976行的第1列,接着你仔细观察这个行数,如果这个行数一直在变大则说明目前生成的日志信息没有达到阈值,如果这个行数开始变小则说明目前生成的日志信息达到阈值了,因为存储不完这么多日志信息,Logcat开始从老到新的时间顺序来删除老的日志,以腾出空间给新的日志:
你可以在Android Studio-Preferences-Editor-General-Console
中看到Override console cycle buffer size(1024kb)
这个勾选框,如果你从来没有修改过这个属性的值,那么就说明你的Android Studio的Logcat的环形缓冲区大小为默认的1024KB,如上述截图所示,大小为1024KB的环形缓冲区的Logcat最多能缓存和显示10000行左右的日志信息,如果新生成的日志超过了这个数量,Logcat会从老到新的时间顺序来删除老的日志。
因此我们可以为Logcat环形缓冲区配置更大的空间,例如博主为环形缓冲区分配了999999KB
的空间,当然分配更大的空间可能导致Android Studio的性能下降,因此大家自行斟酌:
在修改完上述的Logcat环形缓冲区的大小后,我们必须彻底重启Android Studio,因为Logcat环形缓冲区的大小的数值是在Android Studio启动时配置的,不支持运行时热修改,因此我们要彻底重启Android Studio让该配置生效。接着我们可以看到,重启后的Android Studio能显示超多行数的Logcat日志,例如下述截图中Logcat能展示323442行日志,这便是我们预期的效果:
其中咱们还能参考到其他相关的文章,例如《修改 Android Studio 的 Logcat 缓冲区大小》文章会告知我们可以修改Android Studio的安装目录\bin\idea.properties文件
中idea.cycle.buffer.size
属性的数值来配置缓冲区的大小:
博主用的Android Studio的版本号为Android Studio Arctic Fox | 2020.3.1 Patch 2
,用该版本的Android Studio自测这个idea.cycle.buffer.size
属性,无论数值改大改小,即使重启Android Studio,idea.cycle.buffer.size
属性配置的数值都无法生效,因此我建议你直接通过配置Android Studio的Override console cycle buffer size(1024kb)
属性来指定Logcat环形缓冲区的大小。
有什么方法能查询我们安卓测试设备的Log日志环形缓冲区的大小呢?目前有下述两种方法:
首先,我们可以在安卓测试设备的开发者模式中查询和配置其的Log日志环形缓冲区的大小:
果不其然,在上述截图中我们可以发现,没有显式配置过Log日志环形缓冲区大小的测试机的默认大小为64KB,正是这个问题导致安卓测试设备不能够存储更久远的日志信息。
adb logcat -g
命令其次,我们可以用adb logcat -g
命令查询当前安卓测试设备的Log日志环形缓冲区的大小:
bogon:test-android-app lijunde$ adb logcat -g
main: ring buffer is 64 KiB (60 KiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 64 KiB (61 KiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 64 KiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 64 KiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
通过上述输出的信息,我们了解到这部安卓测试设备的main、system、crash和kernel环形缓冲区的大小都是64KB,这辅证了我们在开发者模式中查询测试机的Log日志环形缓冲区大小。其中,关于main、system、crash和kernel环形缓冲区的含义和区别可参考文章《Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性-[Android取经之路]》。
要解决这个问题,我们需要配置更大空间的Log日志环形缓冲区。
其中最简单的解决方案便是在开发者模式中配置安卓测试设备的Log日志环形缓冲区的大小:
其次也可以通过shell命令setprop ro.logd.size 16M
来配置测试机的Log日志环形缓冲区的大小,但这种方案需要你的测试机已经解锁BootLoader并Root,否则执行上述命令是被告知命令执行失败的:
bogon:test-android-app lijunde$ adb shell
o1q:/ $ setprop ro.logd.size 16M
Failed to set property 'ro.logd.size' to '16M'.
See dmesg for error reason.
接着在Terminal中运行adb kill-server
命令杀死ADB进程,这个命令间接等价于重启Logcat:
接着就能正常地选择可调试的应用并显示该应用所有的Log日志了:
在Logcat中取消指定“仅打印选中的进程生成的日志”等过滤条件,即查询该安卓设备所有APP的日志信息,再在这些日志中搜索关键词FATAL
即可查询崩溃日志的代码调用栈了,其中也可搜索要查询日志的APP的包名
来定位该APP相关的日志。
在这些日志中搜索关键词FATAL
即可查询崩溃日志的代码调用栈了,其中也可搜索要查询日志的APP的包名
来定位该APP相关的日志。
在Android Studio的终端中执行下述命令:
#命令Android Studio的Logcat工具开始监听当前设备的日志,并同步日志到指定路径下的文件中
adb logcat > ~/Downloads/logs.txt
#命令Android Studio的Logcat工具停止监听当前设备的日志
同时按住Mac电脑的Control键和C键终止Logcat继续同步日志
在Android Studio的终端中执行下述命令:
#清除当前设备存储的所有历史日志
adb logcat -c
#命令Android Studio的Logcat工具开始监听当前设备的日志,并同步日志到指定路径下的文件中
adb logcat > ~/Downloads/logs.txt
#命令Android Studio的Logcat工具停止监听当前设备的日志
同时按住Mac电脑的Control键和C键终止Logcat继续同步日志
本文参考文献:
[1]Can’t attach Android Studio’s debugger to Android process
[2]解决Android logcat: Unexpected EOF!方法指南
[3]简书-Android Studio 修改logcat缓存大小
[4]修改 Android Studio 的 Logcat 缓冲区大小
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。