【问题标题】:How to configure proguard to ONLY remove android logging calls如何将 proguard 配置为仅删除 android 日志记录调用
【发布时间】:2013-03-12 09:06:00
【问题描述】:

我正在尝试将 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 可以实现我的要求吗?

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    您可以在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 中。您必须在 project.properties 中指定 proguard-android-optimize.txt

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

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

    -keep class myapp.** { *; }
    

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

    【讨论】:

    • 似乎问题是默认的全局 proguard 配置禁用了优化。现在我刚刚放弃了 proguard 并用检查调试标志来包装我的日志记录调用。无论如何,我会接受你的回答,因为它解决了我原来的问题。
    • 我注意到网络调用仍然可以显示在 BasicNetwork.logSlowRequests 和 Request.finish 之后...您将如何删除它?
    • @Eric 您能否提供一些相关资料。这不像我不相信你,我相信。但这件事是无法解释的,也是很多悲伤的根源。
    【解决方案2】:

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

    【讨论】:

    • 您将看到错误日志。在 public static int e(...); 之前删除 #在 public static boolean isLoggable(java.lang.String, int); 之前还要确保你运行 Release build。这些更改是针对发布版本的。
    • 我错了,桑迪普。它确实有效..我道歉。我错过了更改 proguard-android.txt -> proguard-android-optimize.txt
    • 我想问一个问题,我们如何将完整的代码隐藏在 APK 中,这样任何人都无法通过逆向工程获得代码和资产。
    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多