【问题标题】:Proguard is not removing Log callsProguard 没有删除日志调用
【发布时间】:2012-02-17 21:18:51
【问题描述】:

使用 Ant 编译我的应用程序时,我可以看到详细的 Proguard 输出,并且我已经设置了删除日志语句的设置(见下文),但是当我运行发布 apk 时,我试图删除的所有日志语句都在那里.

我有 2 个项目,每个项目都包含一个公共项目。 2个主项目和普通项目各有一个proguard.cfg文件,都包含sn -p删除日志语句。

我有什么遗漏的吗?

** 我所有的日志语句都是 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(...);
}

【问题讨论】:

  • 只是仔细检查了你让我担心的问题。对于 Ant 发布版本,我绝对没有看到我的 Log.d o/p。我正在通过它的 PID 过滤 Logcat o/p,我只看到了 dalvik GC_CONCUURRENT 的东西
  • 我有这个问题。我运行 Proguard 4.4

标签: android proguard


【解决方案1】:

这里你的 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

【讨论】:

  • proguard-android-optimize.txt 为我修复了它!感谢您的解释 - 你绝对值得一瓶啤酒!
【解决方案2】:

你不能在没有 Proguard 优化的情况下使用assumenosideeffects。

【讨论】:

    【解决方案3】:

    您可以执行以下操作,而不是使用 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;,然后所有日志消息都被抑制

    您可以轻松地扩展这个类以允许您指定标签并生成更多调试消息。

    【讨论】:

    • 我不同意这里。我依靠相同的假设副作用语句从我的项目中删除日志行并且它有效 - 我在 Ant 发布版本中没有得到任何日志 o/p。我的 proguard.cfg 和这个之间的唯一区别是我只有一个项目,我没有说明 -dontobfuscate 或 -forceprocessing
    • @NickT:我删除了您提到的两项在 proguard.cfg 文件中没有的项目,但我仍然看到日志语句。值得一试。
    • @slayton:根据 Proguard 文档,assumenosideeffects 将删除对似乎没有与类规范匹配的副作用的方法的调用。 proguard.sourceforge.net/index.html#manual/usage.html
    • 这将是不同的结果。您仍然在此处进行字符串连接,而删除代码则不会。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多