【问题标题】:How to shrink code with ProGuard that depends on unimplemented interface如何使用依赖于未实现接口的 ProGuard 收缩代码
【发布时间】: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方法。

【问题讨论】:

    标签: java proguard


    【解决方案1】:

    您希望未实现的接口由您的包外部的一方实现吗?

    如果不是,那为什么还有未实现的接口呢? 如果是,那么如果您让 PG“优化”该方法的调用,那么任何人这样做的意义何在?

    【讨论】:

    • 我确实希望第三部分实现接口,但第三部分也将运行 proguard。我想使生成的代码尽可能地最小和最优。第三部分将只实现部分接口。
    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多