又被Android的Log输出气到吐血身亡了!!!

139 阅读2分钟

常在河边走,哪有不湿鞋!常在Android开发,哪有不遇到奇怪Bug的,但是这Bug也太奇葩了吧,都不知道什么原因,真是气死人不偿命!

事情是怎么回事呢?我有一个类叫IMSDroid,进行了一些Log输出:

public class IMSDroid extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("IMSDroid", "onCreate");
    }

}

当然了,我真实开发中打印的是一些更有用的信息,但是死活看不到Log呀,以为是程序哪里出了问题,怎么看也没问题的,于是用Toast进行显示:

public class IMSDroid extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("IMSDroid", "onCreate");
        Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
    }

}

发现Toast能显示出来,说明onCreate方法是执行了的,为什么Log不显示呢?但我在MainActivity类中打印的Log是有显示的,依稀记得以前也有在Application类中打印过Log是可以显示的,为什么这次就不行了呢?找了许久的原因,后来想到既然在Activity中可以打印,那就把那行Log复制到Activity中试试吧:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.e("MainActivity", "onCreate")
        Log.i("IMSDroid", "onCreate")
    }

}

终于有答案了,就是TAG出了问题,不能使用“IMSdroid”做为TAG,如果用它做TAG就会看不到输出,后来我再经过多翻折腾,发现了其实是不能使用“IMS”这3个字符开头作为TAG,我是怎么验证的呢,我们知道ASCII码共有127个,那就一个个试吧,代码如下:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.e("MainActivity", "----------------------------------")
        (0 .. 127).forEach {
            val str = "IMS${it.toChar()}"
            Log.i(str, str)
        }
        Log.e("MainActivity", "----------------------------------")
    }

这时,你只会看到输出了两条横线,这说明了以“IMS”打头的Log都没法输出。只要不是“IMS”打头就可以,把上面代码中的关键一行调一下字符串的拼接顺序:

val str = "${it.toChar()}IMS"

这时再运行,就能看到127行的Log输出了。

这是android系统的Bug无疑了,为什么我这么倒霉让我遇到了,浪费我好多宝贵的青春年华,知道了这个对我的技术又没什么提升,实属纯倒霉!!