问题的出现是这样的,这是一个Android项目,客户要求把isDebug开关关掉看一个问题,我不想注释代码,所以直接在最后设置isDebug=false(加****的一行),但运行发现不生效,还是走的开发分支。
public static boolean isDebug = false;
public static String ENVIRONMENT_TYPE = "D"; // 投产必须改 4
static {
if (ENVIRONMENT_TYPE.equals("P2") || ENVIRONMENT_TYPE.equals("P") || ENVIRONMENT_TYPE.equals("P3") || ENVIRONMENT_TYPE.equals("P4")) {
isDebug = false;
Log.i("dingch", "if - " + Constans.isDebug);
} else {
isDebug = true;
Log.i("dingch", "else - " + Constans.isDebug);
}
isDebug = false; // ****添加的这一句
Log.i("dingch", "static2 - " + isDebug);
}
看代码怎么也找不到原因,这是有个做ios的同事提了个门外汉意见,在上面的地方加日志打印,我很不屑,但敷衍他一下,然后运行日志很意外,后面的修改(****这一句)并没有生效。日志如下:
I/dingch: else - true
I/dingch: static2 - true //
我没有回退修改,所以之后偶然发现编译的debug包,打印是正常的。反编译代码(如下)发现问题了。
if ((!(j.equals("P2"))) && (!(j.equals("P"))) && (!(j.equals("P3"))))
{
if (!(j.equals("P4")))
{
f = true;
localStringBuilder = new StringBuilder();
localStringBuilder.append("else - ");
localStringBuilder.append(f);
Log.i("dingch", localStringBuilder.toString());
}
}
else
{
f = false;
localStringBuilder = new StringBuilder();
localStringBuilder.append("if - ");
localStringBuilder.append(f);
Log.i("dingch", localStringBuilder.toString());
}
localStringBuilder = new StringBuilder();
localStringBuilder.append("static2 - ");
localStringBuilder.append(f);
Log.i("dingch", localStringBuilder.toString());
对比java代码何class代码,可以看出运行逻辑是不一样的。(不过debug包反编译出的class文件都是空的)。我记得有代码检查插件的提示,不要把超过3个判断条件放在一个if条件中,今天终于踩到这个坑了。不过为什么会出现这样的问题。