是不是缩小了我的常数?

时间:2017-05-31 14:59:28

标签: android proguard android-lifecycle

在我的应用程序的最新版本中,我添加了proguard。一个奇怪的错误开始出现:

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'java.lang.String com.siplay.myapp.b.e.e.b()' on a null object reference

此行正在触发错误:

public boolean isVideo() {
    return Media.MEDIA_TYPE_VIDEO.equals(mImage.getType());
}

MEDIA_TYPE_VIDEO是一个常量,声明如下:

public class Media implements Parcelable {
    ...
    public static final String MEDIA_TYPE_VIDEO = "video";
    ...
    @Retention(RetentionPolicy.SOURCE)
    @StringDef({Media.MEDIA_TYPE_VIDEO, Media.MEDIA_TYPE_PHOTO, Media.MEDIA_TYPE_THUMB})
    public @interface MediaTypes {}
    ...
    public void setType(@MediaTypes String type) {
        ...
}

我在很多帖子中都看到Proguard并没有弄乱常量声明。但是它必须是已复制的常量或mImage对象。 stacktrace告诉我在初始化视图后立即触发了这个NPE:

public class MyFragment extends Fragment {
    ...
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            mImage = savedInstanceState.getParcelable(Constants.BUNDLE_IMAGE);
            ...
        }

        mVideoLoader.setVisibility(View.GONE);

        if (isVideo()) { //HERE
            ...
        }
        ...
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable(Constants.BUNDLE_IMAGE, mImage);
        ...
    }
}

也许这种情况正在发生,因为我迷上了onActivityCreated?

1 个答案:

答案 0 :(得分:3)

  

com.example替换为Media类的基础包并将其放入   在proguard文件中的行

-keep class com.example.** { *; }