删除来自第三方 lib/sdk 的所有调试日志记录调用(Proguard 不工作)
Remove all debug logging calls from third-party lib/sdk (Proguard is not working)
我已经尝试了很多解决方案
例如
Remove all debug logging calls before publishing: are there tools to do this?
但是,当我查看时 logcat。日志仍然显示。来自我的应用程序的日志不见了,但来自第三方的日志仍然存在。
这是我的混淆器配置。
-dontwarn **
-target 1.7
#-dontusemixedcaseclassnames
#-dontskipnonpubliclibraryclasses
#-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!code/allocation/variable
-keep class **
-keepclassmembers class *{*;}
-keepattributes *
-dontskipnonpubliclibraryclasses
#-dontobfuscate
-forceprocessing
-optimizationpasses 5
-keep class * extends android.app.Activity
-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(...);
}
这是我的 gradle 文件配置
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable false
jniDebuggable false
signingConfig signingConfigs.config
}
debug {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
minifyEnabled true
debuggable false
zipAlignEnabled true
jniDebuggable false
}
}
出于安全原因,客户希望删除所有日志,甚至是来自第三方库或 SDK 的日志
ProGuard 将只能删除应用程序代码中的日志记录调用,即正在处理并包含在您自己的应用程序中的代码。 Android 运行时执行的任何日志记录调用都无法删除,因为运行时安装在每个设备上,显然无法提前修改。
查看您的规则和 gradle 文件,设置看起来是正确的,并且也适用于我删除对 android.util.Log
的调用。确保您使用的是最新版本的 ProGuard(例如 5.2.1 或更高版本)。此外,您的 release
buildType 中仍然禁用了 ProGuard,您需要将 minifyEnabled
设置为 true
以启用它。
您需要检查您的第三方使用哪种类型的日志记录库,并在此基础上为每个库禁用日志记录。
如果您的第三方库像这样使用 java 中的 Logger Logger.getLogger(LIBRARY_CLASS.class.getName());
那么您可以在应用程序 class onCreate():
中像下面这样调用
LogHelper.INSTANCE.setRootLoggerLevel(Level.OFF);
LogHelper class代码:
object LogHelper {
/**
* set root logger log level
*
* @param level maximum allowed log level[Level]
*/
fun setRootLoggerLevel(level: Level) {
val rootLogger = LogManager.getLogManager().getLogger("")
rootLogger.level = level
}
}
我已经尝试了很多解决方案 例如 Remove all debug logging calls before publishing: are there tools to do this?
但是,当我查看时 logcat。日志仍然显示。来自我的应用程序的日志不见了,但来自第三方的日志仍然存在。
这是我的混淆器配置。
-dontwarn **
-target 1.7
#-dontusemixedcaseclassnames
#-dontskipnonpubliclibraryclasses
#-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!code/allocation/variable
-keep class **
-keepclassmembers class *{*;}
-keepattributes *
-dontskipnonpubliclibraryclasses
#-dontobfuscate
-forceprocessing
-optimizationpasses 5
-keep class * extends android.app.Activity
-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(...);
}
这是我的 gradle 文件配置
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable false
jniDebuggable false
signingConfig signingConfigs.config
}
debug {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
minifyEnabled true
debuggable false
zipAlignEnabled true
jniDebuggable false
}
}
出于安全原因,客户希望删除所有日志,甚至是来自第三方库或 SDK 的日志
ProGuard 将只能删除应用程序代码中的日志记录调用,即正在处理并包含在您自己的应用程序中的代码。 Android 运行时执行的任何日志记录调用都无法删除,因为运行时安装在每个设备上,显然无法提前修改。
查看您的规则和 gradle 文件,设置看起来是正确的,并且也适用于我删除对 android.util.Log
的调用。确保您使用的是最新版本的 ProGuard(例如 5.2.1 或更高版本)。此外,您的 release
buildType 中仍然禁用了 ProGuard,您需要将 minifyEnabled
设置为 true
以启用它。
您需要检查您的第三方使用哪种类型的日志记录库,并在此基础上为每个库禁用日志记录。
如果您的第三方库像这样使用 java 中的 Logger Logger.getLogger(LIBRARY_CLASS.class.getName());
那么您可以在应用程序 class onCreate():
LogHelper.INSTANCE.setRootLoggerLevel(Level.OFF);
LogHelper class代码:
object LogHelper {
/**
* set root logger log level
*
* @param level maximum allowed log level[Level]
*/
fun setRootLoggerLevel(level: Level) {
val rootLogger = LogManager.getLogManager().getLogger("")
rootLogger.level = level
}
}