Android 优化 - 日志 Log
一、概念
日志级别 | 对应方法 | 场景 | 建议 | |
verbose | Log.v() | 高频调试信息:循环内部状态、事件追踪。 | 开 发 开 启 | |
debug | Log.d() | 调试关键路径:函数参数、数据转换结果。 | ||
info | Log.i() | 系统核心事件:如应用启动、用户关键操作。 | 生 产 保 留 | 控制频率,避免高频场景(如循环内)记录。 |
warn | Log.w() | 潜在风险:非预期参数但可恢复、资源接近阈值。 | 建议绑定监控告警(如磁盘空间不足触发通知)。 | |
error | Log.e() | 可恢复错误:网络超时、文件读取失败。 | 记录完整上下文(错误码、参数、堆栈),绑定自动告警。 |
二、优化
2.1 动态开关
根据模块化、业务条件、远程等环境,动态的配置全局开关控制日志输出,避免影响APP性能。
object LogUtils {var enable = false
}class MyApplication : Application() {override fun onCreate() {LogUtils.enable = ...}
}
2.2 关闭日志,参数依然会进行计算
2.2.1 问题说明
下方代码,当日志开关设置为 false 时,对 message 的传参虽然会被丢弃,但还是会先执行得出该参数的代码。
object LogUtils {var enabled = falsefun 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 对象生成。
inline fun d(tag: String, message: () -> String) {if (enable) {Log.d(tag, message())}
}
三、封装工具类
object LogUtils {var enable = falseinline 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())}}}