Уровни ведения журнала для Android
у меня возникли некоторые трудности с настройкой ведения журнала Android. Вот как выглядит мой код:
довольно просто, не так ли?
, у меня совсем немного труда получить Log.isLoggable(«MY_TAG», Log.VERBOSE) возвращает true.
Per http://developer.android.com/reference/android/util/Log.html, я попытался Добавить локальный.файл prop в каталог /data/, который выглядит следующим образом:
но не повезло. Я тоже попробовал:
но это не сработало.
любые идеи о том, что я делаю неправильно здесь? Я запускаю Android 2.1-update1 на Nexus 1, если это имеет значение.
3 ответов
кажется, что более поздние версии Андроид /data/local.prop для записи только root. The adb push команда, по-видимому, изначально создает файлы с предоставлением каждому доступа для чтения/записи (потому что маска файла по умолчанию 777 ). Андроид, мудро, игнорирует /data/local.prop так как это может быть угрозой безопасности.
я экспериментировал только с Android 2.3.3, и 4.1.2. У первого нет проблем с чтением a local.prop это мир, доступный для записи, в то время как последний, кажется, молча игнорировать содержимое файла.
создание local.prop файл, как описано в исходном вопросе:
а затем, нажав его на устройство следующим образом, кажется, делает трюк:
вы можете дважды проверьте, чтобы убедиться, что значения в local.prop читали исполнитель:
- /data/local.prop читается только во время загрузки.
- более поздние версии Android, как представляется, требуют, чтобы разрешения на должен быть правильно установлен, или он не будет читать. Файл должен быть доступен для записи только суперпользователю.
используя adb shell setprop log.tag.MyAppTag VERBOSE также работать. Проблема в том, что значения свойств теряются после перезагрузки.
важная цель-не отправлять производственное приложение с тонной вызовов журнала, оставшихся в нем, увеличивая его размер и даже, возможно, даже влияя на его производительность.
для этого я рекомендую поместить эти константы в начало каждого класса, который будет иметь вызовы журнала:
теперь, где вы входите, сделайте это:
включите журналы, изменив DEBUG постоянное значение true. (Если вы хотите, вы могли бы иметь один класс с этими статика для всего кода вашего приложения. Это имеет смысл для небольшого приложения, но по мере того, как все становится большим, приятно решить, какие части включить вход в систему.)
делая это, когда вы создаете свое приложение с DEBUG = false , весь ваш код журнала не только не выполняется, но и полностью удален из вашего приложения. Это приятно, потому что это позволяет оставить довольно обширный вход в ваш код, который будет включен, когда вам это нужно, не беспокоясь о том, как это повлияет на размер ваше приложение для доставки. В основном просто бросайте журналы туда, где они вам нужны, и не беспокойтесь о том, чтобы оставить их.
это подход, который принимает много рамок Android. Например,ManagerService Активность.
это имеет эти константы вверху, и различные строки журнала, разбросанные по всему на их основе. (И куча других констант суб-отладки для различных аспектов этого, так как этот файл смехотворно глупо велик.)
Источник
Уровни журнала Android
Android поддерживает различные уровни журналов, Verbose, Debug, Info, Warn и Error. Я понимаю, как работают уровни ведения журнала; Меня больше интересует типичный результат, ожидаемый для заданного уровня.
Например, при разработке приложения мне может быть любопытно, когда какой-то метод что-то делает (это часто бывает для целей отладки). Я просмотрю журналы, чтобы убедиться, что методы вызываются в ожидаемом порядке, если сетевой ответ – это то, что, как я думаю, должно быть, если парсеры найдут нужную информацию и т. Д.
Почему кто-то использует Verbose vs Debug vs Info?
С точки зрения разработчика, для первого, второго или стороннего приложения не все журналы для целей отладки? (Предполагая, что разработчики не смотрят журналы для удовольствия … Я не такой садистский)
С точки зрения потребителя, когда s *** попадает в вентилятор, и им необходимо обратиться в службу поддержки клиентов, потому что их супер важное / деловое приложение не работает, разработчик использует журнал для целей отладки.
Единственная причина, по которой я мог видеть использование подробностей или информации, – это, вероятно, операции сбора данных / хранилища данных. Если да, зачем использовать verbose vs info.
Не уверен. Если я злоупотребляю этим или если инфраструктура андроида …
Я в основном следую тому, что должен сказать Томаш Нуркевич при рассмотрении уровня ведения журнала:
ОШИБКА – случилось что-то ужасное, что нужно немедленно расследовать. Никакая система не может переносить элементы, зарегистрированные на этом уровне. Пример: NPE, недоступная база данных, критически важный случай использования не может быть продолжен.
WARN – процесс может быть продолжен, но проявляйте особую осторожность. Пример: «Приложение, запущенное в режиме разработки» или «Консоль администрирования не защищена паролем». Приложение может переносить предупреждающие сообщения, но они всегда должны быть оправданы и проверены.
INFO – Важный бизнес-процесс завершен. В идеальном мире администратор или продвинутый пользователь должен понимать сообщения INFO и быстро узнать, что делает приложение. Например, если заявка касается бронирования авиабилетов, в каждом билете должно быть только одно заявление INFO, в котором говорится: «[Кто] забронировал билет с [Где] до [Где]». Другое определение сообщения INFO: каждое действие значительно изменяет состояние приложения (обновление базы данных, внешний системный запрос).
VERBOSE – очень подробная информация, предназначенная только для разработки. Вы можете сохранять сообщения трассировки в течение короткого периода времени после развертывания в рабочей среде, но относить эти операторы журнала как временные, которые должны или могут быть отключены в конечном итоге. Различие между DEBUG и VERBOSE является наиболее сложным, но если вы поместите инструкцию регистрации и удалите ее после того, как функция была разработана и протестирована, она, вероятно, должна быть на уровне VERBOSE.
Мой самый любимый уровень – WTF (2.2+), который, как предполагается, будет означать «Какая ужасная неудача», для ситуаций, которые никогда не должны происходить.
Обычно я использую «информацию» для простых сообщений.
Источник
Ускоряем телефон в пару кликов
У вас зависает телефон при запуске приложений или сильно нагружается система?
Сегодня я расскажу, как без сторонних приложений ускорить свой смартфон. Для этого нужно включить всего пару настроек, которые находятся в режиме разработчика. Как туда попасть?
1. Заходим в главные «Настройки» — «О телефоне». Здесь несколько раз быстро нажимаете на версию MIUI, пока не появится сообщение, что вы стали разработчиком.
Для других телефонов нужно найти пункт «Номер сборки». Нажимаете несколько раз, пока не появится сообщение, что вы стали разработчиком.
2. Теперь переходим в «Расширенные настройки» на телефоне. Заходим в пункт «Для разработчиков».
3. Нажимаем «Буфер журнала» и видим, что по умолчанию стоит 256 Кб. Необходимо выставить 16 Мб.
4. Теперь ищем блок настроек «Трассировка системы» . Заходим в него и первым делом отключаем «Записывать действия приложений, доступных для отладки» . После этого открываем блок «Категории» . Здесь ищем пункт «power:Power Management» и ставим галочку — Ок.
Эти простые настройки должны ускорить ваш телефон.
А теперь предлагаю зайти в интересный блок настроек «Настройки Game Driver» Что же это за настройка?
Бывает так, что когда нагружаете свой смартфон «тяжелыми» приложениями, то он виснет?
Если у вас такое происходит зайдите в блок «Настройки Game Driver» и выставьте для «тяжелого» приложения «Game Driver» по умолчанию. После этого вы заметите, что все притормаживания и лаги исчезнут.
Этот Game Driver реально работает. Он повышает производительность телефона, когда вы используете «тяжелые» приложения или игры. Просто выберите приложение и установите по умолчанию использовать Game Driver.
Пробуйте и пишите в комментариях о полученном результате.
Источник
Как включить / отключить уровни журнала в Android?
Например, у меня есть много операторов журнала для отладки.
При развертывании этого приложения на телефоне устройства я хочу отключить подробное ведение журнала, откуда я могу включить / отключить ведение журнала.
18 ответов
Распространенный способ — создать int с именем loglevel и определить его уровень отладки на основе loglevel.
Позже вы можете просто изменить LOGLEVEL для всех уровней вывода отладки.
Verbose никогда не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда ведутся.
Таким образом, вы можете рассмотреть возможность удаления отчетов подробного журнала, , возможно, с помощью ProGuard, как предложено в другом ответе .
Согласно документации, вы можете настроить ведение журнала на устройстве разработки с помощью свойств системы. Устанавливаемое свойство — log.tag. , и для него должно быть установлено одно из следующих значений: VERBOSE , DEBUG , INFO , WARN , ERROR , ASSERT или SUPPRESS . Дополнительная информация об этом доступна в документацию по методу isLoggable() .
Вы можете временно установить свойства с помощью команды setprop . Например:
В качестве альтернативы вы можете указать их в файле ‘/data/local.prop’ следующим образом:
Более поздние версии Android , похоже, требуют, чтобы /data/local.prop был доступен только для чтения . Этот файл читается во время загрузки, поэтому вам нужно будет перезагрузить его после обновления. Если /data/local.prop доступен для записи всем, он, скорее всего, будет проигнорирован.
Наконец, вы можете установить их программно, используя System.setProperty() метод.
Самый простой способ — это, вероятно, запустить ваш скомпилированный JAR через ProGuard перед развертыванием с такой конфигурацией, как:
Это — помимо всех других оптимизаций ProGuard — удалит все подробные операторы журнала непосредственно из байт-кода.
Я выбрал простой путь — создал класс-оболочку, который также использует списки переменных параметров.
Лучше всего использовать SLF4J API + некоторые его реализации.
Для приложений Android вы можете использовать следующее:
- Android Logger — это легкая, но простая в настройке реализация SLF4J ( 10
Удаление журнала с помощью proguard (см. Ответ от @Christopher) было простым и быстрым, но это привело к тому, что трассировки стека из производства не соответствовали источнику, если в файле была какая-либо запись отладки.
Вместо этого здесь используется метод, который использует разные уровни ведения журнала при разработке и производстве, предполагая, что proguard используется только в производственной среде. Он распознает производство, проверяя, переименовал ли proguard заданное имя класса (в этом примере я использую «com.foo.Bar» — вы должны заменить его на полное имя класса, которое, как вы знаете, будет переименовано proguard).
В этом методе используется обычное ведение журнала.
Log4j или slf4j также можно использовать в качестве фреймворков для ведения журналов в Android вместе с logcat. См. Проект android-logging-log4j или поддержка log4j в android
Существует крошечная замена стандартному классу журнала Android — https://github.com/zserge/log
По сути, все, что вам нужно сделать, это заменить импорт из android.util.Log на trikita.log.Log . Затем в вашем Application.onCreate() или в каком-нибудь статическом инициализаторе проверьте наличие BuilConfig.DEBUG или любого другого флага и используйте Log.level(Log.D) или Log.level(Log.E) , чтобы изменить минимальный уровень журнала. Вы можете использовать Log.useLog(false) , чтобы вообще отключить ведение журнала.
Это позволяет вам точно контролировать журналы. Вы можете, например, отключить все журналы или только журналы некоторых пакетов или классов.
Более того, он добавляет некоторые полезные функции (например, вам не нужно передавать тег для каждого журнала).
Я создал служебную программу / оболочку, которая решает эту проблему + другие распространенные проблемы с ведением журнала.
Утилита отладки со следующими функциями:
- Обычные функции, предоставляемые классом Log, заключены в теги LogMode .
- Журналы входа-выхода метода: могут быть отключены переключателем
- Выборочная отладка: отладка определенных классов.
- Измерение времени выполнения метода: измерение времени выполнения для отдельных методов, а также общее время, затраченное на все методы класса.
- Включите класс в свой проект.
- Для начала используйте его так же, как и методы android.util.Log.
- Используйте функцию журналов входа-выхода, размещая вызовы методов entry_log () — exit_log () в начале и в конце методов в вашем приложении.
Я попытался сделать документацию самодостаточной.
Предложения по улучшению этой утилиты приветствуются.
Бесплатно использовать / делиться.
Загрузите его с GitHub.
Вот более сложное решение. Вы получите полную трассировку стека, а метод toString () будет вызываться только в случае необходимости (Производительность). Атрибут BuildConfig.DEBUG будет иметь значение false в производственном режиме, поэтому все журналы трассировки и отладки будут удалены. Компилятор горячих точек имеет возможность удалить вызовы из-за отключения конечных статических свойств.
В очень простом сценарии ведения журнала, когда вы буквально просто пытаетесь писать на консоль во время разработки для целей отладки, может быть проще всего просто выполнить поиск и заменить перед производственной сборкой и закомментировать все вызовы журнала или системы. out.println.
Например, если вы не использовали «Журнал». где бы то ни было, кроме вызова Log.d или Log.e и т. д., вы можете просто выполнить поиск и замену во всем решении, чтобы заменить «Журнал». с «// Журнал.» чтобы закомментировать все ваши вызовы журналирования, или в моем случае я просто везде использую System.out.println, поэтому перед тем, как перейти к производству, я просто сделаю полный поиск и заменю на «System.out.println» и заменю на «//System.out.println».
Я знаю, что это не идеально, и было бы неплохо, если бы возможность находить и комментировать вызовы Log и System.out.println были встроены в Eclipse, но до тех пор, пока это не произойдет, самый простой, быстрый и лучший способ сделать это — закомментировать поиском и заменить. Если вы сделаете это, вам не придется беспокоиться о несоответствии номеров строк трассировки стека, потому что вы редактируете исходный код и не добавляете никаких накладных расходов, проверяя конфигурацию уровня журнала и т. Д.
В моих приложениях у меня есть класс, который является оболочкой для класса журнала, который имеет статическую логическую переменную, называемую «состояние». На протяжении всего кода я проверяю значение переменной «состояния» с помощью статического метода перед фактической записью в журнал. Затем у меня есть статический метод для установки переменной «состояния», которая гарантирует, что значение будет общим для всех экземпляров, созданных приложением. Это означает, что я могу включить или отключить все ведение журнала для приложения за один вызов — даже когда приложение работает. Полезно для звонков в службу поддержки . Это означает, что вы должны придерживаться своих правил при отладке и не возвращаться к использованию стандартного класса журнала, хотя .
Также полезно (удобно), что Java интерпретирует логическую переменную как false, если ей не было присвоено значение, что означает, что ее можно оставить как false, пока вам не понадобится включить ведение журнала 🙂
Мы можем использовать класс Log в нашем локальном компоненте и определить методы как v / i / e / d. При необходимости мы можем позвонить и дальше.
пример показан ниже.
Здесь сообщение для string , а args — это значение, которое вы хотите напечатать.
Для меня часто бывает полезно установить разные уровни ведения журнала для каждого тега.
Я использую этот очень простой класс-оболочку:
Теперь просто установите уровень журнала для каждого тега в начале каждого класса:
Другой способ — использовать платформу ведения журналов, которая позволяет открывать и закрывать журналы. Иногда это может дать большую гибкость даже в производственном приложении, какие журналы должны быть открыты, а какие закрыты, в зависимости от того, какие проблемы у вас есть, например:
- Дровосек
- Shipbook (отказ от ответственности: я являюсь автором этого пакета)
Прочтите, пожалуйста, эту статью, где дается полный комплект:
Источник