我怎样才能告诉 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 假设一个包没有被使用?的主要内容,如果未能解决你的问题,请参考以下文章