当标签以“IMS"开头时,为什么Logcat不打印日志?
一、 问题描述
为什么Logcat以IMS"开头时Logcat不打印日志?
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOne:
System.out.println("Button One log by sout");
Log.e("IMSfsadfasdfasdf", "log by Log.e()");
break;
case R.id.btnTwo:
System.out.println("Button Two log by sout");
Log.e("MService", "log by Log.e()");
break;
}
}
日志:
04-07 15:05:48.838 4363-4363/com.licheedev.myapplication I/System.out:
Button One log by sout 04-07 15:05:49.916
4363-4363/com.licheedev.myapplication I/System.out: Button Two log by
sout 04-07 15:05:49.916 4363-4363/com.licheedev.myapplication
E/MService: log by Log.e() 04-07 15:05:54.109
4363-4363/com.licheedev.myapplication I/System.out: Button Two log by
sout 04-07 15:05:54.109 4363-4363/com.licheedev.myapplication
E/MService: log by Log.e() 04-07 15:05:54.822
4363-4363/com.licheedev.myapplication I/System.out: Button One log by
sout 04-07 15:05:55.638 4363-4363/com.licheedev.myapplication
I/System.out: Button One log by sout
二、分析
Android 的日志机制中的这行代码有关.这是在函数 __android_log_write(prio, tag, buf);
/* XXX: This needs to go! */
if (!strcmp(tag, "HTC_RIL") ||
!strncmp(tag, "RIL", 3) || /* Any log tag with "RIL" as the prefix */
!strncmp(tag, "IMS", 3) || /* Any log tag with "IMS" as the prefix */
!strcmp(tag, "AT") ||
!strcmp(tag, "GSM") ||
!strcmp(tag, "STK") ||
!strcmp(tag, "CDMA") ||
!strcmp(tag, "PHONE") ||
!strcmp(tag, "SMS")) {
log_id = LOG_ID_RADIO;
// Inform third party apps/ril/radio.. to use Rlog or RLOG
snprintf(tmp_tag, sizeof(tmp_tag), "use-Rlog/RLOG-%s", tag);
tag = tmp_tag;
}
函数判断了传入参数的合法合理性,进行处理后,将参数打包传递给结构体iovec,同时将bugID,以及打包好的iovec作为参数传递给write_to_log。
要稍微注意下,如果tag包含HTC_RIL, RIL, IMS, AT, GSM, STK, CDMA, PHONE, SMS, (这些都是涉及到radio),就将bugID设置为LOG_ID_RADIO。将不同的类型归属到不同的缓冲区中。
三、解决办法:
方法一:
app中更改打印log的TAG,避免这些字符:HTC_RIL, RIL, IMS, AT, GSM, STK, CDMA, PHONE, SMS
方法二:
使用radio log可以看到对应的log:
抓取Android RIL层 log,在调试Android通信方面的代码时,这个Log非常关键。抓取命令如下:
adb logcat -b radio >e://radio.log
3689

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



