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

}
相关推荐
枯骨成佛40 分钟前
MTK Android 14 通过属性控制系统设置显示双栏或者单栏
android
雨白1 小时前
Android 自定义 View:范围裁切和几何变换
android
jiushiapwojdap2 小时前
Flutter上手记:为什么我的按钮能同时在iOS和Android上跳舞?[特殊字符][特殊字符]
android·其他·flutter·ios
limuyang24 小时前
Android RenderScript-toolkit库,替换老式的脚本方式(常用于高斯模糊)
android
柿蒂5 小时前
产品需求驱动下的技术演进:动态缩放View的不同方案
android·kotlin·android jetpack
Andy_GF7 小时前
鸿蒙Next在蒲公英平台分发测试包
android·ios·harmonyos
恋猫de小郭8 小时前
iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
android·前端·flutter
幻雨様9 小时前
UE5多人MOBA+GAS 54、用户登录和会话创建请求
android·ue5
Just_Paranoid9 小时前
【SystemUI】锁屏来通知默认亮屏Wake模式
android·framework·systemui·keyguard·aod