【问题标题】:Removing Log call using proguard使用 proguard 删除日志调用
【发布时间】:2012-10-24 12:02:25
【问题描述】:

我正在尝试使用 proguard 来删除我的所有日​​志: 我在 proguard-project.txt 中输入了以下行:

-assumenosideeffects class android.util.Log { *; }

我的 project.properties 看起来像这样:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

尽管如此,日志继续显示在我的应用程序中。我到底做错了什么?

【问题讨论】:

  • 对此的规范答案使用略有不同的语法:stackoverflow.com/questions/5553146/…
  • 我也试过了。由于某种原因它不起作用。有什么想法吗?
  • 如果上述方法对您不起作用,也许 proguard 没有运行?检查以确保您正在获取在proguard 中生成的文件。请注意,从 Eclipse 构建或部署应用程序时,时间 proguard 运行是在您生成签名 apk 时。
  • 别想了,不。我链接到的答案有点旧,但应该是好的 AFAIK。您可以考虑添加-verbose 和/或-whyareyoukeeping class android.util.Log 看看是否能告诉您任何信息。
  • 检查你是否得到了proguard生成的mappings.txt文件,这样你就会知道proguard正在运行。

标签: android proguard


【解决方案1】:

您不应该指定“*”通配符,因为它包括像“Object#wait()”这样的方法。最好明确列出方法:

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

此选项仅在优化未被禁用时才相关,例如在proguard-android.txt 中。您必须指定proguard-android-optimize.txt

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

或与当代Android Gradle plugin

buildTypes {
    releaseSomeBuildType {
        ...
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'your-proguard-file.pro'
    }
}   

【讨论】:

  • 排除isLoggable方法有什么原因吗?我没有在我的项目的任何地方使用它。我应该吗?
  • @Roger 它告诉 ProGuard 如果 isLoggable 的返回值没有被使用,则删除它的调用,这是一个有用的优化。如果您的项目没有任何此类调用,那很好。
  • @Pankaj "... 相反",所以你需要更短的版本。
  • 嗨,埃里克,请帮帮我。我使用了你的建议,在某些情况下日志行没有完全删除案例 1。如果在我的代码中我写:Log.i(getClass().getSimpleName(), "maximize:: return true"); 这被删除了。案例 2. 如果在我的代码中我写:Log.i(getClass().getSimpleName(), "maximize:: index=" + index + ", ratio=" + ratio); 这变成:new StringBuilder("maximize:: index=").append(paramInt1).append(", ratio=").append(paramInt2).toString(); 请你告诉我如何在这两种情况下获得相同的结果?提前致谢。
  • @Lisitso 您可以使用多个参数创建自己的日志记录方法,然后可以将其删除:stackoverflow.com/questions/6009078/…
【解决方案2】:

已经很晚了,我遇到了同样的问题。我正在使用 Android Studio 1.3,这就是我所做的。

  1. proguard-android-optimize.txt 的发布版本中添加您要剥离的日志方法:

    -assumenosideeffects class android.util.Log {
        public static boolean isLoggable(java.lang.String, int);
        public static int d(...);
        public static int w(...);
        public static int v(...);
        public static int i(...);
    }
    
  2. 在您的 build.gradle (Module: app) 中将 proguard-android-optimize.txt 设置为默认的 proguard 文件,而不是 proguard-android.txt:

    buildTypes {
        release {
            minifyEnabled true
            debuggable false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    

这是因为在proguard-android.txt 中,优化是默认关闭的,带有标志

-dontoptimize
-dontpreverify 

这对我有用,希望对其他人有所帮助。

【讨论】:

  • FWIW,debuggable false 不是必需的
  • @AlexCohn 如果您希望有人调试您的应用程序,那么不要;)
  • 我在使用 proguard-android-optimize.txt 时遇到错误 - java.lang.IllegalArgumentException:表单编码方法必须包含至少一个 @Field。
  • 您具体什么时候使用isLoggable?它的目的是什么?我没用过
【解决方案3】:

你需要这样做:

-assumenosideeffects class android.util.Log {
public static int d(...);
public static int v(...);
public static int i(...);
public static int w(...);
public static int e(...);
public static int wtf(...);
    }

并扩展您正在使用的所有日志方法。

【讨论】:

  • 恕我直言,这不再起作用了。必须提供特定的返回类型 int 而不是 ***。
  • @RiteshGune 已修复。
  • 我在使用 proguard-android-optimize.txt java.lang.IllegalArgumentException 时遇到错误:表单编码方法必须至少包含一个 @Field。
  • 请作为新问题提问并附上配置文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
相关资源
最近更新 更多