Как удалить вызовы Log.d() в сборке выпуска приложения для Android?

Я заметил, что моя сборка релиза, которую я сделал в eclipse через:

Инструменты Android -> Экспорт подписанного пакета приложения...

Мой proguard-project.txt содержит:

-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(...);
}

Тем не менее, если я запускаю приложение на устройстве и использую CatLog для просмотра журналов, я вижу, что есть все сообщения Log.d(), Log.v(), которых там быть не должно. Есть ли что-то еще, что я должен установить? Я провел много часов в гугле, но четких инструкций по этому вопросу нет. Ну, большинство вещей, которые я нахожу, это люди с похожими проблемами, но без решений.


person f470071    schedule 11.10.2015    source источник
comment
Есть ли в вашей конфигурации proguard (специфичной для проекта или из SDK) -dontoptimize?   -  person laalto    schedule 11.10.2015
comment
@laalto Да, это так. Эта опция связана с -assumenosideeffects?   -  person f470071    schedule 11.10.2015


Ответы (3)


Убедитесь, что в вашей конфигурации proguard нет -dontoptimize. Это оптимизатор proguard, который удаляет вызовы методов, которые «не имеют побочных эффектов».

В SDK по умолчанию proguard-android.txt есть -dontoptimize. Вместо этого используйте proguard-android-optimize.txt и не добавляйте -dontoptimize в конфигурацию proguard для конкретного проекта.

Не могли бы вы указать какой-нибудь источник, где я мог бы прочитать по этому вопросу. Если он есть конечно.

Ну, для начала, -assumenosideeffects указан в параметрах оптимизации в документации.

Еще одна вещь беспокоит, что я читал, что использование proguard-android-optimize.txt может вызвать проблемы на некоторых устройствах. Итак, это своего рода ситуация «уловка 22».

Proguard в целом может иметь побочные эффекты. Вам необходимо тщательно протестировать приложение, обработанное proguard.


Если вы хотите удалить ведение журнала из выпускных сборок без использования proguard, вы можете, например. добавлять

if (BuildConfig.DEBUG)

перед каждым вызовом ведения журнала, где BuildConfig — это конфигурация сборки, созданная плагином Gradle для Android. Поскольку DEBUG есть константа времени компиляции, компилятор Java видит, что условие никогда не может быть истинным в конфигурации выпуска, и не будет выдавать байт-код внутри условного блока.

person laalto    schedule 11.10.2015
comment
Спасибо. Не могли бы вы указать какой-нибудь источник, где я мог бы прочитать по этому вопросу. Если он есть конечно. Еще одна вещь беспокоит, что я читал, что использование proguard-android-optimize.txt может вызвать проблемы на некоторых устройствах. Итак, это своего рода ситуация «уловка 22». - person f470071; 11.10.2015
comment
Спасибо. Я принял ваши ответы и проголосовал за них, потому что они указывают на ошибку в моих настройках. Однако все еще не ясно, и я разместил еще один вопрос: stackoverflow.com/questions/33070599/. - person f470071; 12.10.2015

ты пробовал это?

-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
    }
person schwertfisch    schedule 11.10.2015

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

person Daniel L.    schedule 11.10.2015
comment
Хотя это удалит журнал output, он не удалит журнал вызовов, если только вы не выполните логическую проверку константы в месте вызова (позволяя компилятору исключить вызов). Некоторые люди хотят полностью удалить вызовы журнала для повышения производительности, размера двоичного файла или запутывания. - person fadden; 11.10.2015