安卓致命信号错误11 SIGSEGV在不同版本的JellyBean上发生

9
我的同事和我在使用Android Canvas 对象时遇到了非常奇怪的行为。我们处理一个初始化的画布对象,有选择性地在两个Nexus 7平板电脑之间得到致命信号11错误;其中一个运行4.2.2版本,工作正常,而另一个运行4.3版本即崩溃。我们正在努力找出如何解决问题,这涉及确定错误是由我们导致的还是 Android API 中的某些问题(不太可能)。
当我们尝试在该对象上调用canvas.getWidth()时,会发生错误。
我们的Java代码:(尽管这可能不重要,但Rect来自我们的代码库,它不是android.graphics.Rect


public Rect getViewportBounds() { 
    Canvas can = _diagram._canvas;
    Rect vb = _viewportBounds;
    if (can == null) return vb;
    Point pos = _position;
    int[] approxWindowVals = { (int) pos.getX(), (int) pos.getY() };
    double sc = _scale;
    vb._set(approxWindowVals[0], approxWindowVals[1], Math.max(can.getWidth(), 0) / sc, Math.max(can.getHeight(), 0) / sc);
    return vb;
}

我们从LogCat中得到的信息在这里。
08-09 16:49:14.883: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.893: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.923: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.943: D/abc(4083): onDraw 08-09 16:49:14.943: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.973: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.983: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:15.003: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:15.033: A/libc(4083): 致命信号11(SIGSEGV)于0x00000000处(代码=1),线程4083(egressiontester)。
我们的硬件配置如下:
+---------+------------+-----------------------+
| 平板电脑 | Android操作系统 | 是否出现错误 |
+---------+------------+-----------------------+
| Nexus 7 | 4.2.2      |                     |
| Nexus 7 | 4.3        | 是                   |
+---------+------------+-----------------------+
如果您知道发生这种情况的原因,请告诉我。我们可能需要重新构建Canvas,但我们都很困惑,为什么一个像Canvas这样常见的类在两个完全相同的平板电脑上表现不同。
非常感谢您的支持 :)

2
你使用过硬件加速的画布吗?你试过打开/关闭硬件加速吗? - Andrzej Duś
@AndrzejDuś,最初硬件加速被关闭了,打开它确实解决了问题,但我们正在开发一个类库,因此我们必须为尽可能多的用户和用例编写代码。 - deadboy
2个回答

1
如果更改标志为false,则在第二次布局时不渲染可以解决我的问题。

欢迎来到 Stack Overflow!请不要在回答中添加“谢谢”。花些时间在网站上,您将获得足够的特权,可以为您喜欢的答案投票,这是 Stack Overflow 表达感谢的方式。 - John Dvorak

0
我们通过在使用完Canvas对象后将其简单地赋值为null来解决了这个问题。在幕后,这可能会导致Android API使用一个有效地址重新初始化它。
问题已经解决,但是地址问题在4.2.2上隐式解决而不是在4.3上解决,这可能是一个错误,应该进一步研究。

如果你认为这是Android的一个bug,请在Android bug跟踪器上报告。现在,你是唯一一个可以进一步研究它的人:没有其他人拥有相同的代码或指令来复现。 - Dan Hulme
这不是一个 bug。你不应该持有 Canvas 的引用。此外,你可能不应该使用 Canvas.getWidth,因为它的含义取决于它是否为硬件加速视图(全窗口大小 vs 仅视图大小)。 - Delyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接