Proguard将抽象类中的重写方法删除为未使用

时间:2015-05-22 15:23:13

标签: java proguard

Proguard将抽象类中的重写方法删除为未使用,即使它们在父类中使用。 以下是显示行为的参考实现

born()

keep属性定义为:

test.Animal -> test.a:
    void born() -> a
test.Human -> test.Human:

Proguard将Human类中被覆盖的Human方法删除为未使用,即使它是从Animal类的构造函数中使用的。生成的映射文件是

Human

如果类test.Animal -> test.a: void born() -> a test.Human -> test.Human: void born() -> a 不是抽象的,则不存在此问题。如果类born()是非抽象的,则生成的映射文件为

        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
        <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
        <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>

正如我们所看到的,在这种情况下保留方法{{1}}。

这是proguard中的错误吗?或者是否有任何可以提供所需行为的优化设置?

我在android studio中使用proguard。

2 个答案:

答案 0 :(得分:3)

您将ProGuard配置为保留公共方法,而born()是包私有的。您的配置应该是这样的。

-keep public class test.Human {
    <methods>;
}

它将保留Human类的所有包私有(默认)方法。

如果您想保留方法但仍然允许对它们进行模糊处理,您可以使用以下内容:

-keep, allowobfuscation public class test.Human {
    <methods>;
}

答案 1 :(得分:1)

由于问题仅在这些类是库的一部分时才显现(并且在库中没有任何具体实现),我采取了简单的方法并添加-dontshrink以保留(通过模糊处理)所有类和方法。

在大多数情况下;释放库时不需要进行类和方法缩小。

我仍然认为使用图中的一个错误是忽略了重写的方法实现。我在proguard bug跟踪器中提交了一个错误。 https://sourceforge.net/p/proguard/bugs/574/