Должен ли я комментировать мои запросы на журнал при создании моего последнего пакета?

У меня есть приложение, которое использует много вызовов Log.d() или Log.e() для отладки. Теперь я хочу создать свой последний пакет для выпуска. Функция экспорта Android из Eclipse упоминает, чтобы удалить флаг "Debuggable" в манифесте, который я сделал. Должен ли я также прокомментировать все вызовы Log для повышения производительности моего приложения или эти вызовы ничего не сделают в пакете окончательной версии без отладки?

Ответ 1

Я подклассифицировал класс журнала классу Trace, который отображает методы в Log. Таким образом, я делаю Trace.d(TAG, "blah" ), а затем в методе Trace.d код выполняется только на основе статической конечной переменной класса LOGGING_LEVEL, которая имеет уровни 1-5 (нет, только ошибки, ошибки и предупреждения, ошибки и предупреждения и информация, и все, включая отладку). При создании APK производства Proguard удаляет весь код, который не используется в приложении, поэтому он делает это для меня.

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

Эта структура позволяет мне добавить в приложение много БОЛЬШЕ протоколирования, что значительно облегчает проблемы отладки, но без какого бы то ни было эффекта на APK производства

public class Trace
{
    public static final int    NONE                         = 0;
    public static final int    ERRORS_ONLY                  = 1;
    public static final int    ERRORS_WARNINGS              = 2;
    public static final int    ERRORS_WARNINGS_INFO         = 3;
    public static final int    ERRORS_WARNINGS_INFO_DEBUG   = 4;

    private static final int          LOGGING_LEVEL   = ERRORS_ONLY;        // Errors + warnings + info + debug (default)

    public static void e(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=1) Log.e(tag,msg);
    }

    public static void e(String tag, String msg, Exception e)
    {
        if ( LOGGING_LEVEL >=1) Log.e(tag,msg,e);
    }

    public static void w(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=2) Log.w(tag, msg);
    }

    public static void i(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=3) Log.i(tag,msg);
    }

    public static void d(String tag, String msg)
    {
        if ( LOGGING_LEVEL >=4) Log.d(tag, msg);
    }

}

Ответ 2

Это заставило меня проверить мое предположение о том, что строки log.d в коде каким-то образом не появятся в подписанной версии apk без флагов отладки, установленных в манифесте, я был не прав, они все еще появляются.

Быстрый поиск по SO привел меня к принятому ответу на этот вопрос: Удалите все сообщения об ошибках отладки перед публикацией: есть ли инструменты для этого?

Он работает очень хорошо, и вам не нужно менять какой-либо код.

Ответ 3

От developer.android.com:

Отключить ведение журнала и отладки и очистки данных/файлов. Для выпуска вы следует убедиться, что средства отладки отключены, и отладка и другие ненужные данные/файлы удалены из вашего проекта приложения.

Удалить андроид: debuggable = "true" атрибут из элемент манифеста. Удалить журнал файлы, файлы резервных копий и другие ненужные файлы из приложения проект. Проверьте наличие личных или проприетарные данные и удалить их как необходимо. Деактивировать любые вызовы в журнале методы в исходном коде.

Источник

Ответ 4

Я бы удалил код регистрации, как показано ниже:

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
    public static java.lang.String getStackTraceString(java.lang.Throwable);
}

-assumenosideeffects class java.lang.Exception {
    public void printStackTrace();
}

-assumenosideeffects class * implements org.slf4j.Logger {
    public void trace(...);
    public void debug(...);
    public void info(...);
    public void warn(...);
    public void error(...);
    public boolean isTraceEnabled(...);
    public boolean isDebugEnabled(...);
    public boolean isInfoEnabled(...);
    public boolean isWarnEnabled(...);
    public boolean isErrorEnabled(...);
}

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