【问题标题】:Proguard left oversProguard 剩菜剩饭
【发布时间】:2012-12-10 13:01:47
【问题描述】:

当我们对以下代码运行 proguard 时,它应该删除 Logging 语句:

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 时将不包含日志记录代码。但这会污染我的代码,所以我对此并不满意。

现在我的问题: 我该如何改善这种行为?少吃剩菜,少泄露信息?

【问题讨论】:

    标签: java android proguard


    【解决方案1】:

    您可以通过强制将语句分开来阻止编译器使用 Stringbuilder:

    Log.d(TAG, "field:");
    Log.d(TAG, field);
    Log.d(TAG, "enhancedfield:");
    Log.d(TAG, enhancedfield);
    

    这当然会影响日志的结果(4 行而不是 1 行),并且代码不是很容易维护。

    【讨论】:

      【解决方案2】:

      这是问题Removing unused strings during ProGuard optimisation 的重复。您可以定义自己的日志记录方法以避免 StringBuilder 调用。

      【讨论】:

        【解决方案3】:

        日志字符串一直是混淆的一个问题,它们不能被混淆掉,你只能将它们移动到一个单独的类中,这没有多大帮助。

        加密该字符串会更安全。 在我们的实践中,我们并不在意,在非常特殊的算法中,这是技术的核心,一旦您知道这些方法可以正常工作,您就可以完全删除日志记录。

        使用静态最终布尔值 isDebug 的缺点是您无法再启用日志记录,您必须重新构建并安装调试版本。

        解决方案是否使用 statcic final dbg = false
        :

        if (dbg) Log.d("unwanted debug log");
        

        真的污染你的代码吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          • 2011-12-08
          相关资源
          最近更新 更多