ProGuard删除方法调用创建无用的代码

时间:2014-09-29 18:39:04

标签: java methods proguard

所以我的界面很小

public interface IPlayersStorage
{
    // other methods...
    public boolean addException(final String nick);
    // other methods...
}

和实现它的“PlayersStorage”类:(仅使用部分)

public class PlayersStorage implements IPlayersStorage
{
    private static final PlayersStorage               inst          = new PlayersStorage();
    private final        Set<String>                  exceptions    = new HashSet<>(50);

    @Override
    public boolean addException(final String nick)
    {
        return ! this.exceptions.add(nick);
    }

    public static PlayersStorage getStorage()
    {
        return inst;
    }
}

在某些地方,我使用该代码使用该方法:

for (final String player : this.cfg.getStringList("Exceptions"))
{
    PlayersStorage.getStorage().addException(player);
}

ProGuard将其更改为:

for (Iterator localIterator1 = this.cfg.getStringList("Exceptions").iterator(); localIterator1.hasNext();)
{
  localIterator1.next();

  PlayersStorage.getStorage();  // it's get object, but don't do anything with it...
}

我找到的唯一可能的解决方法是将静态方法添加到PlayersStorage

public static boolean staticAddException(final String nick)
{
    return inst.addException(nick);
}

然后使用它(而不是旧代码)

for (final String player : this.cfg.getStringList("Exceptions"))
{
    PlayersStorage.staticAddException(player);
}

然后工作......(ProGuard保持方法调用)但是从界面为每个方法添加静态方法并不是一个好主意。

1 个答案:

答案 0 :(得分:0)

ProGuard只会删除方法调用,如果它们没有任何效果(这里似乎不是这种情况),或者您已为方法指定了-assumenosideffects。您应检查配置并删除任何此类选项。

或者,您的反编译器可能在反编译代码时遇到问题。然后,您应该使用javap -c检查实际的字节码。