Android打印日志:Rlog和敏感信息的处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/diangangqin/article/details/96168313

软件工程师每天最主要的工作应该就是开发和解BUG了,而解BUG的时间应该远远高于开发的时间,无论你开发的质量有多高。可能不是你的模块引起的问题,但是需要你来帮忙分析,才能推动问题的解决。Android平台framework层打印log大部分都是采用的Rlog.java中函数族,Rlog.d,Rlog.w,Rlog.i等等。
Rlog.java中提供了pii函数(personally identifiable information),对于打印一些敏感信息,可以采用该函数进行加密,之后再打印。如果load是user load,pii将直接返回"xxxxx",如果是非user load将返回"SHA-1"的散列值。手机上的敏感信息一般包括IMSI,ICCID,IMEI,电话号码,邮箱等等,这些信息一般长度固定,会有一些pattern。例如电话号码在我国一般是11位,头一个数字是1。如果用pii进行加密,可以采用暴力进行破解(计算出所有电话号码的散列值,规模在千亿级别,之后和pii打印出的值进行比对,就可以知道实际的值了,如果对全部电话号码采用桶排序,那么搜索也是很快的(搜索40次基本上就能查到))。对长度固定和有pattern的数据最好不要使用pii进行加密,可以采用只打印部分数据的方式呈现,例如电话号码,用substr打印开头的某几位即可。
Android文件中一般会定义static final变量DBG,VDBG来控制Rlog的输出。一般格式如下

if (DBG), Rlog.d(TAG, "print info");

上面的TAG也定义为static final,一般定义为类名。如Handler.jav中 private static final String Tag = “Handler”; 如果文件之间有继承关系,采用上面的方式打印log,一个子类调用一个函数打印log会出现下面形式的log情况。基本上会出现子类和父类tag交叉打印log,从log可以看出子类调用的是自身的函数还是继承父类的函数。
“子类”:“info”
“父类”:“info”
“子类”:”info“
”子类“:”info“
还有一类文件会对Rlog进行封装,形式如下

proteted void log(String s) {
    Rlog.d(TAG, s);
}

或者

protected void log(String s) {
    Rlog.(getName, s);
}
protected String getName() {
    return name;
}

这样文件中所有打印log的地方就可以采用log,而不是Rlog.d的方式,比较简洁了。如果有继承关系,子类可以重写log或者getName那么子类打印的log tag就全是子类的tag了,形式如下:
“子类”:“info”
“子类类”:“info”
“子类”:”info“
”子类“:”info“
没有绝对的哪种方式好,如果是涉及了多卡的log,需要知道当前log是打印的卡1还是卡2,那么还是建议采用可以
复写的方式,毕竟这种方式灵活性比较高。

猜你喜欢

转载自blog.csdn.net/diangangqin/article/details/96168313