Debug logger что это за программа на андроид
Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.
Часто процесс поиска и исправления бага состоит из трёх шагов:
- Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
- Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
- Исправление ошибки.
Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.
Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.
Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:
- Открываем Android Studio.
- Создаём проект с шаблоном Empty Activity.
- Выбираем язык Java, так как его, как правило, знают больше людей, чем Kotlin.
Нам автоматически откроются две вкладки: activity_main.xml и MainActivity.java. Сначала нарисуем макет: просто замените всё, что есть в activity_main.xml, на код ниже:
Можете запустить проект и посмотреть, что получилось:
Теперь оживим наше приложение. Скопируйте в MainActivity этот код:
В этом коде всё просто:
- Находим поля ввода, поле с текстом и кнопку.
- Вешаем на кнопку слушатель нажатий.
- По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
- В зависимости от результата выводим «Равно» или «Не равно».
Запустим приложение и введём буквы вместо чисел:
Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «6: Logcat» и видим:
Конечно, метод parseInt может принимать только числовые значения, но никак не буквенные! Даже в его описании это сказано — и мы можем увидеть, какой тип ошибки этот метод выбрасывает (NumberFormatException).
Здесь мы привели один из примеров. Типов ошибок может быть огромное количество, все мы рассматривать не будем. Но все ошибки в Logcat’е указываются по похожему принципу:
- красный текст;
- тип ошибки — в нашем случае это NumberFormatException;
- пояснение — у нас это For input string: "f";
- ссылка на строку, на которой произошла ошибка — здесь видим MainActivity.java:26.
Исправим эту ошибку и обезопасим себя от некорректного ввода. Добавим в наши поля ввода android:inputType="number", а остальной код оставим без изменений:
Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:
На равенство проверили. Введём разные числа:
Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:
- Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
- Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
- Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.
И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:
Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:
Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:
Вы в режиме дебага. Обратите внимание на две вещи:
- Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
- Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.
Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:
Как видим, значения именно такие, какие мы и ввели. Значит, проблема не в получении чисел из полей. Давайте двигаться дальше — нам нужно посмотреть, в правильную ли ветку мы заходим. Для этого можно нажать F8 (перейти на следующую строку выполнения кода). А если следующая точка останова далеко или в другом классе, можно нажать F9 — программа просто возобновит работу и остановится на следующей точке. В интерфейсе эти кнопки находятся здесь:
Остановить дебаггер, если он больше не нужен, можно через CTRL+F2 или кнопку «Стоп»:
В нашем случае неважно, какую кнопку нажимать (F9 или F8). Мы сразу переходим к следующей точке останова программы:
Ветка правильная, то есть логика программы верна, числа firstInt и secondInt не изменились. Зато мы сразу видим, что подпись некорректная! Вот в чём была ошибка. Исправим подпись и проверим программу ещё раз.
Мы уже починили два бага: падение приложения с помощью логов и некорректную логику (с помощью отладчика). Хеппи пас (happy path) пройден. То есть основная функциональность при корректных данных работает. Но нам надо проверить не только хеппи пас — пользователь может ввести что угодно. И программа может нормально работать в большинстве случаев, но вести себя странно в специфических состояниях. Давайте введём числа побольше и посмотрим, что будет:
Не сработало — программа хочет сказать, что 1000 не равна 1000, но это абсурд. Запускаем приложение в режиме отладки. Точка останова уже есть. Смотрим в отладчик:
Числа одинаковые, что могло пойти не так? Обращаем внимание на тип переменной — Integer. Так вот в чём проблема! Это не примитивный тип данных, а ссылочный. Ссылочные типы нельзя сравнивать через ==, потому что будут сравниваться ссылки объектов, а не они сами. Но для Integer в Java есть нюанс: Integer может кешироваться до 127, и если мы вводим по единице в оба поля числа до 127, то фактически сравниваем просто int. А если вводим больше, то получаем два разных объекта. Адреса у объектов не совпадают, а именно так Java сравнивает их.
Есть два решения проблемы:
- Изменить тип Integer на примитив int.
- Сравнивать как объекты.
Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:
Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:
Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.
Нажмём F8 — и перейдём в глубины операционной системы:
Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:
Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:
Запускаем приложение и ловим ошибку:
Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:
- Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
- Или использовать уже готовую конструкцию try / catch:
Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки? :)
Отладка является важным этапом разработки программного обеспечения. Поиск и исправление ошибок позволяют разрабатывать качественные продукты.
В этой статье я хочу поговорить об отладке именно Android приложений. Android Studio предоставляет нам различные инструменты профилирования, такие как:
- logcat – инструмент для просмотра логов приложения, в том числе и исключений при краше. Его можно использовать как в Android Studio, так и в терминале, через adb;
- Android profiler – мощный инструмент, который позволяет просматривать все сетевые запросы, загрузку процессора, памяти и батареи.
Также существует множество сторонних решений, позволяющих просматривать сетевой трафик, базы данных, shared preferences и др.
У всех этих инструментов есть преимущества и недостатки. К их минусам можно отнести следующее:
- множество зависимостей различных инструментов;
- сложность использования – как правило, все инструменты ориентированы на разработчиков и неудобны другим участникам команды, например, тестировщикам, аналитикам или back-end разработчикам. Обычно последним приходится дергать android-разработчиков, чтобы просмотреть какие-либо логи;
- обязательное подключение телефона к компьютеру, например, через usb-кабель.
На данный момент я не нашел ни одного решения, которое объединяло бы различные инструменты отладки и устраняло бы вышеуказанные проблемы. Поэтому я разработал собственное решение.
Android Remote Debugger
Мое решение является очень простым в использовании, так как позволяет отлаживать приложение прямо в браузере, без подключения Android устройства к компьютеру. Данное решение включает в себя четыре раздела для отладки:
Работа с отладчиком
Для работы с отладчиком нужно сделать следующее:
Ниже представлены скриншоты некоторых разделов:
Logging
Database
Network
Описание разделов отладки
Для инициализации библиотеки необходимо вызвать AndroidRemoteDebugger.init(applicationContext) в коде приложения. Также можно указать дополнительные параметры с помощью AndroidRemoteDebugger.Builder :
Logging
Пример вызова: AndroidRemoteDebugger.Log.d("tag", "message") .
Также очень удобно использовать данный метод логирования совместно с библиотекой Timber (автором которой является Jake Wharton), пример:
Network
Database
Данный раздел позволяет просматривать базы данных. Ничего дополнительного для его работы делать не нужно. Необходимо только выбрать базу данных и таблицу. Данные будут показываться страницами по 15 записей. Можно выполнить поиск данных, удалить записи, редактировать их. Можно также выполнить любой sql-запрос.
SharedPreferences
Данный раздел позволяет просматривать все файлы SharedPreferences. Можно выбрать любой файл и просмотреть, удалить, изменить или добавить запись. Также есть возможность удалить сам файл SharedPreferences со всеми данными. Кроме того, можно выполнить поиск по подстрокам.
MTKLogger – программа, значок которой появляется только на устройствах, построенных на процессоре от MTK (MediaTek). Это приложение отвечает за, впрочем, полезную, но для большинства обычных пользователей ненужную функцию – ведение журнала (логов) . Аналогичные функции есть практически во всех операционных системах и во многих программах. Например, в Windows она называется «Журнал операционной системы Windows».
Логи как средство для дебага
Когда дело касается порядка вызова методов, особенно когда методы асинхронные, бегать по коду в режиме дебага не удобно. На помощь приходят логи и android logcat , инструмент, позволяющий получить логи из android приложения.
Разместив вывод в лог в интересующих методах можно наблюдать порядок их вызова.
Мой шаблон для расстановки логов с именем logs выглядит так
Находясь на нужной строчке остается нажать Ctrl + J (вызов диалога добавления шаблона), написать logs и нажать Enter
И IDE сама добавит строку, вида
Быстрое отключение журналирования
Настоятельно рекомендуется удалять все вызовы в готовых приложениях. Если проект очень большой и вызовы журналирования разбросаны по всем местам кода, то ручное удаление (или комментирование) становится утомительным занятием. Многие разработчики используют следующую хитрость — создают обёртку вокруг вызова методов .
Теперь остаётся только присвоить нужное значение переменной isDebug перед созданием готового apk-файла для распространения.
Способ устарел. В 17-й версии Android Build Tools появился класс BuildConfig, содержащий статическое поле DEBUG. Можно проверить следующим образом:
Способ для продвинутых (отсюда) — например, требуется релиз с выводом в лог, или наоборот — debug с выключенным выводом. В этом случае можно создать собственный параметр и добавить его в секцию buildType gradle-файла:
В этом случае конфигурация releaseWithLog будет являться релизной сборкой с ведением логов. Естественно, в коде слегка поменяется проверка:
MTKLogger: что это за программа на Android?
Приложение MTKLogger встречается на смартфонах, которые работают на базе процессора MediaTek. Многие спрашивают, что это за приложение? Ответим так: большинству пользователей приложение совершенно ничего не дает. Почему? MTKLogger это приложение, которое занимается сбором системных логов на устройствах, которые работают на процессорах MTK.
Для чего нужны логи? Как было сказано выше, обыкновенному пользователю они не нужны. Другое дело, к примеру, разработчики, которые могут узнавать, что за сбой произошел в приложении.
Приложение это встроенное и не удаляется. Так, по крайней мере, в нашем примере. Сейчас покажем. Откройте настройки.
Тапните по строке Приложения.
Вуаля, приложение можно только остановить.
Управлять MTKLogger можно через инженерное меню:
Логи сохраняются в основной памяти или на карте памяти.
Способы удаления
Чтобы удалять системные папки, нужны права суперпользователя – root. Если у вас их нет, то вы точно никак не сможете сломать Андроид. При наличии root-прав нужно быть крайне осторожным – удаление важных системных файлов приведет к тому, что вам придется прошивать устройство заново.
Если вы разобрались, какие папки можно безболезненно удалить, то приступайте к очистке памяти с помощью стандартных функций:
- Откройте главное меню Андроид и запустите браузер файлов (менеджер файлов).
- Найдите папку, которую можно удалить. Нажмите на нее и держите палец.
- Когда появится меню, выберите «Удалить».
На скриншоте представлен вариант менеджера с поддержкой множественного выбора. Кнопка удалить находится в данном случае сверху справа в виде иконки корзины.
В стандартном файловом менеджере не отображаются все файлы и папки Android. Чтобы хорошо почистить память устройства, используйте ES Проводник или другой сторонний менеджер файлов.
- Запустите ES Проводник.
- Выберите, что будете чистить – внутреннее хранилище (Internal Storage) или карту памяти.
- Удерживайте палец на папке, которую хотите удалить. Как только он будет отмечен, начните выделять другие файлы и папки.
- После выбора всех элементов для удаления нажмите на кнопку «Удалить» в нижнем меню.
Можно не пользоваться файловыми менеджерами на Android, а просто подключить телефон к компьютеру, выбрав режим медиа-устройство, в котором возможен просмотр и изменение содержимого памяти.
После подключения к компьютеру вы можете открыть внутреннюю память смартфона в проводнике и удалить ненужные папки, освободим место.
Первым делам в настройках можно отключить определение местоположения. Убираем галочки “по спутникам gps” и по “координатам сети”. Если проблема осталась – посмотрим какие еще утилиты определяют ваше местоположение. Заходим в настройки планшета или телефона. Найдите пункт “Местоположение” и нажмите туда. В списке отобразятся последние утилиты запрашивающие геоданные.
- Итак, перейдем в Настройки смартфона или планшета;
- Нас интересует пункт меню Местоположение – зайдем туда;
- В пункте “История местоположений” необходимо отключить галочку с пункта истории – так сервисы гугл перестанут сохранять информацию с вашего устройства(во что слабо верится на самом деле);
- В списке Последние геозапросы отображается список программ и приложений, имеющих доступ к нашему местоположению. Приложений которые последний раз определяли ваше местоположение и активировали геолокацию отображаются вверху в списке;
- Если софт не используется – смело удаляйте;
В случае если приложение необходимо есть другой способ – можно для конкретного приложения отключить эту опцию.
Для существует специальная программа. Запускаем Play Market, в поиске пишите AppOps.
Данная программа находится в бесплатном доступе, весит немного и справляется с задачей. Утилита позволяет запретить отправку местоположения в каждой игре или программе установленной на устройстве. После закачивания и установки запускайте AppOps. В списке всех приложение находите нужное и нажимаете на него. Нас интересует пункт Location. Переводим переключатель в положение “OFF” и программа получит запрет на отправку данных. AppOps обладает другим полезным набором функций, среди которых можно запретить приложениям:
При установке любого приложения обязательно просматривайте права доступа к телефону и разрешение на внесение изменений.
В статье я расскажу, что это такое MTKLogger на устройствах Андроид и можно ли удалять его. Многие люди крайне подозрительно относятся к приложениям, которые появляются на их смартфонах или планшетах из неоткуда и без спроса. Собственно, правильно делают, ведь новой программой может быть нежелательный гость в виде вируса, отправляющего СМС на платные номера и/или собирающего пароли, номера карты и прочую информацию, присутствующую на смартфоне.
Однако не каждое самовольно появившееся приложение является вредоносной программой. Исключением является, например, MTKLogger, значок которого замечали многие пользователи операционной системы Android. Если была обнаружена иконка именно этого приложения, то все в порядке, ничего страшного с устройством не произошло.
Кому и для чего нужно это приложение на Андроиде
Собственно обычному пользователю программа MTKLogger не нужна. Без наличия специальных знаний человек все равно мало что поймет из того, что записалось в журнал.
С другой стороны людям, которые разрабатывают программное обеспечение для Android или занимаются ремонтом телефонов приложение жизненно необходимо и они уже знают что же это MTKLogger на мобильном телефона с ОС Андироид. Именно через него можно узнать, что произошло перед сбоем в программе и как ведет себя то или иное оборудование.
Кому и для чего нужно приложение MTKLogger
MTKLogger – это программа-функция, которая сохраняет все события и действия, выполненные пользователем, при этом занимая всё свободное место в памяти смартфона или на SD-карте. Необходимо только в том случае, если вы этого хотите. MTKLogger можно безопасно отключить и удалить. Это не повлияет на ваше устройство. После удаления приложения может потребоваться отключить функцию регистрации в вашем телефоне, чтобы предотвратить очередное накопление событий журнале в MTKLogger. Программа по сути является кейлоггером. Кейлоггер, иногда называемый регистратором нажатий клавиш или системным монитором, представляет собой тип технологии наблюдения, используемый для мониторинга и записи каждого нажатия клавиши, набранного на клавиатуре конкретного компьютера. Программное обеспечение типа Keylogger также доступно для использования на смартфонах, таких как устройства Apple iPhone и Android.
Злоумышленники часто используют такие утилиты в качестве инструмента-шпиона для кражи персональной информации, учётных данных для входа и конфиденциальной корпоративной информации. Регистраторы кейлоггеров могут также использоваться работодателями для наблюдения за компьютерной деятельностью сотрудников, родителями для контроля за использованием Интернета их детьми, пользователями для отслеживания возможной несанкционированной активности на их устройствах или правоохранительными органами для анализа инцидентов, связанных с кибератаками.
Аппаратный кейлоггер – это небольшое устройство, которое служит коннектором между клавиатурой и ПК (экраном и смартфоном). Девайс подключается через обычный разъем PS/2 или USB-адаптер, благодаря чему спрятать такое устройство для получения конфиденциальных данных несложно. Аппаратный кейлоггер может также иметь форму модуля, который устанавливается внутри самой клавиатуры. Когда пользователь печатает на клавиатуре, кейлоггер собирает каждое нажатие клавиши и сохраняет его как текст на своём собственном миниатюрном жёстком диске, который может иметь до нескольких гигабайт памяти. Чтобы получить доступ к собранной информации, злоумышленнику необходимо позже вернуться и физически удалить устройство. Существуют также беспроводные клавиатурные шпионы, которые могут перехватывать и дешифровать пакеты данных, передаваемые между беспроводной клавиатурой и её приёмником.
Программа для создания кейлогинга Bottom of Form для установки не требует физического доступа к компьютеру пользователя. Приложение может запускаться и работать скрытно, чтобы избежать ручного обнаружения или антивирусного сканирования. Программа кейлоггера обычно состоит из двух файлов, которые устанавливаются в одном каталоге: файл библиотеки динамической компоновки (DLL), который выполняет всю запись, и исполняемый файл, который устанавливает файл DLL и запускает его в работу. Программа записывает каждое нажатие клавиши и периодически загружает информацию через Интернет. Некоторые кейлоггеры способны сохранять и другие данные, например, буфер обмена или создание снимков экрана.
Нужно ли оставлять MTK Logger обычному пользователю
Для обычного пользователя нет особой разницы – он может как удалить это приложение MTKLogger, так и оставить его на смоем смартфоне или планшете. Ни в первом, ни во втором случае ничего плохого не произойдет.
С другой стороны ясно, что эта MTKLogger выполняет некоторые вычисления и, как следствие этого, немного нагружает процессор. Если человек уверен в том, что он не станет пользоваться логами, то он может смело освободить место от приложения, тем самым несколько улучшив работу своего мобильного устройства.
Следует отметить, что со временем журналы, формируемые MTKLogger, могут сильно увеличиться в объёме, и они будут занимать достаточно много места в памяти устройства.
Используем настройки ОС Андроид . и выше
Кроме первого способа, в котором я рассмотрел, как переключить память телефона на карту памяти, существует и другой способ, работающий только на настройках ОС Андроид 6.0 (Marshmallow) или выше, и позволяющий задействовать SD-карту как основную для сохранения файлов и работы с ними. Для его реализации рекомендую сделать копию данных с вашей SD-карты (если таковые на ней имеются), так как данная карта будет отформатирована системой.
- Подключите SD-карту к вашему устройству;
- Перейдите в настройки гаджета, затем в «Хранилище и ЮБС-накопители»;
- Тапните по пункту «SD-карта»;
Тапните по пункту «SD-карта» В меню справа нажмите на «Настройки» — «Внутренняя память» — «Очистить и отформатировать»;
Выберите «Очистить и форматировать» для форматирования вашей карты
Как отключить приложение MTKLogger
Чтобы удалить программу MTKLogger на Андроид необходимо иметь права суперпользователя. Кроме того, вариант со стиранием приложения мы не будем рассматривать еще и по той причине, что не хорошо нарушать целостность системы. Пусть логгер останется на устройстве (он занимает всего пару килобайт), а уберем непосредственно файлы журнала, созданные им, и отключим их ведение.
- Чтобы выключить MTKLogger нужно открыть инженерное меню и отыскать там вкладку Log and Debugging.
- Затем потребуется найти пункт MTKLogger, и там выключить три переключателя – напротив MobileLog, NetworkLog и ModemLog.
- После этого можно закрыть инженерное меню.
- Останется только удалить папку с логами. Она называется MTKLOG и может находиться как на карте памяти, так и в системном хранилищ.
- Найдите ее и просто удалите.
Надеюсь вы разобрались с тем, что такое MTKLogger и теперь понимаете его предназначение.
Хочу начать небольшой разговор о том, как можно получать данные о работе приложения и некоторых его компонентов от пользователей.
Одно дело — разработка, LogCat в Android Studio (если вы из любителей пожестче — можно распечатку в консоли смотреть с помощью adb), и совсем другое — ломать голову над вопросом почему у вас все работает на всем парке тестовых устройств, а пользователь жалуется на абсолютно обратную ситуацию. Коммуникация между разработчиком и конечным пользователем — это хорошо, но совсем другое — видеть своими глазами картинку происходящего (помните, как в матрице — для кого-то это зеленые иероглифы, а для кого-то — женщина в красном?)
Предлагаю разбить задачу на несколько частей, а именно — сбор и хранение логов, способ их передачи из одного приложения в другие с помощью FileProvider, ну и небольшой helper класс для создания писем с аттачами. Итак, поехали.
Кто-то использует System.out.println, кто-то — статические методы класса Log. Я с некоторых пор пришел к написанию своего класса для распечатки логов. Давайте вкратце расскажу почему.
Во-первых, это проще. Как правило, для отслеживания изменений в процессе выполнения приложения я использую одну и ту же метку. И вот однажды я подумал — зачем ты пишешь постоянно Log.i(MY_TAG, «info») если можно сократить немного и убрать из этой формулы одну постоянную?
Во-вторых, расширение логгирования. Это конкретно упирается в нашу задачу — хранение логов в файлах. Можно написать отдельный класс, в который будем передавать какие-то данные, как то: данные и имя файла, но данные мы уже передаем в метод Log.i / Log.e / проч., создавать лишний раз переменную что ли для этого? Некрасиво все это как-то.
Ладно, довольно лирики, давайте лучше взглянем на класс Diagnostics.
Для того, чтобы вывести информацию в LogCat с дефолтной меткой, достаточно написать следующее:
Иногда мне хочется видеть какие методы вызываются и в каких объектах. И с какими параметрами или значениями переменных. В общем, тут важно для меня — где именно производится вызов. Тогда я использую следующую конструкцию
Diagnostics.i(this, “onCreate w/param1 = “ + param1);
где this — это экземпляр класса Caller. Например, для MainActivity вы увидите следующее:
03–29 12:31:53.203 16072–16072/com.isidroid.platform I/Diagnostics: MainActivity.onCreate w/param1 = 200
И все сразу становится понятно — кто вызывает и где вызывает.
А теперь о хранении этой информации.
Как вы уже могли видеть, в классе Diagnostics есть методы для работы с файлами — createLog и appendLog. Объяснять, я думаю, не стоит — первый создает файл, второй — добавляет в него строку. Для новичков или тех, кто ленится читать код, уточню — appendLog создает файл, если его не существует, а createLog всегда создает новый. Чтобы лишней информации там не хранилось.
Файлы хранятся в cache директории, которая, к слову, недоступна для других приложений (ну, если у вас телефон не рутован, конечно).
В общем, теперь процедура распечатки лога и хранения его в файле выглядит следующим образом.
Надеюсь, это выглядит просто в использовании.
Как я уже говорил выше, наши файлы для лога хранятся в некоторой защищенной от чужих глаз папке. Она настолько защищена, что если вы попробуете передать файлы в другое приложение с использованием относительного пути File.getAbsolutePath(), то вы потерпите неудачу.
На помощь к нам мчится FileProvider, друзья!
2. Указываем директории, доступные для шаринга. Для этого создаем файл res/xml/cache_file_paths и для нашего конкретного примера заполняем его.
Конец.
Нет, правда, это все.
На самом деле это довольно мощный инструмент для работы с файлами в вашем приложении, но в рамках поставленной задачи это все, что нам нужно сделать. Подробности — в официальной документации.
Мы с вами почти добрались до конца, осталось дело за малым. Вообще, создание намерения (intent) для отправки писем — это довольно тривиальная задача, чтобы под нее писать отдельный хелпер. Но с другой стороны, если можно причесать код в вашей Activity / Fragment, то почему бы и нет, верно?
Гораздо симпатичнее будет выглядеть какой-нибудь строитель (builder) в коде нежели условия, проверки и лишние циклы. Я за то, чтоб это выносить в отдельный класс (кстати, не только я ратую за разделение представления от бизнес-логики).
Давайте перейдем сразу к сути. Сначала я покажу класс (который вы можете скопировать и использовать не глядя, конечно), а потом пример его использования. Поехали!
Где this — это Activity.
Вы можете самостоятельно указать «рыбу» для текста письма, но я рекомендую использовать те данные, которые указаны в методе buildContent, расширяя их при необходимости. Можно конечно извернуться и применить паттерн «декоратор» для расширения этих данных без модификации класса FeedbackHelper, но лично для меня необходимости в этом не было… Что до вас, то дерзайте!
Читайте также: