Pull to refresh

Пишем функцию обратной связи для Android-приложения

Development for Android *
Недавно поднятая тема о виджетах натолкнула на мысль поделиться своим опытом в, как оказалось, нелегкой задаче поиска ошибок.

Однажды, не найдя приличного виджета для отображения даты на рабочем столе, я написал простенький свой — ExtDateWidget.
Разумеется, проверил его на нескольких эмуляторах и реальном устройстве и выложил в Маркет. Но то, что работает на моем телефоне и в эмуляторе совсем не обязательно работает везде. Сообщения об ошибках поражают разнообразием самих отчетов и описанным поведением абсолютно незамысловатого приложения едва ли в сотню строк. От самых банальных: виджет не показывается на столе или не обновляется в полночь; до экзотики в виде сбрасывания отдельно взятой настройки (уверяю, абсолютно идентичной всем другим) или появлении наложенных копий виджета при обновлении (в это вообще невозможно поверить, но описано очень подробно).
Конечно, страница отчетов об ошибках в Маркете — пустая, да и записи в ней не всегда наталкивают на суть.

Как решать проблемы пользователей?



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

На верный путь натолкнул проект на Google Code — send-me-logs.
Идея проста: собрать лог (тот самый, который можно посмотреть в Dalvik Debug Monitor) и выслать его на почту разработчику.
Ключевых изменений я внес не много: для того, чтобы работал фильтр по тэгам, надо добавить ключ -s в вызов LogCat. Еще неплохо бы ограничивать количество выдаваемых строк лога, иначе генерация почтового сообщения может надолго подвесить приложение. Оптимально, на мой взгляд, писать не более 50 строк, но в большинстве случаев и так отчеты приходят гораздо меньшего размера, так что это подстраховка.
Как фильтровать записи лога описано в документации, но я, для небольшого приложения, просто все записи делаю с тэгом ExtDateWidget, тогда вызов выглядит примерно так:

public ArrayList<String> getLog(String tag) {
	ArrayList<String> lines = new ArrayList<String>(); 
	/* процедура, аналогичная по сути send-me-logs, только с ключем -s */
	collectLog(lines, null, null, new String[] {tag}); 
	return lines;
}
	
ArrayList<String> logLines = getLog("ExtDateWidget"); 



Для полноты картины дописываем к логу текущие настройки:

mSettings = PreferenceManager.getDefaultSharedPreferences(mContext); 
...
StringBuilder setsString = new StringBuilder("Settings: \n");
Map<String, ?> sets = mSettings.getAll();
if (sets != null) {
	for (String key: sets.keySet()) {
		setsString.append(key).append(": ")
				.append(String.valueOf(sets.get(key))).append("\n");
	}
}


Преимущества метода: если ваше приложение нужное, найдутся активные пользователи, готовые не просто дать отчет с описанием некорректного поведения, но и потестируют попытки исправить ошибку. Мой виджет — в меру популярен, но даже для него стало приходить больше отчетов, чем я могу обработать. Не могу сказать, что сразу все сообщения об ошибках стали осмысленными, но как минимум автоматически добавляется версия системы и модель аппарата. Вообще, мне показалось, что лояльность пользователей повысилась уже только потому, что функция отчета об ошибке показывает, что разработчику не все равно.
К тому же, система логов удобная, можно сделать несколько вариантов отчетов, например, только уровня Warning и выше или полностью все, включая системные ошибки. Плюс не требуется разрешения на работу с интернетом, пользователи не должны переживать, что их данные потихоньку уплывают в неизвестном направлении.
Еще я очень надеюсь, что наличие такой функции на видном месте подтолкнет пользователя не писать комментарий «will not work», а напрямую сообщать о сути проблемы.

Недостатки: находятся параноики, которые даже при отсутствии требования обращения к сети и наличии описания системы отчетов об ошибках, переживают, зачем это приложению их «конфиденциальная информация» и снижают оценки.
Еще хуже, если у вас есть реклама, которой интернет необходим.

Альтернативный метод — использовать отдельное приложение для генерации отчетов. На Маркете такое уже есть. На сайте показан пример использования: http://l6n.org/android/sendlog.shtml.
Преимущества очевидны: вашему приложению вообще не нужны дополнительные разрешения, а если кто-то захочет помочь, то скорее всего поставит небольшую утилитку (ей нужно только чтение логов), чтобы отпарвить вам отчет и получить эксклюзивное исправление. Хотя дополнительные операции для пользователей — это все-таки недостаток метода.

Ну и для особо трудолюбивых возможен вариант написания своего приложения-генератора отчетов, хотя видимых преимуществ это, на мой взгляд, не дает.

Надеюсь, описанные методы помогут повысить оценки вашим приложениям.
Tags: androidобратная связь
Hubs: Development for Android
Total votes 12: ↑9 and ↓3 +6
Comments 4
Comments Comments 4

Popular right now