Как собрать встроенную трассировку без предварительного разрешения READ_LOGS? - PullRequest
9 голосов
/ 17 сентября 2011

У меня есть приложение, которое в основном является нативным кодом, написанным на C: Simon Tatham's Puzzles . Когда я улавливаю сбой (с обработчиком сигнала), обратная трассировка Java покажет мне только смутную область проблемы:

W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles.resizeEvent(Native Method)
W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles$1.handleMessage(SGTPuzzles.java:126)
W System.err: at android.os.Handler.dispatchMessage(Handler.java:99)

Что мне нужно для надежды на диагностику, так это собственная обратная трассировка , которую платформа Android записывает в журнал:

I DEBUG   :          #02  pc 0003e8ae  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG   :          #03  pc 0003ed62  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG   :          #04  pc 00059060  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so

Насколько я знаю, Отчеты о сбоях в Android Market не содержат собственных следов ... не так ли?

Таким образом, в настоящее время у меня есть свой собственный сборщик сбоев и репортер, описанный в этом предыдущем вопросе , который предложит перенести вас в окно составления электронной почты с вашим логином. Это работает достаточно хорошо, с одной проблемой: пользователи не читают (или не верят) объяснение в описании пакета и отпугиваются запросом разрешения.

Permission request to read logs; comments about it from users

Меня беспокоит не эти несколько комментариев, а неизвестное количество людей, которые убежали, даже не установив его. : - (

Итак, как мне получить исходную трассировку при сбое, не заставляя игру требовать разрешения на просмотр журналов? Возможные решения включают:

  • Я не прав, и Android Market на самом деле выдаст мне нативных следов в эти дни?
  • Порекомендуйте, когда я поймал сбой, что люди сразу установят и запустят Log Collector ? Это то, к чему я сейчас склоняюсь. У кого-нибудь есть хороший пример того, как это делается, с хорошо написанным пояснительным текстом?
  • Получив сбой с помощью обработчика сигнала (что я могу сделать), есть ли способ прочитать мою собственную встроенную трассировку стека? Сложнее на Android / Bionic, чем на платформах glibc, нет backtrace(). Редактировать: Кажется, что требуется многое из этого: http://github.com/android/platform_system_core/tree/master/debuggerd - включение достаточного количества этого в проект было бы излишним, раздутым, трудным, неподдерживаемым, ломким при изменениях / дополнениях ABI. Не похоже на хорошее использование времени.

Ответы [ 2 ]

6 голосов
/ 01 октября 2011

Редактировать: Начиная с Jelly Bean, ни вы, ни Log Collector не можете прочитать вывод debuggerd, потому что READ_LOGS пропал . : - (

Но в отчетах о сбоях Play Console теперь присутствуют собственные трассировки стека (по крайней мере, в конце 2014 года), что делает все это гораздо менее необходимым.

Ранее:

Я дам свой ответ в виде git commit:

https://github.com/chrisboyle/sgtpuzzles/commit/e9917f1ffe93f9d9963463db849e3768beafccee

Это делегирование Log Collector, как я намекал выше. Я улавливаю сбой, как и раньше (см. в моем предыдущем обсуждении того, как это сделать ), как и раньше, отображается экран «упс, я разбился», и если пользователь нажимает кнопку «Отчет», то я предлагаю ему установить Log Collector если они этого еще не сделали.

Если я отправил пользователя для его установки, как только он закончит установку, я перехватываю PACKAGE_ADDED Intent и запускаю Log Collector с соответствующими параметрами (предупреждаю, что собираюсь это сделать). Это сделано для того, чтобы пользователь не угадал, что он должен щелкнуть «Открыть», чтобы запустить его без моего назначения, темы и фильтров.

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

0 голосов
/ 05 июля 2016

Существует еще один способ доступа ко всем журналам без каких-либо специальных разрешений, но он требует включения удаленной отладки на телефоне.Взгляните на приложение Logcat с открытым исходным кодом без root .

...