Android WebView: crash after url loading

不羁的心 提交于 2021-02-08 21:38:25

问题


When loading an url with my webView, application crashes after few seconds (without error log...).

My Code :

 wv = new WebView(this);
        wv.clearCache(true);
        wv.clearHistory();
        wv.getSettings().setJavaScriptEnabled(true);
        wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

        wv.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimetype, long contentLength) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setType(mimetype);
                intent.setData(Uri.parse(url));
                startActivity(intent);
            }
        });


        wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                // TODO change for other domains
                URL nextUrl;
                try {
                    nextUrl = new URL(url.toString());
                }catch (MalformedURLException e){
                    nextUrl = null;
                }

                if(nextUrl !=null && nextUrl.getHost().toString().equals(DOMAIN)) {
                    Toast.makeText(mContext, nextUrl.getHost().toString(), Toast.LENGTH_SHORT).show();
                    view.loadUrl(url);
                    return false;

                }else{
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(browserIntent);
                    return true;
                }

            }
        });

        wv.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                MainActivity.this.setProgress(progress * 1000);
            }
            public boolean onConsoleMessage(ConsoleMessage cm) {
                Log.d("MyProject: WebView: ", cm.message() + " -- From line "
                    + cm.lineNumber() + " of "
                    + cm.sourceId() );
            return true;
        }
        });

        wv.loadUrl(URL);
        setContentView(wv);

Log :

01-20 18:00:50.798    7233-7288/ my.appli.com I/dalvikvm﹕ "WebViewCoreThread" prio=5 tid=12 NATIVE
01-20 18:00:50.798    7233-7288/ my.appli.com I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x419a0be0 self=0x68f6c750
01-20 18:00:50.798    7233-7288/ my.appli.com I/dalvikvm﹕ | sysTid=7288 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1773204176
01-20 18:00:50.799    7233-7288/ my.appli.com I/dalvikvm﹕ | state=R schedstat=( 0 0 0 ) utm=2326 stm=119 core=0
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ #00  pc 000012a0  /system/lib/libcorkscrew.so (unwind_backtrace_thread+27)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ #01  pc 0006235c  /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+35)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ #02  pc 000561bc  /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+303)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ #03  pc 00056256  /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ #04  pc 000478c8  /system/lib/libdvm.so (dvmDebuggerSignalHandler(int, siginfo*, void*)+15)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.webkit.JWebCoreJavaBridge.sharedTimerFired(Native Method)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.webkit.JWebCoreJavaBridge.fireSharedTimer(JWebCoreJavaBridge.java:92)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:108)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.os.Looper.loop(Looper.java:137)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:900)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ at java.lang.Thread.run(Thread.java:856)
01-20 18:00:50.841    7233-7288/ my.appli.com I/dalvikvm﹕ [ 01-20 18:00:50.841  7233: 7288 F/libc     ]
    Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 7288 (WebViewCoreThre)

I've experienced the same issue(crash) when trying to load the same URL with the default browser of my android device(4.1).

The URL I want to load is :

http://presentbox.jp

Thank you for your help.

--- EDIT 1

I' ve tried with a recent android phone (4.4) and application didn't crashed.

For debug purpose, I've deleted all heavy parts of my website (images, js,...) but application still crash after scrolling down.


回答1:


// Edit: Found it! The culprit in on line 2540 in general.css:

#head-search-form{display: block;margin: 30px 0;}

