Proguard将抽象类中的重写方法删除为未使用,即使它们在父类中使用.这是一个显示行为的参考实现
public abstract class Animal {
Animal() {
born();
}
abstract void born();
}
public abstract class Human extends Animal {
@Override
void born() {
System.out.println("Human is born.");
}
}
Run Code Online (Sandbox Code Playgroud)
keep属性定义为:
-keep public class test.Human {
public *;
}
Run Code Online (Sandbox Code Playgroud)
Proguard将born()Human类中的重写方法删除为未使用,即使它是从Animal类的构造函数中使用的.生成的映射文件是
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:
Run Code Online (Sandbox Code Playgroud)
如果类Human不是抽象的,则不存在此问题.如果类Human是非抽象的,则生成的映射文件是
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:
void born() -> a
Run Code Online (Sandbox Code Playgroud)
我们可以看到,born()在这种情况下保留了该方法.
这是proguard中的错误吗?或者是否有任何可以提供所需行为的优化设置?
我正在使用android工作室的proguard.
由于只有当这些类是库的一部分(并且库内没有任何具体实现)时问题才会出现,因此我采取了简单的方法并添加了-dontshrink保留(混淆)所有类和方法。
在多数情况下; 发布库时不需要进行类和方法收缩。
我仍然相信忽略覆盖的方法实现是使用图中的一个错误。我已经在 proguard 错误跟踪器中提交了一个错误。https://sourceforge.net/p/proguard/bugs/574/