4

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

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

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

4

4 回答 4

9

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

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

至于为什么不能重命名您的活动的类名:

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

使用assumenosideeffects选项通过Proguard 删除您的Log 语句相当简单。有关详细信息,请参阅此相关问题

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
于 2013-02-09T22:30:28.453 回答
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(...);
}

有多种等价形式,通配符更多或更少。

类似的问题和答案:

于 2013-02-10T01:34:24.907 回答
3

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

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

在官方网站上,您可以找到带有示例的完整手册。

于 2013-02-09T19:20:39.647 回答
2

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

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

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

于 2013-02-09T20:28:00.880 回答