23

我想创建一个混淆的 android 应用程序。我为此使用 ProGuard。我想自动删除所有 Log.* 消息。我怎样才能做到这一点?我找到了这篇文章,但我仍然得到它们。(我使用反编译器来检查混淆)。
proguard-project.txt 如下:

-injars       libs/In.jar
-outjars      libs/Out.jar
#-libraryjars  <java.home>/lib/rt.jar
-libraryjars C:/Users/thomas/android-sdks/platforms/android-7/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class * {
    public protected *;
}

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** e(...);
}

任何帮助,将不胜感激。
谢谢。

4

4 回答 4

41

这只会删除所有调试Log.d(TAG, "...");和错误Log.e(TAG, "...")调用:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** e(...);
}

要删除所有日志调用,只需使用以下命令:

-assumenosideeffects class android.util.Log { *; }
于 2012-09-12T21:34:06.180 回答
18

默认的 android Proguard 配置禁用优化。要启用它,请在项目的 project.properties 文件中使用 proguard-android-optimize.txt 而不是 proguard-android.txt

于 2013-02-28T23:47:53.770 回答
12

对于任何似乎无法将头围在职业后卫身边的人,您必须确保做两件事。

1:来自@yorkw

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

2:来自@Gallal

在项目的 project.properties 文件中使用:

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

代替

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

这是因为您有两个“开箱即用”的 proguard 选项,因为它们包含在 sdk 中

android-adk > tools > proguard

其中包含两个文件:

proguard-android.txt
proguard-android-optimize.txt

希望这可以帮助其他人。

于 2014-01-17T20:42:37.297 回答
10

如果你有 Android Studio,你必须修改build.gradle你的主应用程序。

在您的 gradle 文件中,您必须将 的用法指定proguard-android-optimize.txt为默认文件。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        // With the file below, it does not work!
        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

实际上,在默认proguard-android.txt文件中,使用两个标志禁用优化:

-dontoptimize
-dontpreverify

proguard-android-optimize.txt文件没有添加这些行,所以现在assumenosideeffects可以工作了。

然后,如 Eclipse 或其他答案中所述,您只需将以下行添加到您的主 proguard 文件中:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** e(...);
}
于 2015-09-09T15:23:56.683 回答