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

}
相关推荐
饭小猿人12 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
_李小白12 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
美狐美颜SDK开放平台12 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
嗷o嗷o13 小时前
Android BLE 里,MTU、分包和长数据发送到底该怎么处理
android
Gary Studio14 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ15 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale16 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年17 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴17 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle