我有一个有很多方法的课。每个方法都在对象集合上执行循环,并在该对象实现接口时调用该对象的某个方法。
我试图以这样的方式创建代码,即proguard将删除使用接口而没有任何实现类的方法。
我尝试在集合中使用两种循环,在这两种情况下,ProGuard都成功删除了使用接口而没有实现的代码,但是留下了一个空循环。
鉴于我的代码:
原始代码
public class EventBus {
private ArrayList<Handler> handlers = new ArrayList<Handler>();
public void notifyHappy() {
for (Handler handler: handlers) {
if (handler instanceof HandlerHappy) {
((HandlerHappy) handler).notifyHappy();
}
}
}
public void notifySad() {
final int size = handlers.size();
for (int i=0; i<size; i++) {
Handler handler = handlers.get(i);
if (handler instanceof HandlerSad) {
((HandlerSad) handler).notifySad();
}
}
}
}
优化代码
public final class a {
private ArrayList a = new ArrayList();
public final void a() {
Iterator localIterator = this.a.iterator();
while (localIterator.hasNext())
localIterator.next();
}
public final void b() {
int i = this.a.size();
for (int j = 0; j < i; j++)
;
}
}
proguard.cfg
-assumenosideeffects class java.util.ArrayList {
public *** get(int);
public int size();
}
# disabled merging to produce clear output, doesn't affect the shrinking
-optimizations !class/merging/*,!method/inlining/*
如果没有实现notifyHappy
接口的类,我希望proguard删除HandlerHappy
方法,并且当没有类实现notifySad
时删除HandlerSad
方法。
答案 0 :(得分:0)
您是否希望未实现的界面由您的包外部的一方实施?
如果没有,那么为什么即使在那里也没有未实现的界面呢? 如果是的话,如果让PG“优化”该方法的调用,那么任何人都这样做有什么意义呢?