返回

如何在 ProGuard 中彻底剔除 Timber 日志记录?

Android

在 ProGuard 中剔除 Timber.tag.(...).d(...) 格式输出的日志

问题背景

Timber 是一款流行的 Android 日志记录库,它允许开发者自定义日志标记和优先级。在生产构建中,我们可能希望剔除所有日志记录调用以提高性能。ProGuard 是一款混淆和优化工具,可用于实现此目的。

解决方法

在你的 proguard-project.txt 文件中,你需要添加以下规则:

-assumenosideeffects class timber.log.Timber* {
        public static *** tag(...);
        public static *** v(...);
        public static *** i(...);
        public static *** w(...);
        public static *** d(...);
        public static *** e(...);

-assumenosideeffects class timber.log.Timber.tag* {*;}
}

这些规则将剔除 Timber 的所有静态方法,包括 tag(), v(), i(), w(), d()e(). 但是,这些规则并不能剔除使用 Timber.tag().d() 格式的日志。

为了剔除使用 Timber.tag().d() 格式的日志,你需要添加以下规则:

-assumenosideeffects class timber.log.Timber$Tree* {
        public *;
}

此规则将剔除 Timber 类的所有内部 Tree 类。这些类用于管理日志输出,并且如果它们被剔除,则不会记录任何日志。

更新后的 ProGuard 配置

更新后的 proguard-project.txt 文件应如下所示:

-assumenosideeffects class timber.log.Timber* {
        public static *** tag(...);
        public static *** v(...);
        public static *** i(...);
        public static *** w(...);
        public static *** d(...);
        public static *** e(...);

-assumenosideeffects class timber.log.Timber.tag* {*;}
-assumenosideeffects class timber.log.Timber$Tree* {
        public *;
}

使用此配置,所有 Timber 日志记录调用,包括使用 Timber.tag().d() 格式的调用,都将被剔除。

注意

请注意,剔除日志记录调用可能会对你的应用产生负面影响。在生产构建中剔除日志之前,请务必仔细权衡利弊。

常见问题解答

1. 为什么不能使用其他方法来剔除 Timber 日志?

其他方法,例如 -ignorewarnings 选项,可能无法有效剔除所有 Timber 日志记录调用。添加明确的 ProGuard 规则是更可靠的方法。

2. 剔除 Timber 日志后,我的应用会出现什么问题?

剔除 Timber 日志可能会导致调试问题更加困难。在生产构建中使用时,请务必谨慎。

3. 除了 Timber 之外,还有哪些日志记录库可以剔除日志?

其他可以剔除日志的日志记录库包括 Logback 和 SLF4J。

4. 我如何自定义 ProGuard 配置以满足我的特定需求?

你可以修改 ProGuard 配置文件以满足你的特定需求。有关更多信息,请参阅 ProGuard 文档。

5. 除了剔除日志之外,我还可以使用 ProGuard 做什么?

ProGuard 可以用于混淆、优化和压缩代码。这可以帮助提高应用程序的性能和安全性。