在我最近发布的应用程序中,我添加了混淆器。一个奇怪的错误开始出现:
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
对象。堆栈跟踪告诉我,这个 NPE 在我初始化 View 后立即触发:
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 上钩了?
最佳答案
replace
com.example
with base package ofMedia
Class and put this line in proguard file
-keep class com.example.** { *; }
关于android - Proguard 是否缩小了我的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288187/