使用 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 在 Android 中删除 LibGDX 日志