Удаление регистрации из производственного кода в Android?

Каков наилучший способ удаления журнала из производственного приложения Android. Похоже, что proguard не делает этого полностью, строки все еще записываются, поэтому мне было интересно, что лучше всего подходит для удаления журнала из производственного кода?

Solutions Collecting From Web of "Удаление регистрации из производственного кода в Android?"

Лучшим решением IMO является запись кода, как показано ниже, где бы вы ни называли методы ведения журнала.

if (SOME_LOG_CONSTANT) Log.d(TAG, "event:" + someSlowToEvaluateMethod()); 

Изменяя 1 константу, вы удаляете все записи, которые вы не хотите. Таким образом, часть if (false) не должна даже попасть в ваш .class-файл, так как компилятор может полностью удалить его (это недостижимый код).

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

SOME_LOG_CONSTANT может быть BuildConfig.DEBUG если вы используете SDK Tools r17 и выше. Эта константа автоматически изменяется для вас в зависимости от типа сборки. Thx @Christopher

Используйте Timber, это хорошая библиотека для настройки ваших журналов: https://github.com/JakeWharton/timber

Пример использования: Timber.d («Созданная деятельность»);

Пример конфигурации:

 public class ExampleApp extends Application { @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Override protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrary.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrary.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrary.logWarning(t); } } } } 

Настройка вашего приложения для выпуска позволяет просто удалить команды Log перед выпуском приложения.

Вы можете отключить ведение журнала, удалив вызовы методов журнала в исходных файлах.

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

 class MyLog { private static final boolean LOGGING = true; //false to disable logging public static void d(String tag, String message) { if (LOGGING) { Log.d(tag, message); } } /* ... same for v, e, w, i */ } 

Используйте это везде, где хотите регистрироваться.

 MyLog.d("Tag", "This will only work with LOGGING true"); 

Я предлагаю вам увидеть этот класс расширения журнала .

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

Более того, он добавляет некоторые полезные функции (например, вам не нужно передавать тег для каждого журнала).

Я бы рекомендовал вам взглянуть на Roboguice – http://code.google.com/p/roboguice/ – если вы используете встроенную функцию Ln, она автоматически не будет регистрировать подписанный APK. Это упрощает тонну других шаблонов Android. Вы можете видеть это в действии с помощью Basedroid – https://github.com/achuinard/basedroid

Вы можете использовать класс DebugLog . Все журналы отключены DebugLog, когда приложение выпущено. И это обеспечивает более понятные журналы DDMS для разработчиков.

Ex;

 DebugLog.e("your message"); 

Просто добавьте этот метод в свой код и используйте Logd вместо Log.d

 private static final String TAG = "your own tag to recognize log entries from this app"; public static void Logd(String txt) { if (BuildConfig.DEBUG&&BuildConfig.BUILD_TYPE.equals("debug")) Log.d(TAG,txt); } 

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

DEBUG и BUILD_TYPE доступны и работают в Android Studio. DEBUG boolean является «отлаживаемой» опцией в файле build.gradle:

 buildTypes { debug { debuggable true runProguard false proguardFile getDefaultProguardFile('proguard-android.txt') } release { debuggable false runProguard true proguardFile getDefaultProguardFile('proguard-android.txt') } } 

BUILD_TYPE автоматически устанавливается на «debug» при запуске в Android Studio.

Поэтому, если вы устанавливаете отладку в false или у пользователя есть версия выпуска, журналы не будут удалены.