More specifically, it's display: block that somehow makes the WebView choke. I'm not much of a web developer, but exchanging the value with flex or none seems to no longer result in a crash (and I couldn't tell the visual difference on a mobile device). Hope that helps!


I've set up a small test project and have been able to reproduce the crash on a (virtual) Android 4.1 device. It only seems to happens upon scrolling, after the page has fully loaded. I.e. you can expand the menu drawer without any issues, as long as you don't start scrolling...

I was able to narrow down the culprit to general.css. As soon as you don't load that style sheet, the page will work and scroll just fine, but of course won't look very pretty.

Since general.css counts 3300+ lines, I'd suggest you start your search for the actual cause by fixing the errors indicated by the W3C CSS Validator. If that doesn't solve the issue, start disabling style rules related to the photo grid, especially anything that involves animation/transformation. If I can find the time, I may have a go at this myself too.

Just for your information, here's a more extensive stack trace. Someone else may be able to find some more pointers in there too.

mh.test.webview A/libc: Fatal signal 11 (SIGSEGV) at 0x00001f08 (code=1), thread 11949 (WebViewCoreThre)
I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG: Build fingerprint: 'generic/vbox86p/vbox86p:4.1.1/JRO03S/eng.buildbot.20151117.133415:userdebug/test-keys'
I/DEBUG: pid: 11930, tid: 11949, name: WebViewCoreThre  >>> mh.test.webview <<<
I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00001f08
I/DEBUG:     eax b84902e4  ebx 9ba8b488  ecx b804b028  edx b83c0224
I/DEBUG:     esi b8490360  edi b804b028
I/DEBUG:     xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
I/DEBUG:     eip 00001f08  ebp 997b9748  esp 997b96dc  flags 00010296
I/DEBUG:     #00  pc 00001f08  <unknown>
I/DEBUG:     #01  pc 00344fd6  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::computeCompositingRequirements(WebCore::RenderLayer*, WTF::HashMap<WebCore::RenderLayer*, WebCore::IntRect, WTF::PtrHash<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::IntRect> >*, WebCore::CompositingState&, bool&)+38)
I/DEBUG:     #02  pc 003454bb  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::computeCompositingRequirements(WebCore::RenderLayer*, WTF::HashMap<WebCore::RenderLayer*, WebCore::IntRect, WTF::PtrHash<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::IntRect> >*, WebCore::CompositingState&, bool&)+1291)
I/DEBUG:     #03  pc 003454bb  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::computeCompositingRequirements(WebCore::RenderLayer*, WTF::HashMap<WebCore::RenderLayer*, WebCore::IntRect, WTF::PtrHash<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::IntRect> >*, WebCore::CompositingState&, bool&)+1291)
I/DEBUG:     #04  pc 003454bb  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::computeCompositingRequirements(WebCore::RenderLayer*, WTF::HashMap<WebCore::RenderLayer*, WebCore::IntRect, WTF::PtrHash<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::IntRect> >*, WebCore::CompositingState&, bool&)+1291)
I/DEBUG:     #05  pc 003454bb  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::computeCompositingRequirements(WebCore::RenderLayer*, WTF::HashMap<WebCore::RenderLayer*, WebCore::IntRect, WTF::PtrHash<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::RenderLayer*>, WTF::HashTraits<WebCore::IntRect> >*, WebCore::CompositingState&, bool&)+1291)
I/DEBUG:     #06  pc 00346c55  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::updateCompositingLayers(WebCore::CompositingUpdateType, WebCore::RenderLayer*)+213)
I/DEBUG:     #07  pc 0020e727  /system/lib/libwebcore.so (WebCore::FrameView::layout(bool)+1159)
I/DEBUG:     #08  pc 0068126f  /system/lib/libwebcore.so (WebCore::Document::updateLayout()+127)
I/DEBUG:     #09  pc 0068bbda  /system/lib/libwebcore.so (WebCore::Document::updateLayoutIgnorePendingStylesheets()+90)
I/DEBUG:     #10  pc 005ead53  /system/lib/libwebcore.so (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue(int, WebCore::EUpdateLayout) const+467)
I/DEBUG:     #11  pc 005f35e9  /system/lib/libwebcore.so (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue(int) const+41)
I/DEBUG:     #12  pc 005e68d7  /system/lib/libwebcore.so (WebCore::CSSComputedStyleDeclaration::getPropertyValue(int) const+55)
I/DEBUG:     #13  pc 006297f8  /system/lib/libwebcore.so (WebCore::CSSStyleDeclaration::getPropertyValue(WTF::String const&)+88)
I/DEBUG:     #14  pc 004d9475  /system/lib/libwebcore.so (WebCore::CSSStyleDeclarationInternal::getPropertyValueCallback(v8::Arguments const&)+181)
I/DEBUG:     #15  pc 000efdd4  <unknown>
I/DEBUG:     #16  pc 0005cf6b  <unknown>
I/DEBUG:     #17  pc 000bb32f  <unknown>
I/DEBUG:     #18  pc 00003b41  <unknown>
I/DEBUG:     #19  pc 000f47ce  <unknown>
I/DEBUG:     #20  pc 0001a5a3  <unknown>
I/DEBUG:     #21  pc 000065e3  <unknown>
I/DEBUG:     #22  pc 00003b41  <unknown>
I/DEBUG:     #23  pc 00024c59  <unknown>
I/DEBUG:     #24  pc 00024dad  <unknown>
I/DEBUG:     #25  pc 00003b41  <unknown>
I/DEBUG:     #26  pc 0001a59c  <unknown>
I/DEBUG:     #27  pc 000d7172  <unknown>
I/DEBUG:     #28  pc 0001a5a3  <unknown>
I/DEBUG:     #29  pc 000d40ed  <unknown>
I/DEBUG:     #30  pc 00017bf9  <unknown>
I/DEBUG:     #31  pc 00008c2a  <unknown>
I/DEBUG:          997b969c  00000000  
I/DEBUG:          997b96a0  00000000  
I/DEBUG:          997b96a4  00000000  
I/DEBUG:          997b96a8  00000000  
I/DEBUG:          997b96ac  00000000  
I/DEBUG:          997b96b0  00000000  
I/DEBUG:          997b96b4  00000000  
I/DEBUG:          997b96b8  00000000  
I/DEBUG:          997b96bc  00000000  
I/DEBUG:          997b96c0  00000000  
I/DEBUG:          997b96c4  00000000  
I/DEBUG:          997b96c8  00000000  
I/DEBUG:          997b96cc  00000000  
I/DEBUG:          997b96d0  00000000  
I/DEBUG:          997b96d4  00000000  
I/DEBUG:          997b96d8  00000000  
I/DEBUG:     #00  997b96dc  9ad1cdd4  /system/lib/libwebcore.so (WebCore::RenderLayer::updateLayerPosition()+52)
I/DEBUG:          997b96e0  b84902e4  [heap]
I/DEBUG:          997b96e4  b8490090  [heap]
I/DEBUG:          997b96e8  0000000f  
I/DEBUG:          997b96ec  0000002f  
I/DEBUG:          997b96f0  b8490090  [heap]
I/DEBUG:          997b96f4  00000001  
I/DEBUG:          997b96f8  9ad2204e  /system/lib/libwebcore.so (WebCore::RenderLayer::repaintIncludingNonCompositingDescendants(WebCore::RenderBoxModelObject*)+14)
I/DEBUG:          997b96fc  b827f428  [heap]
I/DEBUG:          997b9700  9ba8b488  /system/lib/libwebcore.so
I/DEBUG:          997b9704  b8490090  [heap]
I/DEBUG:          997b9708  997b9748  [stack:11949]
I/DEBUG:          997b970c  9ad35d38  /system/lib/libwebcore.so (WebCore::RenderLayerCompositor::updateBacking(WebCore::RenderLayer*, WebCore::RenderLayerCompositor::CompositingChangeRepaint)+344)
I/DEBUG:          997b9710  b8490014  [heap]
I/DEBUG:          997b9714  b848fe3c  [heap]
I/DEBUG:          997b9718  00000012  
I/DEBUG:          ........  ........
I/DEBUG:     #01  997b9750  b8490360  [heap]
I/DEBUG:          997b9754  b8490090  [heap]
I/DEBUG:          997b9758  00000000  
I/DEBUG:          997b975c  997b98e0  [stack:11949]
I/DEBUG:          997b9760  997ba84f  [stack:11949]
I/DEBUG:          997b9764  b843a9e4  [heap]
I/DEBUG:          997b9768  00000034  
I/DEBUG:          997b976c  00000180  
I/DEBUG:          997b9770  b848fe3c  [heap]
I/DEBUG:          997b9774  b85257f8  [heap]
I/DEBUG:          997b9778  9ace0300  /system/lib/libwebcore.so (WebCore::RenderBox::dirtyLineBoxes(bool)+80)
I/DEBUG:          997b977c  43400000  
I/DEBUG:          997b9780  b83fe51c  [heap]
I/DEBUG:          997b9784  997b9788  [stack:11949]
I/DEBUG:          997b9788  004a0000  
I/DEBUG:          997b978c  b848feb8  [heap]
I/DEBUG:          ........  ........
I/DEBUG:     #02  997b9aa0  b804b028  [heap]
I/DEBUG:          997b9aa4  b8490360  [heap]
I/DEBUG:          997b9aa8  00000000  
I/DEBUG:          997b9aac  997b9c30  [stack:11949]
I/DEBUG:          997b9ab0  997ba84f  [stack:11949]
I/DEBUG:          997b9ab4  b83fe51c  [heap]
I/DEBUG:          997b9ab8  00000000  
I/DEBUG:          997b9abc  00000001  
I/DEBUG:          997b9ac0  b86fd038  [heap]
I/DEBUG:          997b9ac4  b86fd368  [heap]
I/DEBUG:          997b9ac8  997b9b48  [stack:11949]
I/DEBUG:          997b9acc  9adac54a  /system/lib/libwebcore.so (WebCore::TransformState::move(int, int, WebCore::TransformState::TransformAccumulation)+58)
I/DEBUG:          997b9ad0  b83fe678  [heap]
I/DEBUG:          997b9ad4  b8294d4c  [heap]
I/DEBUG:          997b9ad8  00580b05  
I/DEBUG:          997b9adc  b83fe770  [heap]
I/DEBUG:          ........  ........
I/DEBUG:     (no map below)
I/DEBUG:     (no map for address)
I/DEBUG:     20c1e000-20c1f000 



回答2:


Are you are using a customized version of Android ? a specific mod? if you do - there is always a chance the problem is a result of that ROM. There have been cases where a WebView has experienced problems in specific version of Android or on specific ROMs. Some link: https://code.google.com/p/chromium/issues/detail?id=481420 http://googlechromereleases.blogspot.com.au/2015/04/android-webview-stable-update.html http://forum.xda-developers.com/verizon-htc-one-m8/help/android-webviewer-update-huge-turd-t3091192/post60333480#post60333480 Android System WebView crashes Android apps! "Tombstones are disabled on JB MR2+ user builds"

Check if you WebView is up to date. if it is - uninstall the updates and check if the problem is still there. If it's NOT up to date - do an update and check if the problem persist. most chances it won't.

In addition - this problem will probably not happen much. in most devices that I've worked with - WebView is reliable and stable.

good luck.




回答3:


I had a similar issue after loading a google maps object/or any 2d canvas object in a web view on my Nexus 5X and Nexus 6P device running Android 6.0.x.

I appears though that this related to a hardware bug reported here: https://code.google.com/p/chromium/issues/detail?id=541145

A fix or workaround seems to be on it's way in upcoming webview versions.

Until the new webview version comes I had to go with the proposed fix of setting the webview to software rendering. This makes the map slow but it dosent crash at least.

if(isNexus5xOr6p() && android.os.Build.VERSION.SDK_INT >= 11)
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

public boolean isNexus5xOr6p() {

     if(getDeviceName().contains("nexus 6p") || getDeviceName().contains("nexus 5x"))
                    return true;
                else
                    return false;
        }


public String getDeviceName() {
        String manufacturer = Build.MANUFACTURER;
        String model = Build.MODEL;
        if (model.startsWith(manufacturer)) {
            return model.toLowerCase();
        }
        return (manufacturer + " " + model).toLowerCase();
}



回答4:


Try to remove these lines:

wv.clearCache(true);
wv.clearHistory();

wv.setDownloadListener(new DownloadListener() {
    @Override
        public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition,      String mimetype, long contentLength) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setType(mimetype);
            intent.setData(Uri.parse(url));
            startActivity(intent);
        }
    });

wv.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            MainActivity.this.setProgress(progress * 1000);
        }
        public boolean onConsoleMessage(ConsoleMessage cm) {
            Log.d("MyProject: WebView: ", cm.message() + " -- From line "
                + cm.lineNumber() + " of "
                + cm.sourceId() );
        return true;
    }
    });

It's possible that your version has problem with chrome client



来源:https://stackoverflow.com/questions/34895838/android-webview-crash-after-url-loading

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!