ProGuard的去除方法调用创建无用代码
问题描述:
所以我小的接口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保留方法调用),但是从接口添加每种方法的静态方法并不是一个好主意。
答
如果方法调用没有任何效果(这里似乎不是这种情况),或者您为方法指定了-assumenosideffects
,ProGuard将仅删除方法调用。你应该检查你的配置并删除任何这样的选项。
或者,您的反编译器可能在反编译代码时遇到问题。然后你应该用javap -c
检查实际的字节码。