Proguard не удаляет вызовы журнала

При компиляции моего приложения с помощью Ant я вижу подробный вывод Proguard, и у меня есть настройки для удаления операторов журнала (см. Ниже), но когда я запускаю apk-релиз, все операторы журнала, которые я пытался удалить, присутствуют.

У меня есть 2 проекта, каждый из которых включает общий проект. Два основных проекта и общий проект имеют файл proguard.cfg, каждый из которых содержит фрагмент для удаления операторов журнала.

Есть ли что-то, чего мне не хватает?

** Все мои операторы журнала - это Log.d(...)

proguard.cfg

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontobfuscate
-forceprocessing
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

person chris    schedule 17.02.2012    source источник
comment
Только что перепроверил, раз ты заставил меня побеспокоиться. Я определенно не вижу ни одного из моих Log.d o/p для сборки выпуска Ant. Я фильтрую Logcat o/p по его PID, и я просто вижу материал dalvik GC_CONCUURRENT.   -  person NickT    schedule 18.02.2012
comment
У меня есть эта проблема. У меня Прогард 4.4.   -  person ron    schedule 05.05.2012


Ответы (3)


Здесь ваш файл proguard в порядке, но есть одна деталь, которую вы можете упустить.

В вашем файле gradle у вас, вероятно, есть что-то вроде этого:

buildTypes {
    release {
        minifyEnabled true

        proguardFiles getDefaultProguardFile('proguard-android.txt), 'proguard-rules.pro'
    }
}

Проверьте getDefaultProguardFile('proguard-android'), поэтому, если вы хотите оптимизировать его, вам следует изменить его на getDefaultProguardFile('proguard-android-optimize.txt').

Я потратил некоторое время, чтобы понять это, увидел ваш вопрос, но все еще не смог удалить мои Log вызовы в моем коде. Итак, я нашел эту ссылку, которая объясняет, что необходимо изменить файл оптимизации, чтобы proguard мог оптимизировать.

https://developer.android.com/tools/help/proguard.html#enabling-gradle

person wviana    schedule 23.03.2016
comment
proguard-android-optimize.txt исправил это для меня! Спасибо за объяснение - вы определенно заслуживаете пива за это! - person Tobliug; 13.08.2019

Вы не можете использовать assumenosideeffects без оптимизации Proguard.

person forlayo    schedule 14.05.2012

Вместо того, чтобы удалять или комментировать все ваши сообщения журнала с помощью pro-guard, вы можете сделать что-то вроде этого. Создайте служебный класс, который в основном является оболочкой для системы ведения журнала Android.

public class Util{

    public static boolean showLogs = true;
    public static String myTag = 'My Tag';

    public static void logD(String message){
        if (Util.showLogs)      
            Log.d(myTag, message);
    }
}

Перед тем, как скомпилировать приложение для распространения, я просто вызываю showLogs = true;, после чего все сообщения журнала подавляются.

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

person slayton    schedule 17.02.2012
comment
Я должен не согласиться здесь. Я полагаюсь на идентичное заявление о предполагаемых побочных эффектах для удаления строк журнала из моего проекта, и это работает - я не получаю журнал o/p в сборках выпуска Ant. Единственная разница между моим proguard.cfg и этим заключается в том, что у меня есть только один проект, и я не указываю -dontobfuscate или -forceprocessing - person NickT; 18.02.2012
comment
@NickT: я удалил два упомянутых вами элемента, которых нет в вашем файле proguard.cfg, но я все еще вижу операторы журнала. Это стоило попробовать. - person chris; 18.02.2012
comment
@slayton: согласно документам Proguard, assumenosideeffects удалит вызовы методов, которые не имеют побочных эффектов, соответствующих спецификациям класса. proguard.sourceforge.net/index.html#manual/usage.html - person chris; 18.02.2012
comment
Это будет не тот результат. Вы все еще делаете конкатенацию строк здесь, а удаление кода не будет. - person Ika; 22.02.2015