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检查实际的字节码。