我怎样才能告诉 proguard 假设一个包没有被使用?

Posted

技术标签:

【中文标题】我怎样才能告诉 proguard 假设一个包没有被使用?【英文标题】:How can I tell proguard to assume a package is not used? 【发布时间】:2011-11-15 15:12:48 【问题描述】:

我正在尝试为我的 android 项目设置 proguard。我们在代码中使用了一些 netty 库,我想使用 Proguard 来完全删除我知道没有使用的代码。

有没有办法告诉 proguard 假设一个包(或类)从未使用过,因此不应该包含在输出 JAR 中?请注意,我不是谈论从混淆中排除某些代码(这是-keep 配置选项所做的),我谈论的是完全删除一个类输出。

编辑:正如下面 pst 所建议的,我尝试使用 -whyareyoukeeping 参数来确定 proguard 用于确定使用的类的代码路径。它不会改变几十个警告的输出。

我还尝试按照 pst 的建议在 -outjars 上使用文件过滤器。这也导致没有任何变化,因为算法仍然假设类将被加载,并且过滤器仅在“使用”类被错误地确定后才应用。

需要明确:警告来自我们在 Android 项目中包含的 3rd 方库中的类。我们不执行任何将加载这些类的代码,如果 proguard 找到一个假设这些类已加载的代码路径,我想明确地说它确实使用这些类。

【问题讨论】:

这可以帮助我找到 netty 库中的哪些类被“使用”,但它不能帮助我阻止它们被包含在输出 JAR 中。 Err,你想阻止一个使用的类? 是的,proguard 认为该类被使用,它不是。我想明确告诉 proguard 该类没有被使用。 【参考方案1】:

在 outjars 上指定过滤器的替代方法是在 injars 上指定过滤器:

-injars in.jar(!unwanted/package/**)

这样,您不会不必要地拖入此包引用的任何类,因为过滤发生在任何处理之前。

ProGuard 现在会警告缺少的类,所以你必须指定它没问题:

-dontwarn unwanted.package.**

您应该小心使用这些选项,因为抑制警告并不一定会使问题消失。正如 pst 所写,如果您过滤掉实际需要的类,您将得到 NoClassDefFoundsErrors。

【讨论】:

以上是关于我怎样才能告诉 proguard 假设一个包没有被使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何排除一个类被proguard保留

为啥 proguard 不混淆方法体?

Android 应用程序大小

ProGuard 保留类名但更改包名

我怎样才能告诉AngularJS“刷新”

奏鸣曲捆绑包,我怎样才能获得当前登录的用户?