Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
draw(canvas)有时在Android棒棒糖5.0+;在某些设备上-致命信号11(SIGSEGV)_Android_Android Ndk_Android Webview_Android Canvas_Android 5.0 Lollipop - Fatal编程技术网

draw(canvas)有时在Android棒棒糖5.0+;在某些设备上-致命信号11(SIGSEGV)

draw(canvas)有时在Android棒棒糖5.0+;在某些设备上-致命信号11(SIGSEGV),android,android-ndk,android-webview,android-canvas,android-5.0-lollipop,Android,Android Ndk,Android Webview,Android Canvas,Android 5.0 Lollipop,我有一段在UI线程上运行的代码,它要求带有WebView的RelativeLayout在画布上绘制: someRelativeLayoutContainingWebView.draw(canvas); 这条线路在一些Android棒棒糖5.0设备(Nexus 4、Nexus 5)上崩溃,但在其他设备(Nexus 7)上工作。崩溃日志显示以下内容: --------- beginning of crash F/libc (20829): Fatal signal 11 (SIGSEGV),

我有一段在UI线程上运行的代码,它要求带有
WebView
RelativeLayout
画布上绘制:

someRelativeLayoutContainingWebView.draw(canvas);
这条线路在一些Android棒棒糖5.0设备(Nexus 4、Nexus 5)上崩溃,但在其他设备(Nexus 7)上工作。崩溃日志显示以下内容:

