当我们在下面的代码中运行proguard时,它应该删除Logging statment:
Log.d(TAG, "field= "+field+“ : enhancedfield=”+enhancedfield);
但是... 编译后你会看到:
Log.d(TAG, new StringBuilder().append("Field= ").append(field)
.append(“ : enhancedfield=”).append(enhancedfield).toString());
现在,当我们对此运行proguard时,你会得到一些剩菜:
new StringBuilder().append("Field= ").append(field)
.append(“ : enhancedfield=”).append(enhancedfield).toString();
这会泄露信息给潜在的黑客......
我能做什么:
声明final static boolean
并仅在值为true
时进行记录。由于此值可以在编译时确定,因此当值为false时,将不包括日志记录代码。但这会使我的代码出现问题,所以我对此并不满意。
现在我的问题: 我该如何改善这种行为?留下更少的剩菜和泄漏更少的信息?
答案 0 :(得分:2)
您可以通过强制语句分开来阻止编译器使用Stringbuilder:
Log.d(TAG, "field:");
Log.d(TAG, field);
Log.d(TAG, "enhancedfield:");
Log.d(TAG, enhancedfield);
这当然会影响日志的结果(4行而不是1行),而且代码不是很容易维护。
答案 1 :(得分:1)
这是问题Removing unused strings during ProGuard optimisation的副本。您可以定义自己的日志记录方法以避免StringBuilder调用。
答案 2 :(得分:0)
日志字符串在混淆中总是一个问题,它们不能被混淆,你只能在一个单独的类中移动它们,这没有多大帮助。
加密那些字符串会更安全。 在我们的实践中,我们并不在乎,在非常特殊的算法中,一旦你知道这些方法没有错误地工作,你可以完全删除日志记录。
使用static final boolean isDebug的缺点是你不能再启用日志记录,你必须重建并安装调试版本。
解决方案是否具有statcic final dbg = false
:
if (dbg) Log.d("unwanted debug log");
真的对您的代码进行了规范吗?