Android -用静态字符串保护错误



我正在为我的发布构建运行ProGuard,并试图尽可能地优化它。到目前为止,我添加的唯一自定义规则是序列化和Facebook规则。我现在正在运行我的发布版本,我得到了一个堆栈跟踪,它映射回的东西真的让我很困惑。下面是我的堆栈跟踪:

 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";

现在这个常量在整个片段的多个地方使用,但它永远不应该为空。有人见过这样的问题吗?Proguard会对静态数据做一些奇怪的事情吗?

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

再次编辑经过更多的调查,我错了a是什么。a是Static成员,但a也是一个方法。它是onCreate方法。在onCreate:

抛出NPE之前,我也在logcat中看到了这个错误。
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)

您有一个问题与proguard混淆支持库,或者具体地说,您可能试图在您的片段中启动的SearchView组件。为了避免这种情况,您需要在proguard配置文件(proguard.cfg)中添加一些排除项。

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

这将使支持库的小部件包中的所有类和接口不被混淆。

最新更新