--------- beginning of crash
F/libc    (20829): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8d68fc68 in tid 21178 (Thread-860)
W/art     (20829): Attempt to remove local handle scope entry from IRT, ignoring
I/DEBUG   (  184): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  184): Build fingerprint: 'google/occam/mako:5.0/LRX21T/1576899:user/release-keys'
I/DEBUG   (  184): Revision: '11'
I/DEBUG   (  184): ABI: 'arm'
I/DEBUG   (  184): pid: 20829, tid: 21178, name: Thread-860  >>> com.[censored] <<<
I/DEBUG   (  184): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8d68fc68
I/DEBUG   (  184):     r0 8d68fc68  r1 00000020  r2 000000df  r3 20202020
I/DEBUG   (  184):     r4 00000001  r5 8d68fc68  r6 8d68fc68  r7 a62a0241
I/DEBUG   (  184):     r8 b86f9e13  r9 b86f982a  sl ffffffff  fp 000000ff
I/DEBUG   (  184):     ip 20002000  sp a32988f8  lr a62525f9  pc a62a02bc  cpsr 200b0030
I/DEBUG   (  184): 
I/DEBUG   (  184): backtrace:
I/DEBUG   (  184):     #00 pc 003552bc  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #01 pc 003075f7  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #02 pc 002c450f  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #03 pc 002c4589  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #04 pc 002c6b41  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #05 pc 002c6ffb  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #06 pc 002c4b83  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #07 pc 002c4c51  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #08 pc 002adff5  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #09 pc 002fea4f  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #10 pc 002aa35f  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #11 pc 0032d4ef  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #12 pc 002bd2d1  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #13 pc 00e0ef7b  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #14 pc 00e14a4d  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #15 pc 00e14af3  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #16 pc 00e4cbd1  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #17 pc 00e1ccd1  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #18 pc 00e1ce17  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #19 pc 00204333  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #20 pc 0020458d  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #21 pc 002023cb  /system/lib/libwebviewchromium.so
I/DEBUG   (  184):     #22 pc 000158a7  /system/lib/libc.so (__pthread_start(void*)+30)
I/DEBUG   (  184):     #23 pc 0001387b  /system/lib/libc.so (__start_thread+6)
如您所见,它是占据设备整个屏幕的
RelativeLayout
的整个宽度和高度,减去设备的状态栏和软返回/主页按钮栏。我的应用程序不以全屏模式运行

  • WebView显示在屏幕上并呈现在此画布中,还是WebView未附加到视图层次结构并在后台操作
  • WebView附加到视图层次结构,并显示在屏幕上。它占据了屏幕的大部分,顶部少了一个小条

  • 如果您也直接调用WebView.onDraw,会发生这种情况吗
  • 除非重写
    WebView
    类,否则我无法直接调用
    onDraw()
    。然而,在这样做时,坠机事件并未发生

  • 如果您可以创建一个带有repo的APK并将其附加到bug上,那么查看此文件的人将更加容易。你愿意这样做吗?如果没有,您能提供一些关于RelativeLayout中其他元素的详细信息吗
  • 不幸的是,这是一个相当大的项目,
    活动中有很多事情都有这个问题。我将无法公开共享整个源代码,我知道,这使得解决问题更加困难。以下是视图层次结构的框架:

    <RelativeLayout android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/someRelativeLayoutContainingWebView">
        <DrawerLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@+id/topRelativeLayout">
    
            <!-- Main content -->
            <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
                    <WebView
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:id="@+id/primaryWebView"
                            android:scrollbarStyle="insideOverlay"
                            android:fadeScrollbars="true"
                            android:scrollbarThumbVertical="@drawable/scrollbar"
                            android:scrollbarSize="@dimen/scroll_bar_size"/>
    
                    <RelativeLayout>
                        <EditText/>
                        <Button/>
                        <View/>
                        <Button/>
                    </RelativeLayout>
                </RelativeLayout>
    
                <View/>
            </RelativeLayout>
    
            <!-- Navigation drawer -->
            <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="left">
    
                <RelativeLayout>
                    <TextView/>
                    <ViewPager/>
                    <View/>
    
                    <LinearLayout>
                        <Button/>
                        <View/>
                        <Button/>
                    </LinearLayout>
    
                    <LinearLayout>
                        <Button/>
                    </LinearLayout>
    
                    <Button/>
                    <Button/>
                    <Button/>
                </RelativeLayout>
    
                <View/>
            </RelativeLayout>
    
        </DrawerLayout>
    
        <!-- Top bar -->
        <RelativeLayout android:layout_width="match_parent"
                        android:layout_height="@dimen/some_height"
                        id="@+id/topRelativeLayout">
    
            <RelativeLayout>
                <SurfaceView/>
                <TextView/>
            </RelativeLayout>
    
            <Button/>
    
            <RelativeLayout>
                    <EditText/>
                    <Button/>
            </RelativeLayout>
    
        </RelativeLayout>
    
        <View/>
        <ProgressBar/>
        <TextView/>
    </RelativeLayout>
    

    此时不确定您是否可以做些什么。我代表你提出申请。了解问题的原因可以更容易地想出解决办法。如果您能澄清一些事情(最好是关于bug),这将非常有帮助:

  • 您要传递的画布是位图背景的画布,对吗?它有多大?它是否应用了任何变换
  • WebView显示在屏幕上并呈现在此画布中,还是WebView未附加到视图层次结构并在后台操作
  • 如果您也直接调用WebView.onDraw,会发生这种情况吗
  • 如果您可以创建一个带有repo的APK并将其附加到bug上,那么查看此文件的人将更加容易。你愿意这样做吗?如果没有,您能提供一些关于RelativeLayout中其他元素的详细信息吗

  • 这个问题来自一个竞争条件,有时会导致我的代码绘制到属于回收的
    位图的
    画布上。可以使用以下代码再现碰撞:

    Bitmap bmp = Bitmap.createBitmap(someRelativeLayoutContainingWebView.getWidth(), someRelativeLayoutContainingWebView.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bmp);
    bmp.recycle();
    someRelativeLayoutContainingWebView.draw(canvas); // SIGSEGV will happen here
    
    修复竞态条件并确保从不绘制回收的
    位图
    画布
    ,解决了该问题

    另一个有趣的细节是,如果从视图层次结构中删除
    WebView
    ,则会引发
    RuntimeException
    ,而不是发生
    SIGSEGV
    。异常的重要部分如下所示:

    E/AndroidRuntime( 7052): Caused by: java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1cb64604
    E/AndroidRuntime( 7052):    at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1225)
    E/AndroidRuntime( 7052):    at android.graphics.Canvas.<init>(Canvas.java:152)
    
    E/AndroidRuntime(7052):原因:java.lang.RuntimeException:Canvas:试图使用回收的位图android.graphics。Bitmap@1cb64604
    E/AndroidRuntime(7052):位于android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1225)
    E/AndroidRuntime(7052):位于android.graphics.Canvas(Canvas.java:152)
    

    这比
    WebView
    crash提供了更多信息。

    谢谢,我已经添加了对您问题的回答
    E/AndroidRuntime( 7052): Caused by: java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1cb64604
    E/AndroidRuntime( 7052):    at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1225)
    E/AndroidRuntime( 7052):    at android.graphics.Canvas.<init>(Canvas.java:152)