【问题标题】:Android - NullPointer in signed application does not occurs when app is installed from EclipseAndroid - 从 Eclipse 安装应用程序时,签名应用程序中的 NullPointer 不会发生
【发布时间】:2014-03-30 22:48:04
【问题描述】:

我正在使用以下方式开发 Android 应用:

support v4
support v7 appcompat
gridlayout v7

支持库。

当我使用 Eclipse 在我的 android 手机中安装这个应用程序时,一切正常。 当我尝试导出/签署此应用程序并安装创建的 .apk 文件时,我在填充 listView 时遇到以下异常:

java.lang.NullPointerException  
at  my.app.ar.getView(Unknown
at  android.widget.AbsListView.obtainView(AbsListView.java:1430)
at  android.widget.ListView.makeAndAddView(ListView.java:1793)
at  android.widget.ListView.fillDown(ListView.java:670)
at  android.widget.ListView.fillFromTop(ListView.java:727)
at  android.widget.ListView.layoutChildren(ListView.java:1646)
at  android.widget.AbsListView.onLayout(AbsListView.java:1260)
at  android.view.View.layout(View.java:7277)
at  android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at  android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at  android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at  android.view.View.layout(View.java:7277)
at  android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at  android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at  android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at  android.view.View.layout(View.java:7277)
at  android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at  android.view.View.layout(View.java:7277)
at  android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at  android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at  android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at  android.view.View.layout(View.java:7277)
at  android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at  android.view.View.layout(View.java:7277)
at  android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at  android.view.View.layout(View.java:7277)
at  android.view.ViewRoot.performTraversals(ViewRoot.java:1203)
at  android.view.ViewRoot.handleMessage(ViewRoot.java:1957)
at  android.os.Handler.dispatchMessage(Handler.java:99)
at  android.os.Looper.loop(Looper.java:150)
at  android.app.ActivityThread.main(ActivityThread.java:4277)
at  java.lang.reflect.Method.invokeNative(Native
at  java.lang.reflect.Method.invoke(Method.java:507)
at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at  dalvik.system.NativeStart.main(Native

但如果应用程序是从 eclipse 安装的,则不会出现此问题。

以下代码是我填充 ListView 的地方,以及何时(我认为)引发异常:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            // inflate the layout
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
    }

    final SheetVO userSheet = this.sheets.get(position);
    final ProductVO product = userSheet.getProduct();

    TextView textViewItem = (TextView) convertView.findViewById(R.id.userScanRowView);
    textViewItem.setText(product.getName());
    textViewItem.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, SheetActivity.class);
            intent.putExtra("idSheet", userSheet.getId());
            context.startActivity(intent);
        }
    });

    return convertView;
}

这是导出/签名过程错误吗?

【问题讨论】:

  • 能贴出相关代码吗?
  • 鉴于在调试和导出、签名构建之间发生故障,我的直觉会怀疑您的 proguard 配置。但如果那是因为它不完全清楚为什么你得到一个空指针异常而不是一个类未找到异常,所以可能不是这样。 my.app.ar.getView 的代码对您发布很有用。或者也许 proguard 正在离开这个类,但是因为简单的静态分析表明它没有被任何 java 代码调用,所以取消了这个方法?
  • 感谢 Tushar 和 Chris。我发布了调用的代码。
  • @ChrisStratton,有正确的想法!禁用proguard,everythink工作。现在我正在尝试正确配置proguard。使用通用配置我仍然有错误:code -dontwarn android.support.** -libraryjars libs -keep interface android.support.v4.** { ; } -keep class android.support.v4.* { *; } code

标签: android eclipse listview nullpointerexception android-support-library


【解决方案1】:

调试/发布版本之间可能存在差异。您可能忘记初始化调试版本中为您填写的变量。

创建一个发布版本(未签名),看看它是否也会崩溃。由于此类问题难以调试,因此一种方法是在整个可疑函数中散布日志语句。查看输出以准确确定哪个函数调用崩溃。

还要验证传递给 getView 的参数是否正确。

【讨论】:

  • 感谢@pmont,但问题出在 proguard 配置中。禁用它,我暂时解决了这个问题。我正在寻找正确的配置,以保持 proguard 正常运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多