Согласно Google, я должен « деактивировать любые вызовы методов Log в исходном коде » перед публикацией моего приложения для Android в Google Play. Выдержка из раздела 3 контрольного списка публикации :
Убедитесь, что вы отключили ведение журнала и отключили параметр отладки, прежде чем создавать приложение для выпуска. Вы можете отключить ведение журнала, удалив вызовы методов журнала в исходных файлах.
Мой проект с открытым исходным кодом велик, и каждый раз, когда я выпускаю его, больно делать это вручную. Кроме того, удаление строки журнала потенциально сложно, например:
if(condition)
Log.d(LOG_TAG, "Something");
data.load();
data.show();
Если я прокомментирую строку журнала, то условие применяется к следующей строке, и скорее всего, load () не вызывается. Достаточно ли редки такие ситуации, чтобы я мог решить, что их не должно быть?
Итак, есть ли лучший способ сделать это на уровне исходного кода? Или, может быть, какой-то умный синтаксис ProGuard для эффективного, но безопасного удаления всех строк журнала?
источник
sed 's_^\(\s*Log\.\)_;//'`date|tr -s \ -`'\1_g'
вместо этого.Ответы:
Я считаю, что гораздо более простое решение - забыть все
if
проверки повсюду и просто использовать ProGuard, чтобы исключить любые вызовыLog.d()
илиLog.v()
вызовы методов, когда мы вызываем нашуrelease
цель Ant .Таким образом, мы всегда выводим отладочную информацию для обычных сборок, и нам не нужно вносить какие-либо изменения в код для релизных сборок. ProGuard также может делать несколько проходов через байт-код для удаления других нежелательных операторов, пустых блоков и может автоматически включать короткие методы, где это необходимо.
Например, вот очень простая конфигурация ProGuard для Android:
Таким образом, вы должны сохранить это в файл, а затем вызвать ProGuard из Ant, передав свой только что скомпилированный JAR-файл и JAR-платформу Android, которую вы используете.
Смотрите также примеры в руководстве ProGuard.
Обновление (4,5 года спустя): в настоящее время я использую Timber для Android регистрации.
Он не только немного лучше, чем
Log
реализация по умолчанию - тег журнала устанавливается автоматически и легко регистрировать отформатированные строки и исключения, но вы также можете указать различные способы ведения журнала во время выполнения.В этом примере операторы регистрации будут записываться в logcat только в отладочных сборках моего приложения:
Древесина настроена в моем
Application
onCreate()
методе:Тогда в любом другом месте моего кода я могу легко войти:
Посмотрите пример приложения Timber для более продвинутого примера, где все операторы журнала отправляются в logcat во время разработки, а в процессе производства не регистрируются отладочные операторы, но об ошибках молча сообщается Crashlytics.
источник
Все хорошие ответы, но когда я закончил свою разработку, я не хотел использовать операторы if для всех вызовов Log, а также не хотел использовать внешние инструменты.
Поэтому решение, которое я использую, состоит в том, чтобы заменить класс android.util.Log своим собственным классом Log:
Единственное, что мне нужно было сделать во всех исходных файлах, это заменить импорт android.util.Log своим собственным классом.
источник
Log.d("tag", someValue.toString());
это, очень легко забыть проверить someValue на предмет отсутствия значения null, что означает, что он может запуститьNullPointerException
в работе. Он предлагает безопасное решение, но он обманет вас. Мы,private static boolean DEBUG
а затемif(DEBUG)Log.d(TAG, msg);
String
. Полное решение описано здесь . Это, очевидно, имеет еще один недостаток: каждый вызов должен редактироваться (а не только одна строка импорта).static final boolean LOG = BuildConfig.DEBUG
этот файл , и вам не нужно будет его изменять.Я предлагаю иметь где-то статическое логическое значение, указывающее, регистрироваться или нет:
Затем, куда бы вы ни захотели войти в свой код, просто сделайте это:
Теперь, когда для MyDebug.LOG установлено значение false, компилятор удаляет весь код внутри таких проверок (поскольку он является статическим финалом, он знает, что во время компиляции код не используется).
Для более крупных проектов вы можете захотеть использовать логические значения в отдельных файлах, чтобы иметь возможность легко включать или отключать ведение журнала там, где это необходимо. Например, это различные константы регистрации, которые мы имеем в оконном менеджере:
С соответствующим кодом вроде:
источник
Решение Кристофера Proguard является лучшим, но если по какой-то причине вам не нравится Proguard, вот решение с очень низкими технологиями:
Журналы комментариев:
Раскомментируйте логи:
Ограничение состоит в том, что ваши инструкции по ведению журнала не должны занимать несколько строк.
(Выполните эти строки в оболочке UNIX в корне вашего проекта. Если вы используете Windows, получите слой UNIX или используйте эквивалентные команды Windows)
источник
//
против;//
)Я хотел бы добавить некоторые подробности об использовании Proguard с Android Studio и Gradle, поскольку у меня было много проблем с удалением строк журнала из окончательного двоичного файла.
Для того, чтобы сделать
assumenosideeffects
в Proguard работы, есть обязательное условие.В вашем файле Gradle вы должны указать использование
proguard-android-optimize.txt
файла по умолчанию.На самом деле, в
proguard-android.txt
файле по умолчанию оптимизация отключена с двумя флагами:proguard-android-optimize.txt
Файл не добавляет эти строки, так что теперьassumenosideeffects
может работать.Затем лично я использую SLF4J , тем более, когда я разрабатываю некоторые библиотеки, которые распространяются среди других. Преимущество в том, что по умолчанию нет вывода. И если интегратору нужны какие-то выходные данные журнала, он может использовать Logback for Android и активировать журналы, чтобы журналы можно было перенаправить в файл или в LogCat.
Если мне действительно нужно удалить журналы из окончательной библиотеки, я добавляю в свой файл Proguard (после включения
proguard-android-optimize.txt
файла, конечно):источник
proguard-android-optimize.txt
качестве файла Proguard по умолчанию и-assumenosideeffects
в пользовательском файле Proguard были необходимы! Я использую R8 Shinker (по умолчанию в настоящее время) и логирование Android по умолчанию.Я настоятельно рекомендую использовать Timber от Джейка Уортона
https://github.com/JakeWharton/timber
это решает вашу проблему с включением / отключением плюс автоматически добавляет класс тега
просто
журналы будут использоваться только в вашей версии отладки, а затем использовать
или
печатать
"Ваш класс / MSG" без указания тега
источник
Я использовал класс LogUtils, как в примере приложения Google IO. Я изменил это, чтобы использовать специфическую для приложения константу DEBUG вместо BuildConfig.DEBUG, потому что BuildConfig.DEBUG ненадежен . Тогда в моих классах у меня есть следующее.
источник
Build.DEBUG
который я использовал. Я также отказался от различных «правильных» обходных путей и использую аналогичное стилевое решение для вас.Я хотел бы рассмотреть возможность использования средства ведения журнала roboguice вместо встроенного android.util.Log
Их средство автоматически отключает отладочные и подробные журналы для сборок выпуска. Кроме того, вы получаете бесплатные функции (например, настраиваемое поведение при ведении журнала, дополнительные данные для каждого журнала и многое другое)
Использование proguard может быть довольно сложным делом, и я не буду испытывать трудности с настройкой и настройкой его работы с вашим приложением, если у вас нет веских причин для этого (отключение журналов не является хорошим)
источник
Я публикую это решение, которое применяется специально для пользователей Android Studio. Я также недавно обнаружил Timber и успешно импортировал его в свое приложение, выполнив следующие действия:
Поместите последнюю версию библиотеки в ваш build.gradle:
Затем в Android Studios, перейдите в Edit -> Find -> Replace in Path ...
Введите
Log.e(TAG,
или, однако, вы определили свои сообщения журнала в"Text to find"
текстовое поле. Тогда вы просто замените егоTimber.e(
Нажмите Найти и затем заменить все.
Android Studios теперь будет просматривать все ваши файлы в вашем проекте и заменять все журналы тембрами.
Единственная проблема, с которой я столкнулся при использовании этого метода, заключается в том, что gradle впоследствии выдает миллион сообщений об ошибках, потому что не может найти «Timber» в импорте для каждого из ваших java-файлов. Просто нажмите на ошибки, и Android Studios автоматически импортирует «Timber» в вашу Java. Как только вы сделали это для всех ваших файлов ошибок, gradle снова скомпилирует.
Вам также нужно поместить этот фрагмент кода в ваш
onCreate
метод вашегоApplication
класса:Это приведет к регистрации приложения только тогда, когда вы находитесь в режиме разработки, а не в производстве. Вы также можете
BuildConfig.RELEASE
войти в режим релиза.источник
import android\.util\.Log\;
Замените на:import android\.util\.Log\;\nimport timber\.log\.Timber\;
За android.util.Log предоставляет способ включить / отключить журнал:
По умолчанию метод isLoggable (...) возвращает false, только после того, как вы установили proprop в устройстве, вот так:
Это означает, что любой журнал выше уровня DEBUG можно распечатать. Ссылка на Android документ:
Таким образом, мы могли бы использовать собственный журнал утилиты:
источник
Если вы можете запустить глобальную замену (один раз), и после этого сохранить некоторые кодирования конвенции, вы можете следовать шаблону , часто используемый в Android рамках .
Вместо того чтобы писать
иметь это как
Теперь proguard может удалить StringBuilder и все строки и методы, которые он использует в пути, из оптимизированного выпуска DEX. Используйте,
proguard-android-optimize.txt
и вам не нужно беспокоиться об android.util.Log в вашемproguard-rules.pro
:С плагином для Android Studio gradle, он достаточно надежный, поэтому вам не нужны дополнительные константы для управления зачисткой.
BuildConfig.DEBUG
источник
Добавьте следующие строки в Proguard-Rules.txt файл
источник
Это то, что я делал на своих проектах Android.
В Android Studio мы можем выполнить аналогичную операцию, нажав Ctrl + Shift + F для поиска по всему проекту (Command + Shift + F в MacOs) и Ctrl + Shift + R для замены ((Command + Shift + R в MacOs))
источник
У меня очень простое решение. Я использую IntelliJ для разработки, поэтому детали меняются, но идея должна применяться ко всем IDE.
Я выбираю в корне моего исходного дерева, щелкаю правой кнопкой мыши и выбираю «заменить». Я тогда решил заменить все "Журнал". с "// Log." Это удаляет все записи журнала. Чтобы вернуть их позже, я повторяю ту же самую замену, но на этот раз, чтобы заменить все "// Журнал". с "Журнал."
Работает просто отлично для меня. Просто не забудьте установить замену с учетом регистра, чтобы избежать несчастных случаев, таких как «Диалог». Для дополнительной уверенности вы также можете сделать первый шаг с помощью «Журнала». в качестве строки для поиска.
Brilliant.
источник
Как подсказал комментарий Зсерге,
его библиотека журналов обеспечивает простое включение / отключение переключения печати журналов, как показано ниже.
Кроме того, требуется только изменить
import
строки, и ничего не нужно менять дляLog.d(...);
утверждения.источник
Я улучшил вышеупомянутое решение, предоставляя поддержку различных уровней журнала и автоматически меняя уровни журнала в зависимости от того, выполняется ли код на работающем устройстве или на эмуляторе.
источник
ProGuard сделает это за вас при сборке релиза, и теперь хорошие новости от android.com:
http://developer.android.com/tools/help/proguard.html
Инструмент ProGuard сокращает, оптимизирует и запутывает ваш код, удаляя неиспользуемый код и переименовывая классы, поля и методы с семантически скрытыми именами. В результате получается файл .apk меньшего размера, который сложнее проанализировать. Поскольку ProGuard затрудняет обратное проектирование вашего приложения, важно использовать его, когда ваше приложение использует функции, чувствительные к безопасности, например, когда вы лицензируете свои приложения.
ProGuard интегрирован в систему сборки Android, поэтому вам не нужно вызывать его вручную. ProGuard запускается только при сборке приложения в режиме выпуска, поэтому вам не нужно иметь дело с запутанным кодом при сборке приложения в режиме отладки. Запуск ProGuard совершенно необязателен, но настоятельно рекомендуется.
Этот документ описывает, как включить и настроить ProGuard, а также как использовать инструмент восстановления, чтобы декодировать запутанные следы стека.
источник
Мне нравится использовать Log.d (TAG, некоторая строка, часто String.format ()).
TAG - это всегда имя класса
Transform Log.d (TAG, -> Logd (в тексте вашего класса
Таким образом, когда вы будете готовы сделать релиз-версию, установите MainClass.debug в false!
источник
Логи можно удалить с помощью bash в linux и sed:
Работает для многострочных журналов. В этом решении вы можете быть уверены, что журналы отсутствуют в рабочем коде.
источник
Я знаю, что это старый вопрос, но почему вы не заменили все вызовы журнала чем-то вроде Boolean logCallWasHere = true; // --- остальная часть вашего журнала здесь
Вот почему вы будете знать, когда вы хотите вернуть их обратно, и они не повлияют на ваш вызов оператора if :)
источник
Почему бы просто не сделать
? Не нужно никаких дополнительных библиотек, никаких правил proguard, которые могут испортить проект, и java-компилятор просто пропустит байт-код для этого вызова, когда вы сделаете релизную сборку.
источник
Log.d("tag","msg");
, а также легко забыть написаниеif(BuildConfig.DEBUG)
части.Вот мое решение, если вы не хотите связываться с дополнительными библиотеками или редактировать свой код вручную. Я создал этот блокнот Jupyter, чтобы просмотреть все файлы Java и закомментировать все сообщения журнала. Не идеально, но это сделало работу за меня.
источник
мой путь:
1) включить режим выбора столбца (alt + shift + insert)
2) выбрать по одному Log.d (TAG, «текст»); часть «Журнал»
3) затем сделайте shift + ctrl + alt + j
4) нажмите стрелку влево
5) сделать сдвиг + конец
6) нажмите удалить.
это удаляет все вызовы LOG одновременно в файле Java.
источник
Вы можете попробовать использовать этот простой традиционный метод:
Ctrl+Shift +R
замещать
С
источник
Просто с kotlin, просто объявите несколько функций верхнего уровня
источник
самый простой способ;
использование
DebugLog
Все журналы отключены DebugLog, когда приложение выпущено.
https://github.com/MustafaFerhan/DebugLog
источник