如何将 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 日志记录调用的主要内容,如果未能解决你的问题,请参考以下文章