首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Proguard将抽象类中重写的方法作为未使用的方法移除。

Proguard将抽象类中重写的方法作为未使用的方法移除。
EN

Stack Overflow用户
提问于 2015-05-22 15:23:12
回答 2查看 3.5K关注 0票数 9

Proguard正在将抽象类中重写的方法作为未使用的方法移除,即使它们在父类中使用。下面是一个显示行为的引用实现

代码语言:javascript
运行
复制
public abstract class Animal {
    Animal() {
        born();
    }

    abstract void born();
}

public abstract class Human extends Animal {
    @Override
    void born() {
        System.out.println("Human is born.");
    }
}

“保持”属性定义为:

代码语言:javascript
运行
复制
-keep public class test.Human {
    public *;
}

Proguard将Human中重写的born()方法作为未使用的方法删除,即使它是从动物类的构造函数中使用的。生成的映射文件是

代码语言:javascript
运行
复制
test.Animal -> test.a:
    void born() -> a
test.Human -> test.Human:

如果类Human不是抽象的,则不存在此问题。如果类Human是非抽象的,则生成的映射文件为

代码语言:javascript
运行
复制
test.Animal -> test.a:
    void born() -> a
test.Human -> test.Human:
    void born() -> a

正如我们所看到的,在本例中保留了born()方法。

这是护卫系统中的窃听器吗?或者是否有任何优化设置可以提供所需的行为?

我在android演播室里使用Pro卫兵。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-31 18:31:21

由于问题只在这些类是库的一部分时才会出现(并且在库中没有任何具体的实现),所以我采用了简单的方法,并添加了-dontshrink来保留所有的类和方法。

在大多数情况下,在发布库时不需要对类和方法进行收缩。

不过,我仍然认为忽略重写的方法实现是使用图中的一个缺陷。我在程序守卫的窃听器里发现了一个窃听器。https://sourceforge.net/p/proguard/bugs/574/

票数 1
EN

Stack Overflow用户

发布于 2015-05-24 16:09:35

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

代码语言:javascript
运行
复制
-keep public class test.Human {
    <methods>;
}

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

如果您想保留方法,但仍然允许对它们进行混淆,则可以使用如下所示:

代码语言:javascript
运行
复制
-keep, allowobfuscation public class test.Human {
    <methods>;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30400481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档