我正在使用内置Web View的Android开发浏览器。其中我遇到一个问题,当我访问http://crashmybrowser.com以检测选项卡在我的浏览器上崩溃时,我的整个浏览器应用程序崩溃了。然而,当对chrome或opera进行相同的测试时,这些浏览器在崩溃中幸免于难,并且只有特定的选项卡崩溃,这是因访问上述网站而预期的。 任何人都可以帮助理解我如何在使用Webview的浏览器上处理此崩溃。
注意:我已经测试过,在访问http://crashmybrowser.com网站时,使用内置于webview中的Android的其他浏览器也会崩溃。
崩溃日志下面:
E/chromium(24703): ### WebView Version 44.0.2403.90 (code 240309050)
--------- beginning of crash
F/libc (24703): Fatal signal 11 (SIGSEGV), code 2, fault addr 0x7f928c4fe0 in tid 24744 (Thread-461)
I/DEBUG ( 1078): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 1078): Build fingerprint: 'google/volantis/flounder:5.0.2/LRX22L/1816899:user/release-keys'
I/DEBUG ( 1078): Revision: '0'
I/DEBUG ( 1078): ABI: 'arm64'
I/DEBUG ( 1078): pid: 24703, tid: 24744, name: Thread-461 >>> net.browse.Browser <<<
I/DEBUG ( 1078): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7f928c4fe0
I/DEBUG ( 1078): x0 000000104530c660 x1 0000000000000003 x2 0000000000000000 x3 0000000000001be4
I/DEBUG ( 1078): x4 00000010e9e10140 x5 0000000000000000 x6 0000000000000000 x7 0000007fab948000
I/DEBUG ( 1078): x8 0000007f929c0100 x9 0000000000000010 x10 0000007fab948e98 x11 0000000000000001
I/DEBUG ( 1078): x12 0000000000000001 x13 0000000000000033 x14 00000055ab3a9000 x15 003b9aca00000000
I/DEBUG ( 1078): x16 0000007f98a4c2d8 x17 0000007fab8c4f64 x18 0000000000000000 x19 000000104530c660
I/DEBUG ( 1078): x20 000000104530c660 x21 0000000000000003 x22 0000000000000000 x23 0000000000000000
I/DEBUG ( 1078): x24 0000007f929c00e8 x25 00000010452041c4 x26 0000000000000001 x27 0000007f98605444
I/DEBUG ( 1078): x28 00000000fffffffe x29 0000007f928c5000 x30 0000007f977073cc
I/DEBUG ( 1078): sp 0000007f928c5000 pc 0000007f97701360 pstate 00000000a0000000
I/DEBUG ( 1078):
I/DEBUG ( 1078): backtrace:
I/DEBUG ( 1078): #00 pc 0000000001a97360 /data/app/com.google.android.webview-2/lib/arm64/libwebviewchromium.so
W/ActivityManager( 1323): Force finishing activity net.browse.Browser/.ui.activities.BrowseContainerActivity
I/DEBUG ( 1078):
I/DEBUG ( 1078): Tombstone written to: /data/tombstones/tombstone_02
E/JavaBinder( 1323): !!! FAILED BINDER TRANSACTION !!!
W/ActivityManager( 1323): Exception thrown during pause
W/ActivityManager( 1323): android.os.TransactionTooLargeException
W/ActivityManager( 1323): at android.os.BinderProxy.transactNative(Native Method)
W/ActivityManager( 1323): at android.os.BinderProxy.transact(Binder.java:496)
W/ActivityManager( 1323): at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:701)
W/ActivityManager( 1323): at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:852)
W/ActivityManager( 1323): at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2754)
W/ActivityManager( 1323): at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2611)
W/ActivityManager( 1323): at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2453)
W/ActivityManager( 1323): at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:11511)
W/ActivityManager( 1323): at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:11408)
W/ActivityManager( 1323): at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:12087)
W/ActivityManager( 1323): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:11603)
W/ActivityManager( 1323): at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
E/lowmemorykiller( 146): Error writing /proc/24703/oom_score_adj; errno=22
I/OpenGLRenderer( 1323): Initialized EGL, version 1.4
I/WindowState( 1323): WIN DEATH: Window{af1d060 u0 net.browse.Browser/net.browse.Browser.ui.activities.BrowseContainerActivity}
W/LocationOracleImpl( 1863): Best location was null
I/Zygote ( 1084): Process 24703 exited due to signal (11)
I/ActivityManager( 1323): Process net.browse.Browser (pid 24703) has died
答案 0 :(得分:3)
与Chrome或Opera不同,Android WebView在单个进程中运行,并与您的活动共享该进程。如果网页开始过度使用内存(如您所提到的页面),那么您无法在应用程序方面做任何事情来防止崩溃。
您的应用程序中可以有多个进程(请参阅http://developer.android.com/guide/components/processes-and-threads.html#Processes)并在单独的进程中运行包含WebView的活动。然后WebView崩溃不会影响您的主应用程序。但请注意,如果活动将托管多个WebView(例如,作为浏览器的选项卡),其中一个崩溃将导致整个活动及其托管的所有其他WebView。因此,它仍然与Chrome不同,其中标签被分组到进程中,并且一个选项卡中的崩溃只会关闭同一组中的标签,但不会打开您打开的所有标签。
您可以尝试从Chromium源中获取,而不是在浏览器中使用WebView,请参阅https://www.chromium.org/developers/how-tos/android-build-instructions