问题描述:
最近,调试一个程序,差点儿被一个简单的Logcat日志蒙蔽了双眼。
过程是这样的:在代码中,用Log.i(TAG, msg)来输出msg的信息。输出的结果却只输出了前面一部分,后面的字符没有输出来。
代码如下:
Log.i(TAG,"[log output]=========len:" + msg.length());
Log.i(TAG,"[log output]=========data:");
Log.i(TAG,msg);
输出结果如下:
[log output]=========len:5400
[log output]=========data:
第三行:1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz
......
1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvw//第三行输出了4065个字符
原来是因为对msg的读写长度有限制,对于这个限制,源码是这样定义的:
在system/core/include/cutils/logger.h头文件中,有:
#define LOGGER_ENTRY_MAX_PAYLOAD 4076 /* * The maximum size of a log entry which can be read from the * kernel logger driver. An attempt to read less than this amount * may result in read() returning EINVAL. */ #define LOGGER_ENTRY_MAX_LEN (5*1024)
而在logcat.cpp中,有
static void readLogLines(log_device_t* devices)
函数的定义:
static void readLogLines(log_device_t* devices)
{
......
while (1) {
......
/* NOTE: driver guarantees we read exactly one full entry */
ret = read(dev->fd, entry->buf, LOGGER_ENTRY_MAX_LEN);
}
......
}
用递归方式实现msg的输出:
那么,为了正确输出全部的msg,就封装了一个Logcat工具类,用递归方式实现msg的输出。
我们设定每行最多输出1024*3长度的字符。
代码如下:
//LogUtil.java
private final static int LogUtilMaxLen = 1024*3;
public static void printMsg(String msg) {
if (TextUtils.isEmpty(msg)) {
return;
}
if (msg.length()<=LogUtilMaxLen) {
Log.i(TAG,msg);
return;
}
String subStr = msg.substring(0,LogUtilMaxLen);
Log.i(TAG,subStr);
String nextStr = msg.substring(LogUtilMaxLen);
//递归调用
printMsg(nextStr);
}
printMsg就是递归函数。
272



被折叠的 条评论
为什么被折叠?



