如何使用ProGuard缩小代码,这取决于未实现的接口

时间:2014-02-25 11:20:26

标签: java proguard

我有一个有很多方法的课。每个方法都在对象集合上执行循环,并在该对象实现接口时调用该对象的某个方法。

我试图以这样的方式创建代码,即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方法。

1 个答案:

答案 0 :(得分:0)

您是否希望未实现的界面由您的包外部的一方实施?

如果没有,那么为什么即使在那里也没有未实现的界面呢? 如果是的话,如果让PG“优化”该方法的调用,那么任何人都这样做有什么意义呢?