如何将 proguard 配置为仅删除 android 日志记录调用

Posted

技术标签:

【中文标题】如何将 proguard 配置为仅删除 android 日志记录调用【英文标题】:How to configure proguard to ONLY remove android logging calls 【发布时间】: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 可以实现我的要求吗?

【问题讨论】:

【参考方案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 中,这样任何人都无法通过逆向工程获得代码和资产。

以上是关于如何将 proguard 配置为仅删除 android 日志记录调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Proguard 删除日志记录

如何排除一个类被proguard保留

如何将 JUnit Ant 任务配置为仅在失败时生成输出?

如何使用 Gradle 配置 Proguard?

如何根据用户角色将 geoserver WFS 服务配置为仅访问某些图层?

如何将输入限制为仅接受数字?