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.");
}
}“保持”属性定义为:
-keep public class test.Human {
public *;
}Proguard将Human中重写的born()方法作为未使用的方法删除,即使它是从动物类的构造函数中使用的。生成的映射文件是
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:如果类Human不是抽象的,则不存在此问题。如果类Human是非抽象的,则生成的映射文件为
test.Animal -> test.a:
void born() -> a
test.Human -> test.Human:
void born() -> a正如我们所看到的,在本例中保留了born()方法。
这是护卫系统中的窃听器吗?或者是否有任何优化设置可以提供所需的行为?
我在android演播室里使用Pro卫兵。
发布于 2015-05-31 18:31:21
由于问题只在这些类是库的一部分时才会出现(并且在库中没有任何具体的实现),所以我采用了简单的方法,并添加了-dontshrink来保留所有的类和方法。
在大多数情况下,在发布库时不需要对类和方法进行收缩。
不过,我仍然认为忽略重写的方法实现是使用图中的一个缺陷。我在程序守卫的窃听器里发现了一个窃听器。https://sourceforge.net/p/proguard/bugs/574/
发布于 2015-05-24 16:09:35
您可以配置ProGuard以保持公共方法,而born()是包私有的。您的配置应该是这样的。
-keep public class test.Human {
<methods>;
}它将保留Human的所有包私有(默认)方法。
如果您想保留方法,但仍然允许对它们进行混淆,则可以使用如下所示:
-keep, allowobfuscation public class test.Human {
<methods>;
}https://stackoverflow.com/questions/30400481
复制相似问题