2014-07-26 16 views
0

我为我的发布版本运行ProGuard,并试图尽可能优化它。目前我唯一添加的自定义规则是序列化和Facebook。我现在正在运行我的发布版本,并且我得到一个堆栈跟踪,并且它映射回来的内容真的让我失望。这里是我的堆栈跟踪:Android - 使用静态字符串的Proguard错误

java.lang.NullPointerException 

E/AndroidRuntime(10842): at com.myapp.android.myapp.dh.a(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v4.app.Fragment.b(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v4.app.w.a(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v4.app.p.onCreatePanelMenu(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v7.a.g.a(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v7.a.m.a(Unknown Source) 

E/AndroidRuntime(10842): at android.support.v7.a.g.onCreatePanelMenu(Unknown Source) 

在测绘,com.myapp.android.myapp.dh.a是:

com.myapp.android.myapp.LocalFragment -> com.myapp.android.myapp.dh: 
java.lang.String USER_ACCOUNT -> a 

在我实际的代码是这样的:

public static String USER_ACCOUNT = "com.myapp.android.myapp.LocalFragment.user_account"; 

现在这个常量用在整个片段的多个位置,但不应该为null。任何人看到过这样的问题? Proguard会用静力学做些奇怪的事情吗?

编辑:这个错误被抛出,应用程序基本崩溃,只要我采取行动,将载入这个片段。

再编辑 经过多一点调查后,我错了什么是错。一个是静态成员,但一个也是一个方法。这是onCreate方法。我也看到这个错误在logcat中的NPE被抛出的onCreate前:

W/SupportMenuInflater(10842): Cannot instantiate class: android.support.v7.widget.SearchView 

W/SupportMenuInflater(10842): java.lang.NoSuchMethodException: <init> [class android.content.Context] 

W/SupportMenuInflater(10842): at java.lang.Class.getConstructorOrMethod(Class.java:472) 

W/SupportMenuInflater(10842): at java.lang.Class.getConstructor(Class.java:446) 

W/SupportMenuInflater(10842): at android.support.v7.internal.view.e.a(Unknown Source) 

W/SupportMenuInflater(10842): at android.support.v7.internal.view.e.a(Unknown Source) 

W/SupportMenuInflater(10842): at android.support.v7.internal.view.c.a(Unknown Source) 

W/SupportMenuInflater(10842): at android.support.v7.internal.view.c.inflate(Unknown Source) 

W/SupportMenuInflater(10842): at com.myapp.android.myapp.dh.a(Unknown Source) 

回答

6

你必须使用ProGuard混淆的支持库,或者具体问题时,搜索查看组件,您可能会尝试启动您的片段。为避免这种情况,您需要为proguard配置文件(proguard.cfg)添加一些排除项。

-keep class android.support.v7.widget.** { *; } 
-keep interface android.support.v7.widget.** { *; } 

这将使支持库的widget包内的所有类和接口不被混淆。

相关问题