我正在尝试为我的 Android 项目设置混淆器。我们在代码中使用了 netty 库的一些 fragment ,我想使用 Proguard 完全删除我知道没有使用的代码 fragment 。
有没有什么方法可以告诉混淆器假设一个包(或类)从未被使用过,因此不应包含在输出 JAR 中?请注意,我不是在谈论从混淆中排除一些代码(这是-keep
配置选项所做的),我在谈论完全删除 来自输出的类。
编辑:正如下面 pst 所建议的,我尝试使用 -whyareyoukeeping
参数来确定混淆器用来确定使用的类的代码路径。它不会更改数十个警告的输出。
我还尝试按照 pst 的建议在 -outjars
上使用文件过滤器。这也导致没有任何变化,因为算法仍然假定将加载该类,并且仅在错误确定“已使用”类后才应用过滤器。
要清楚:警告来 self 们包含在我们的 Android 项目中的第 3 方库中的类。我们不执行任何将加载这些类的代码,如果混淆器找到它假定加载这些类的代码路径,我想明确地说它不使用这些类。
最佳答案
在 outjars 上指定过滤器的替代方法是在 injars 上指定过滤器:
-injars in.jar(!unwanted/package/**)
这样,您就不会不必要地拖入此包引用的任何类,因为过滤发生在任何处理之前。
ProGuard 现在会警告缺少类,因此您必须指定它没问题:
-dontwarn unwanted.package.**
您应该小心这些选项,因为抑制警告并不一定会使问题消失。正如 pst 所写,如果您过滤掉实际需要的类,您将得到 NoClassDefFoundsErrors。
关于android - 我怎样才能告诉 proguard 假设一个包没有被使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393247/