Proguard离开了

时间:2012-12-10 13:01:47

标签: java android proguard

当我们在下面的代码中运行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时,将不包括日志记录代码。但这会使我的代码出现问题,所以我对此并不满意。

现在我的问题: 我该如何改善这种行为?留下更少的剩菜和泄漏更少的信息?

3 个答案:

答案 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");

真的对您的代码进行了规范吗?