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

}
相关推荐
Lei活在当下6 小时前
Windows 下 Codex 高效工作流最佳实践
android·openai·ai编程
fatiaozhang95276 小时前
基于slimBOXtv 9.19.0 v4(通刷晶晨S905L3A/L3AB芯片)ATV-安卓9-完美版线刷固件包
android·电视盒子·刷机固件·机顶盒刷机·晶晨s905l3ab·晶晨s905l3a
私房菜7 小时前
Selinux 及在Android 的使用详解
android·selinux·sepolicy
一只特立独行的Yang7 小时前
Android中的系统级共享库
android
两个人的幸福online8 小时前
php开发者 需要 协程吗
android·开发语言·php
修炼者9 小时前
WindowManager(WMS)构建全局悬浮窗
android
xiaoshiquan120610 小时前
Android Studio里,SDK Manager显示不全问题
android·ide·android studio
Lstone736410 小时前
Bitmap深入分析(一)
android
一起搞IT吧11 小时前
Android功耗系列专题理论之十四:Sensor功耗问题分析方法
android·c++·智能手机·性能优化