使用proguard删除日志调用

use*_*307 38 android proguard

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

-assumenosideeffects class android.util.Log { *; }
Run Code Online (Sandbox Code Playgroud)

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

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
Run Code Online (Sandbox Code Playgroud)

尽管如此,日志仍然会在我的申请中显示出来.我到底错在了什么?

Eri*_*une 89

您不应该指定'*'通配符,因为它包含'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(...);
}
Run Code Online (Sandbox Code Playgroud)

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

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
Run Code Online (Sandbox Code Playgroud)

或使用当代Android Gradle插件

buildTypes {
    releaseSomeBuildType {
        ...
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'your-proguard-file.pro'
    }
}   
Run Code Online (Sandbox Code Playgroud)

  • 嗨埃里克,请帮帮我.我使用了你的建议,在某些情况下日志行没有被完全删除案例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();`请问您能告诉我如何在两种情况下获得相同的结果吗?提前致谢. (3认同)
  • @Roger告诉ProGuard如果不使用isLoggable的返回值,则删除该调用,这是一个有用的优化。如果您的项目没有任何此类调用,那很好。 (2认同)

小智 12

现在已经很晚了,我遇到了同样的问题.我正在使用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(...);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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')
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

这是因为proguard-android.txt默认情况下使用标志关闭优化

-dontoptimize
-dontpreverify 
Run Code Online (Sandbox Code Playgroud)

这对我有用,希望它能帮助别人.

  • FWIW,不需要`debuggable false` (2认同)

Fra*_*ank 6

你需要这样做:

-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(...);
    }
Run Code Online (Sandbox Code Playgroud)

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