【问题标题】:Android Proguard Options - Stricter Rules & Remove Log StatementsAndroid Proguard 选项 - 更严格的规则和删除日志语句
【发布时间】:2013-02-09 17:11:21
【问题描述】:

我已通过取消注释 project.properties 中的行来启用 proguard。

我反编译了我的 APK 以检查它是否有效。我可以看到我所有的方法、变量名和类名都已更改为 a、b、c.. 等,这很好。但是,我的 Activity 课程尚未重命名。 Log.d 语句也没有按预期删除。

如何让别人更难阅读反编译的代码并删除日志语句?

【问题讨论】:

    标签: android obfuscation proguard


    【解决方案1】:

    与Android应用生命周期相关的各种方法不能重命名,因为:

    • 继承;超类方法包含在 Android 库中,无法通过 Proguard 对其进行重命名。因此,将onCreate() 重命名为a() 会由于@Override 注释而导致编译问题。
    • 在 Activity 的生命周期中,Android 会执行各种预期具有特定名称的函数(例如 onCreate()onResume())。如果您的 onCreate() 重命名为 a(),则只会执行超类实现 - 而不是您的。

    至于为什么你的Activity的类名不能重命名:

    • 这假设对清单进行了修改,而 Proguard 根本不支持。
    • 自动进行这些修改可能会产生不必要的影响。例如,如果以前被混淆为 A 的类现在可能被混淆为 B,则来自用户主屏幕的快捷方式可能不再起作用。

    使用assumenosideeffects 选项通过Proguard 删除您的日志语句相当简单。 See this related question for details:

    -assumenosideeffects class android.util.Log {
        public static *** d(...);
        public static *** v(...);
    }
    

    【讨论】:

      【解决方案2】:

      Paul Lammertsma 为您的问题的第一部分提供了准确的答案。第二部分详解:

      只有在没有禁用优化的情况下才能删除日志记录,这需要在project.properties 中指定不同的全局配置文件:

        proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
      

      proguard-project.txt 中的这些设置然后删除所有日志记录:

      -assumenosideeffects class android.util.Log {
          public static boolean isLoggable(java.lang.String, int);
          public static int v(...);
          public static int i(...);
          public static int w(...);
          public static int d(...);
          public static int e(...);
      }
      

      具有更多或更少通配符的各种等效形式。

      类似的问题和答案:

      【讨论】:

        【解决方案3】:

        为了删除对日志语句的所有引用,你应该在你的 proguard 配置文件中添加这些行:

        -assumenosideeffects class android.util.Log {
            public static *** d(...);
            public static *** v(...);
        }
        

        In the official website你可以找到带有示例的完整手册。

        【讨论】:

          【解决方案4】:

          为了删除日志,我用各种技术写了一篇文章,其中一些来自 StackOverflow(文章中说作者是谁)你可以在这里看到它:

          http://bakingcode.com/development/ocultar-trazas-en-una-app-final-de-android/ 恕我直言,我认为 Proguard 的第二个是最好的。

          要混淆您的代码,您需要考虑您的需求,请参阅以下位置的更多示例:http://proguard.sourceforge.net/index.html#manual/examples.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-22
            • 2017-10-23
            • 1970-01-01
            • 1970-01-01
            • 2014-05-17
            • 2012-09-05
            • 1970-01-01
            相关资源
            最近更新 更多