2013-06-20 28 views
2

我已经使用ProGuard了几个月了,今天我开始这样的警告:Proguard找不到引用类?

[proguard] Initializing... 
[proguard] Warning: com.me.MyFragment: can't find referenced class com.me.MyFragment$1 
... 

,这是这是有问题的代码:

public class MyFragment extends Fragment { 
    private static final boolean DEBUG = false; 

    public void foo() { 
     if (DEBUG) { 
      Button btn = new Button(); 
      btn.setOnClickListener(new OnClickListener() { 
       ... 
      }); 
      ... 
     } 
    } 
} 

的OnClickListener是$ 1引用这失踪。但是,如果DEBUG布尔值设置为false,则不应该触及此代码,所以我不明白为什么proguard会在此警告我。

如果我将布尔标志设置为true,那么proguard在没有警告的情况下运行正常。任何想法如何发生?

由于

回答

2

ProGuard的打印出具有读取输入之后且在执行任何处理之前该错误。显然,输入包含com/me/MyFragment.class,但不包含匿名内部类com/me/MyFragment $ 1.class。你可能想从一个干净的构建开始。然后,您应该确保ProGuard正在运行之前的构建步骤如下:编译,打包...您可以检查传递给ProGuard的输入。

+0

我现在处于完全相同的状态,并按照你的建议无济于事。当打开包含缺少“XYZ $ 1”类的Android库jar时,我可以看到JAR文件实际上不包含这样的匿名类。它似乎在编译时被丢弃。但ProGuard从哪里获取这些信息?为什么它需要丢失的类并且从未使用? – tiguchi

+0

@Nobu游戏该警告提到哪些类(XYZ)指的是哪些缺失的类(XYZ $ 1)。就像编译器一样,ProGuard在开始分析代码之前需要所有的引用类。如果你重新编译XYZ.java,所有的类都应该在那里;编译器从不放弃任何未使用的类。 –

相关问题