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

Android Proguard选项-更严格的规则;删除日志语句,android,obfuscation,proguard,Android,Obfuscation,Proguard,我通过取消对project.properties中的行的注释来启用proguard 我反编译了我的APK以检查它是否有效。我可以看到,我所有的方法、变量名和类名都已更改为a、b、c。。等等,这是好的。但是,我的活动类尚未重命名。此外,Log.d语句也没有按预期删除 我如何使某人更难阅读反编译代码并删除日志语句?为了删除对日志语句的所有引用,您应该在proguard配置文件中添加以下行: -assumenosideeffects class android.util.Log { publi

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

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


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

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

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

您可以通过示例找到完整的手册。

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

我觉得第二个带Proguard的是最好的


要混淆代码,您需要考虑您的需要,请参阅中的更多示例:

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

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

  • 这将假定对清单进行修改,Proguard根本不支持这一点
  • 自动进行这些修改可能会产生不必要的影响。例如,如果以前被混淆为
    a
    的类现在可能被混淆为
    B
    ,则来自用户主屏幕的快捷方式可能不再有效
使用以下选项,通过Proguard删除日志语句相当简单:


Paul Lammertsma对你问题的第一部分给出了准确的答案。阐述第二部分:

只有在未禁用优化时才能删除日志记录,这需要在
项目中指定不同的全局配置文件。属性

  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(...);
}
有多种具有更多或更少通配符的等价形式

类似的问题和答案:

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