Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Используйте 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);
       }
     }
   }
 }

Ответ 3

Конфигурирование приложения для выпуска говорит вам просто удалить команды 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");

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Пример

DebugLog.e("your message");

Ответ 7

Просто добавьте этот метод в свой код и используйте 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 или у пользователя есть версия выпуска, тогда журналы будут удалены.

Ответ 8

Лучший способ - обработать это из моего опыта,

  • во-первых, во время регистрации проверяем флаг BuildConfig.DEBUG для печати журнала.

    Class LogUtils{
    
        public static void log(Class clazz, String message) {
            if (BuildConfig.DEBUG) {//log only in debug mode
            Log.d(clazz.getSimpleName(), message);
            }
        }
    }
    
  • затем включите мини-приложение для вашего модуля приложения gradle, это позволит proguard оптимизировать ваш двоичный

    android {
        buildTypes {
            release {
                minifyEnabled true
                //shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.release
            }
        }
    }
    

это приведет к отладке журналов в ваших отладочных сборках. Но в вашей версии release условие if (BuildConfig.DEBUG) никогда не будет истинным, следовательно, proguard отключит недостижимый код журнала из вашего двоичного файла.