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())
        }
    }

}
相关推荐
朱涛的自习室2 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
应用市场8 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭111999 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
geats人山人海9 小时前
java 7异常
android·java·开发语言
2601_9620710010 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
右手吉他12 小时前
高通平台IA APN问题分析之二
android·物联网
夜雪一千12 小时前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
不浪费一个字节12 小时前
一个纯 Python 实现的 APK 解析与设备操控工具箱
android
itmigrate13 小时前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
hai_android13 小时前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack