У меня есть приложение, которое использует много вызовов 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(...);
}
При необходимости категории ошибок и предупреждений могут быть сохранены. Но убедитесь, что оптимизация и сжатие включены для сборки только тогда, когда эффективное удаление кода эффективно