【发布时间】:2014-02-25 19:47:17
【问题描述】:
我有一堂有很多方法的课。每个方法都对对象集合执行循环,并在该对象上调用某个方法(如果它实现了一个接口)。
我正在尝试以这样一种方式编写代码,即 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/*
如果没有实现HandlerHappy接口的类,我希望proguard删除notifyHappy方法,并在没有类实现HandlerSad时删除notifySad方法。
【问题讨论】: