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

San*_*go 4 obfuscation android proguard

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

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

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

Pau*_*sma 9

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

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

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

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

使用assumenosideeffects选项,通过Proguard删除日志语句非常简单.详情请参阅此相关的问题:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*une 6

Paul Lammertsma为您问题的第一部分提供了准确的答案.阐述第二部分:

如果未禁用优化,则只能删除日志记录,这需要在以下位置指定其他全局配置文件project.properties:

  proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
Run Code Online (Sandbox Code Playgroud)

这些设置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(...);
}
Run Code Online (Sandbox Code Playgroud)

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

类似的问题和答案: