Android 优化 - 日志 Log

一、概念

|---------|---------|------------------------|---------|----------------------------|
| 日志级别 | 对应方法 | 场景 | 建议 ||
| verbose | Log.v() | 高频调试信息:循环内部状态、事件追踪。 | 开 发 开 启 | |
| debug | Log.d() | 调试关键路径:函数参数、数据转换结果。 | 开 发 开 启 | |
| info | Log.i() | 系统核心事件:如应用启动、用户关键操作。 | 生 产 保 留 | 控制频率,避免高频场景(如循环内)记录。 |
| warn | Log.w() | 潜在风险:非预期参数但可恢复、资源接近阈值。 | 生 产 保 留 | 建议绑定监控告警(如磁盘空间不足触发通知)。 |
| error | Log.e() | 可恢复错误:网络超时、文件读取失败。 | 生 产 保 留 | 记录完整上下文(错误码、参数、堆栈),绑定自动告警。 |

二、优化

2.1 动态开关

根据模块化、业务条件、远程等环境,动态的配置全局开关控制日志输出,避免影响APP性能。

Kotlin 复制代码
object LogUtils {
    var enable = false
}

class MyApplication : Application() {
    override fun onCreate() {
        LogUtils.enable = ...
    }
}

2.2 关闭日志,参数依然会进行计算

2.2.1 问题说明

下方代码,当日志开关设置为 false 时,对 message 的传参虽然会被丢弃,但还是会先执行得出该参数的代码。

Kotlin 复制代码
object LogUtils {
    var enabled = false
    fun d(tag: String, message: String) {
        if (enabled) {
            Log.d(tag, message)
        }
    }
}

LogUtils.d("tag", "打印:${ System.currentTimeMillis() }")    //会创建StringBuilder,获取时间戳,拼接字符串,最后丢弃
LogUtils.d("tag", "打印:$dataClass"}    //会执行数据类的toString()

2.2.2 解决办法

使用 Lambda 延迟到真正使用的时候执行,使用 inline 避免 Lambda 对象生成。

Kotlin 复制代码
inline fun d(tag: String, message: () -> String) {
    if (enable) {
        Log.d(tag, message())
    }
}

三、封装工具类

Kotlin 复制代码
object LogUtils {

    var enable = false

    inline fun v(tag: String, message: () -> String) {
        if (enable) {
            Log.v(tag, message())
        }
    }

    inline fun d(tag: String, message: () -> String) {
        if (enable) {
            Log.d(tag, message())
        }
    }

    inline fun i(tag: String, message: () -> String) {
        if (enable) {
            Log.i(tag, message())
        }
    }
    
    inline fun w(tag: String, message: () -> String) {
        if (enable) {
            Log.w(tag, message())
        }
    }
    
    inline fun e(tag: String, message: () -> String) {
        if (enable) {
            Log.e(tag, message())
        }
    }

}
相关推荐
氦客10 小时前
Android Compose : 仿IOS风格BottomSheet关闭效果:滑动到顶部,再次滑动才关闭
android·compose·bottomsheet·仿ios风格·底部弹框·滑动到顶部·再次滑动才关闭
COSMOS_*18 小时前
2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)
android·ide·jdk·gitee·android studio
jian1105818 小时前
android studio Profiler性能优化,查看内存泄漏
android·性能优化·android studio
建群新人小猿21 小时前
陀螺匠企业助手——组织框架图
android·java·大数据·开发语言·容器
TheNextByte121 小时前
如何将文件从Android无线传输到 iPad
android·ios·ipad
赫萝的红苹果1 天前
实验探究并验证MySQL innoDB中的各种锁机制及作用范围
android·数据库·mysql
叶落无痕521 天前
Android Studio 2024.3.1 连接夜神模拟器
android·ide·android studio
玲子的猫1 天前
安卓原生开发实现图片双指放大预览功能
android
2501_915106321 天前
如何在iPad上高效管理本地文件的完整指南
android·ios·小程序·uni-app·iphone·webview·ipad
似霰1 天前
AIDL Hal 开发笔记5----实现AIDL HAL
android·framework·hal