使用 proguard 删除日志调用

Posted

技术标签:

【中文标题】使用 proguard 删除日志调用【英文标题】:Removing Log call using 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

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

【问题讨论】:

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

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

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

    在您的 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。 请作为新问题提问并附上配置文件

以上是关于使用 proguard 删除日志调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 ProGuard 混淆私有字段

使用 Proguard 删除日志记录

使用 ProGuard 在 Android 中删除 LibGDX 日志

DexGuard/Proguard 混淆注释值

使用 ProGuard 删除日志不会删除正在记录的字符串 [重复]

Android Proguard 未删除所有日志消息