Android WebView已开始在Android 9上崩溃

coo*_*ler 15 crash android webview android-9.0-pie

您好专家Android开发人员:

我们有一个android应用,我们的基本工作流程如下

  1. 通过电子邮件或短信向用户发送了链接
  2. 用户单击链接,然后在Chrome或Android默认浏览器上打开一个页面,并带有一个名为JOIN的按钮。
  3. 用户单击此JOIN按钮,我们的应用程序启动,并在Webview中显示一个页面,要求用户输入名字,姓氏和电话/电子邮件,然后用户单击名为INITIATE的按钮
  4. 我们验证信息-如果用户是新用户,我们将创建一条记录,该用户已存在,我们将其更新,等等,然后显示一个弹出窗口,通知他的会话将被记录。
  5. 一旦用户单击弹出窗口上的“确定”,然后控件就存在Web视图,并且用户位于本机android页面上。

问题 在Webview上轻按“确定”按钮后,本机应用程序页面将正常启动,直到几周前,该应用程序崩溃,我们将被带回到Webview页面的开始,要求我们输入详细信息。

请注意以下警告:

  • 首先,这仅在Android 9的情况下发生。我们已经在三星Galaxy S8和S9上进行了测试。它并不是每次都发生,而是相当定期地发生,我有时甚至说三分之二。在最好的情况下,它发生了十分之二的情况,但是确实发生了。
  • 这段代码在过去一年左右的时间里已经成功运行,我们从来没有遇到过这个问题。它只是在最近3-4周内才开始发生。
  • 我们也有一个iOS应用程序,未观察到相同的问题。

这是一个可能有用的代码段-这就是我们加载Web视图的方式。

webview = findViewById(R.id.webview);
    webview.setVisibility(View.VISIBLE);
    final ProgressDialog pd = ProgressDialog.show(ActivtyName.this, "", "Please wait", true);
    webview.setGeolocationEnabled(true);
    webview.setMixedContentAllowed(true);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);

    webview.setWebChromeClient(new WebChromeClient()
Run Code Online (Sandbox Code Playgroud)

========这里我们覆盖了很多方法,后面是

webview.setWebViewClient(new WebViewClient()
Run Code Online (Sandbox Code Playgroud)

=======我们在这里覆盖方法。

知道会发生什么吗?我们尝试通过USB模式进行调试时查看日志,但是除了如下所示在Android控制台上显示的内容外,我们在日志中看不到太多内容:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.a****d.xyzapp <<<
Run Code Online (Sandbox Code Playgroud)

backtrace:

#00  pc 0000000001b61620  /data/app/com.android.chrome-DpcaMBOCm2oa08upmw1Tug==/base.apk
Run Code Online (Sandbox Code Playgroud)

这是请求的更详细的日志:

2019-05-18 11:58:01.694 23217-23217/com.a**d.xyzapp.debug A/chromium: 

[FATAL:crashpad_client_linux.cc(404)] Render process (28925)'s crash wasn't handled by all associated  webviews, triggering application crash.
Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x7ab7b9d620 in tid 23217 (atientapp.debug), pid 23217 (atientapp.debug) (edited) 
Run Code Online (Sandbox Code Playgroud)

Pra*_*iya 6

在您的情况下,渲染进程崩溃并且它没有被系统杀死。

因此,作为描述在这里,如果重写

onRenderProcessGone(WebView view,
            RenderProcessGoneDetail detail)
Run Code Online (Sandbox Code Playgroud)

上述方法detail.didCrash()将适用true于您的情况。在这种情况下,Renderer 由于内部错误(例如内存访问冲突)而崩溃。检测到渲染器崩溃后,应用程序本身崩溃。

要处理崩溃并允许您的应用程序继续执行,您应该按照以下步骤操作:-

  1. 销毁当前的 WebView 实例。
  2. 指定您的应用程序如何继续执行的业务逻辑。
  3. 覆盖onRenderProcessGone并返回true

问题只要在我们的原生应用程序页面在几周前正常启动的 webview 上点击 OK 按钮,应用程序就会崩溃,我们将被带回 webview 页面的开头,要求我们输入详细信息。

这是因为如果渲染器在加载特定网页时崩溃,尝试再次加载同一页面可能会导致新WebView对象表现出相同的渲染崩溃行为。

检查此链接中的代码以获取更多信息。

希望这会有所帮助。


The*_*ush 2

这似乎是一个内存问题,我可以从几个线程中找到它。

为此,在您的 webview 片段/活动中覆盖 onLowMemory()并添加日志。

@Override
public void onLowMemory() {
    Log.d("TAG_MEMORY", "Memory is Low");
    super.onLowMemory();
}
Run Code Online (Sandbox Code Playgroud)

现在尝试重现崩溃,如果 onLowMemory() 被调用,那么这就是根本原因。可能有些webview页面占用内存太多。