应用程序在原生代码中使用画布上的矩阵计算导致 Android 4.3+ 崩溃



在你花更多的时间阅读这篇文章之前:我将自己回答这个问题。我花了一整天的时间调试这个,并认为我应该分享。

我是一个应用程序的开发人员,该应用程序基本上是高尔夫球场上的一种逐向导航。因此,我有一些需要旋转的图像以使图像朝北。这显然需要一些矩阵转换。

在Android 4.3被推送到HTC One之后,我收到了一些抱怨,每当有人想使用它时,该应用程序就会关闭。"可惜已经停止了。"

我最初的调试会话没有清除任何内容。没有抛出任何例外,所以最初没有什么可步走的。我在日志中发现了以下内容:

11-12 14:12:56.257:ASSERT/libc(5206):致命信号 11 (SIGSEGV) 在 0x00000000 (代码 = 1),线程 5206 (ndroid.appname)

由于无处可真正开始调试,我经历了很长时间的老派步骤,识别可能的嫌疑人和大量的咖啡因,但最终我在一位同事的帮助下找到了它,他编写了代码,结果证明是罪魁祸首。

事实证明,这条线导致了所有问题: canvas.setMatrix(null);

这一行的目的很简单:将转换矩阵重置回单位矩阵,以便可以应用新的转换。根据文档,这是允许的:

将当前矩阵完全替换为指定的矩阵。如果矩阵参数为 null,则当前矩阵将重置为标识。

显然,在 Android 上工作的人从 4.3 代码中删除了对空参数的检查,但认为没有必要更新文档抛出一个体面的异常。相反,这条线只是崩溃了一切,而没有太多关于它发生在哪里以及为什么的线索。

如果有人感兴趣,我已经提交了错误报告。我希望它或这个线程可以帮助处于相同情况的人。

相关内容

  • 没有找到相关文章

最新更新