Fabric SDK 报告的 Cordova 应用程序中的 NullPointerException

Posted

技术标签:

【中文标题】Fabric SDK 报告的 Cordova 应用程序中的 NullPointerException【英文标题】:NullPointerException in Cordova App reported by Fabric SDK 【发布时间】:2016-03-26 18:19:30 【问题描述】:

我正在使用 Ionic 框架来构建混合 android 应用程序,并且该应用程序运行良好。我正在使用 Fabric Crash 分析插件并报告应用程序的崩溃。

我经常收到以下崩溃详细信息,但不确定是什么原因造成的。我不确定开始分析此问题的起点是什么。

Fatal Exception: java.lang.NullPointerException
       at android.webkit.WebViewClassic.setNetworkAvailable(WebViewClassic.java:4224)
       at android.webkit.WebView.setNetworkAvailable(WebView.java:731)
       at org.apache.cordova.engine.SystemWebViewEngine$1.setNetworkAvailable(SystemWebViewEngine.java:112)
       at org.apache.cordova.NativeToJsMessageQueue$OnlineEventsBridgeMode$2.run(NativeToJsMessageQueue.java:340)
       at android.os.Handler.handleCallback(Handler.java:725)
       at android.os.Handler.dispatchMessage(Handler.java:92)
       at android.os.Looper.loop(Looper.java:176)
       at android.app.ActivityThread.main(ActivityThread.java:5319)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
       at dalvik.system.NativeStart.main(NativeStart.java)

它是否与 Ionic 或 Cordvoa 中的任何插件或任何问题有关?任何帮助或建议都会有所帮助。

【问题讨论】:

【参考方案1】:

我也有同样的问题。我还使用 Cordova 和 Fabric Crashlytics。

仅在 Android 4.1.2、4.2.2、4.3 上重现。

我已经重现了这个错误:

    使用包含 javascript 函数的内容打开 WebView; 打开新的 WebView 并关闭它; 尽快禁用网络(wifi 和移动); 返回应用并显示堆栈跟踪。

我找到了解决办法:

我没有在我的应用中使用 CordovaActivity。我正在使用 CordovaInterface。 与已删除的 WebView 关联的 PluginManager 继续调用其方法。所以我手动调用 WebView.handleDestroy() 来销毁 PluginManager。

在我的片段中:

@Override
public void onDestroy()

    if (webView != null)
    
        webView.handleDestroy();
        webView.destroy();
        webView = null;
    

    super.onDestroy();

更新: 当您销毁 WebView 时,它会被复制,但 PluginManager 会继续存在并将 javascripts 事件发送给订阅者(WebViews)。因为我调用了 WebView.handleDestroy()。

【讨论】:

你能解释一下用这个编辑哪个 .java 文件吗? 我在我的类扩展片段上编辑了 onDestroy() 方法。我的班级创建 WebView 并对其进行操作。 你能把你的示例代码发给我,这样我可以在这里得到一个很好的复制案例吗?我想得到一个好的 JUnit 测试用例,并将这段代码直接拉入 CordovaAndroid/CordovaInterface onDestroy【参考方案2】:

你能吞下这个例外吗?编辑此文件:

/platforms/android/CordovaLib/src/org/apache/cordova/engineChange/SystemWebViewEngine.java

然后改变这个

webView.setNetworkAvailable(value);

到这里

import java.lang.NullPointerException;
...
try 
    webView.setNetworkAvailable(value);

catch (NullPointerException e) 
    Log.d(TAG, "webView.setNetworkAvailable called after destroy");

不是一个真正的解决方案,但考虑到在本地复制的困难,它可能是一个可以考虑的选项。

【讨论】:

【参考方案3】:

我的解决方案在 SystemWebViewEngine.java 中。

    protected final SystemWebView webView;更改为protected SystemWebView webView;

    destroy()方法之后

if (receiver != null) try webView.getContext().unregisterReceiver(receiver); catch (Exception e) Log.e(TAG, "Error unregistering configuration receiver: " + e.getMessage(), e);

添加

webView = null;

    webView.setNetworkAvailable(value); 替换为

    if (webView != null) webView.setNetworkAvailable(value);

【讨论】:

以上是关于Fabric SDK 报告的 Cordova 应用程序中的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Fabric1.4 Fabric-SDK-go及web应用

从 Powershell 部署 Service Fabric 应用程序,无需 Service Fabric SDK

基于 Cordova 的 Fabric 项目

HyperLeger Fabric SDK开发——Fabric SDK开发简介

Fabric Debug Craslytic 报告:注册,缺少构建 ID,应用插件:io.fabric

Hyperledger Fabric 1.0 从零开始——fabric-sdk-java应用