如何通过Proguard合并基类

时间:2014-09-22 14:45:09

标签: java proguard

我有定义应用程序行为的配置类。如果没有配置类扩展另一个配置类,那么Proguard将删除未使用的配置类,并且有效地优化代码。但如果一个扩展另一个,则保留两个配置并且代码不被优化。

interface ConfInterface {
    boolean method();
}

class ConfNever implements ConfInterface {
    public boolean method() {
        return false;
    }
}

final class Conf extends ConfNever {
    public boolean method() {
        return true;
    }
}

public class Main {
    public static void main(String[] args) {
        new Test(new Conf());
    }
}

class Test {
    Test(ConfInterface ci) {
        if( ci.method() ) {
            System.out.println("Print");
        } else {
            System.out.println("PrintNever");
        }
    }
}

Proguard配置:

-injars  bin/
-outjars out/
-libraryjars <java.home>/lib/rt.jar
-repackageclasses ''
-allowaccessmodification
-keep public class Main {
    public static void main(java.lang.String[]);
}
-optimizationpasses 50

编译,混淆和反编译的测试类:

final class c {
    c(final a a) {
        super();
        if (a.a()) {
            System.out.println("Print");
            return;
        }
        System.out.println("PrintNever");
    }
}

如果Conf类没有扩展ConfNever,则Proguard会删除ConfNever,并且测试类被优化为(注意:我禁用了&#39; -optimizationpasses 50&#39;以保持Test类):

final class b {
    b(final a a) {
        super();
        System.out.println("Print");
    }
}

有没有办法让Proguard合并Conf和ConfNever或检测Test类只用Conf对象初始化并相应地进行优化?

更新:我尝试过&#39; -optimizations&#34; class / merge / vertical&#34;&#39;但它没有帮助。

1 个答案:

答案 0 :(得分:0)

ProGuard目前不会合并此类层次结构。它必须删除其合并标准目前阻止的ConfNever#method()。必须对标准进行细化,以检查是否从子类Conf调用此方法。