21

我正在尝试将 proguard 配置为仅从我的 Android 应用程序中删除对 android.util.Log 的调用(用于发布版本)。我特别不希望 proguard 对代码进行任何混淆或缩小。

这是我尝试过的配置,但它不会删除Log调用(我假设是因为-keep class **

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep class ** {
    *;
}

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

我问的问题甚至可以用proguard吗?

4

2 回答 2

33

您可以使用以下选项删除记录调用proguard-project.txt

-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相反,您必须在 中指定project.properties

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

如果您愿意,可以禁用收缩和混淆。如果您愿意,您还可以保留应用程序的内部 API 以防止优化:

-keep class myapp.** { *; }

从 ProGuard 的角度来看,禁用这些步骤并保留所有代码当然不是最佳选择。

于 2013-03-23T22:56:38.200 回答
13

在 build.gradle

buildTypes {

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

在 proguard-rules.pro

-dontwarn **
-target 1.7
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

-optimizations !code/simplification/arithmetic,!code/allocation/variable
-keep class **
-keepclassmembers class *{*;}
-keepattributes *

#This will not remove error log
-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(...);
}
于 2015-06-11T16:19:16.817 回答