我有定义应用程序行为的配置类。如果没有配置类扩展另一个配置类,那么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;但它没有帮助。
答案 0 :(得分:0)
ProGuard目前不会合并此类层次结构。它必须删除其合并标准目前阻止的ConfNever#method()
。必须对标准进行细化,以检查是否从子类Conf
调用此方法。