Android - 使用静态字符串的Proguard错误

use*_*171 0 static android proguard

我正在为我的发布版本运行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)
Run Code Online (Sandbox Code Playgroud)

在映射中,com.myapp.android.myapp.dh.a是:

com.myapp.android.myapp.LocalFragment -> com.myapp.android.myapp.dh:
java.lang.String USER_ACCOUNT -> a
Run Code Online (Sandbox Code Playgroud)

在我的实际代码中,它是这样的:

public static String USER_ACCOUNT = "com.myapp.android.myapp.LocalFragment.user_account";
Run Code Online (Sandbox Code Playgroud)

现在,这个常量在整个片段中的多个位置使用,但它永远不应该为空.以前有人见过这样的问题吗?Proguard对静电有什么奇怪之处吗?

编辑:抛出此错误,一旦我采取将加载此片段的操作,应用程序基本崩溃.

再次编辑 经过一番调查,我错了.一个是静态成员,但也是一种方法.这是onCreate方法.在NPE被抛入onCreate之前,我也在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)
Run Code Online (Sandbox Code Playgroud)

Bor*_*lin 6

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

-keep class android.support.v7.widget.** { *; }
-keep interface android.support.v7.widget.** { *; }
Run Code Online (Sandbox Code Playgroud)

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