2013-11-16 4 views
1

Прежде чем тратить больше времени на чтение этого, чем нужно: я буду отвечать на этот вопрос сам. Я потратил целый день на отладку и подумал, что должен поделиться.Применение врезается Android 4.3 в машинный код с приложением с помощью матричных вычислений на холсте

Я разработчик для приложения, которое является в основном своего рода поворота к повороту навигации на поля для гольфа. Таким образом, у меня есть изображения, которые нужно повернуть, чтобы сделать изображение ориентированным на север. Это, очевидно, требует некоторых матричных преобразований.

После Android 4,3 получил толкнул на HTC One, я получил несколько жалоб о том, что приложение было просто закрытие всякий раз, когда кто-то хотел использовать его. "К несчастью остановилось."

Моя первая сессия отладки не ясно ничего до. Исключение не было, поэтому сначала ничего не выходило. Я нашел следующее в моих журналах:

11-12 14: 12: 56.257: ASSERT/Libc (5206): фатальный сигнал 11 (SIGSEGV) на 0x00000000 (код = 1), нить (5206 ndroid.appname)

негде, чтобы действительно начать отладку, я был в течение длительного пробега старой школы шагового через все, идентифицирующий вероятные подозреваемые и много кофеина, но в конце концов я понял это с помощью коллеги который написал код, который оказался виновником.

ответ

2

Как выясняется, эта строка вызывала все проблемы: canvas.setMatrix (null);

Цель этой линии была проста: сбросить матрицу преобразования обратно к единичной матрице таким образом, что новое преобразование может быть применено. В соответствии с the documentation это разрешено:

Полностью заменить текущую матрицу на указанную матрицу. Если параметр матрицы равен NULL, то текущая матрица сбрасывается на личность.

Видимо люди, работающие на Android удалили эту проверку на нуль параметр из 4.3 кода, но не сочли нужным либо обновить документацию или бросить достойное исключение. Вместо этого эта строка просто сбрасывает все, не вдаваясь в суть, где это произошло и почему.

Я подал bug report, если кто заинтересован. Надеюсь, что эта нить поможет кому-то в той же ситуации.

+0

В будущем обратитесь к любому, кто найдет эту тему: это была ошибка Android 4.3, исправленная в 4.4. По-прежнему целесообразно использовать 'new Matrix()' вместо 'null' в качестве параметра, потому что уровень API 18 просто перерывает нулевое значение. –