Android Proguard选项 - 更严格的规则&删除日志语句

时间:2013-02-09 17:11:21

标签: android obfuscation proguard

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

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

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

4 个答案:

答案 0 :(得分:9)

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

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

至于为什么无法重命名您的活动的类名:

  • 这将假设对清单进行修改,而Proguard并不支持。
  • 自动进行这些修改可能会产生不必要的影响。例如,如果先前已复制到A的类可能会被混淆为B,则来自用户主屏幕的快捷方式可能不再有效。

使用assumenosideeffects选项通过Proguard删除日志语句非常简单。 See this related question for details

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

答案 1 :(得分:6)

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(...);
}

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

类似的问题和答案:

答案 2 :(得分:3)

为了删除对Log语句的所有引用,您应该在proguard配置文件中添加以下行:

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

In the official website您可以找到包含示例的完整手册。

答案 3 :(得分:2)

为了删除Logs我写了一篇文章,其中有一些来自StackOverflow(在文章中说谁是作者)你可以在这里看到它:

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

要对代码进行模糊处理,您需要考虑自己的需求,请参阅以下内容中的更多示例:http://proguard.sourceforge.net/index.html#manual/examples.html