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。
答案 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/