clue

一个高性能的Android日志库.

为什么性能高

通常的Android日志库, 为了获取到class名, 方法名, 行号, 都是通过以下API实现的:

StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); //expensive cost

StackTraceElement element = stacks[4];

int lineNumber = element.getLineNumber();

String fileName = element.getFileName()

以上的方式损耗的性能是很高昂的, 线上代码中不应该出现.

显然, 如果代码写好, 在编译之前, 所有的class名, 方法名, 行号是固定的, 不会再变化,不应该在运行时通过以上代价高昂的方式去动态获取.

clue日志库没有调用以上API来获取class名, 方法名, 行号, 而是换了另外一种思路, 它通过在编译期操作class文件字节码, 从中获取这些信息. 这对于追求极致性能的应用非常有价值, 或者不希望因为打印日志而降低应用的性能, 或者需要记录线上APP运行日志的场景尤其有用.

功能

Class名字作为默认的tag, 或者自定义tag

显示调用者的方法名

显示源代码行号

显示线程名

在Android Studio的日志窗口中点击日志中的文件名跳转到源代码相应的位置

无性能损耗地获取以上日志信息

可扩展的API接口设计

使用方法

1 在项目的顶级 build.gradle 文件中引用插件的classpath.

buildscript {

repositories {

maven {

url "https://plugins.gradle.org/m2/"

}

}

dependencies {

classpath "gradle.plugin.com.github.linsea:clue-plugin:1.0.0"

}

}

2 在项目的 build.gradle 中应用插件.

apply plugin: "com.github.linsea.clue-plugin"

3 在项目的 build.gradle 加入依赖库.

compile 'com.linsea:clue:1.0'

4 在 Application class中加入一个log实例.

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

Clue.addLog(new ConsoleLog()); //初始化Clue log,默认使用系统的Logcat输出到控制台.

}

}

5 调用 Clue 类的静态方法记录日志. 比如:

public static void v(String message, Object... args);

public static void vt(String tag, String message, Object... args)

public static void v(Throwable t, String message, Object... args)

public static void vt(String tag, Throwable t, String message, Object... args)

更详细的使用方法请参考位于 clue/clue-sample 的示例项目.

扩展接口

你可以添加自己的logger实现来扩展Clue, 比如继承BaseLog实现一个把日志写入文件的Log Receiver, 然后调用Clue.add(...)把它添加进Clue中, 具体可以参考库中ConsoleLog的实现.

android log耗性能吗,一个高性能的Android日志库相关推荐

  1. 最新面试必问:怎么写一个又好又快的日志库

    引子 上一篇使用责任链模式搭了一个高可扩展的日志框架,并引入高性能的I/O库以提升写日志性能. 在这个框架下,"日志写文件"作为一个拦截器出现: // 日志拦截器class Oki ...

  2. Android fragment 页面,[38→100]一个常规的Android页面模型:NetFragment

    问题场景 Android开发中大部分页面都包含如下逻辑: 进入页面,加载网络数据,显示加载页面 加载完成后,有以下几种情况: 正常返回,有有效数据,显示"有效界面" 正常返回,有效 ...

  3. libslog---高性能开源C/C++多线程安全日志库

    Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...

  4. android log长字符串显示不全,如何解决Android的Log显示不全的问题

    在做Android开发过程中,我们常常会使用系统提供的日志打印功能选择性地在Logcat控制台上打印一些数据信息,调试跟踪应用运行的一个状态,常见如客户端与服务器通讯过程中涉及到的URL链接.requ ...

  5. android视频播放器ui,ArtVideoPlayer 一个灵活的Android视频播放器,支持全屏,小屏播放...

    ArtPlayer 简介 Kotlin实现的视频播放器,将MediaPlayer与VideoView解耦合,支持切换播放器内核(如ExoPlayer和ijkPlayer),支持自定义控制视图,提供Me ...

  6. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  7. Android应用开发性能优化完全分析,移动应用开发课程报告

    如下是我工作中一个项目的一次经历(我将代码回退特意抓取的),出现这个问题的场景是一次压力测试导致整个系统卡顿,瞬间杀掉应用就OK了,究其原因最终查到是一个API的调运位置写错了方式,导致一直被狂调,当 ...

  8. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  9. Android应用程序性能优化

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

最新文章

  1. **52.常用的存储保护方法有哪些?
  2. 网页中返回顶部代码(多种方法)另附注释说明
  3. macOS Mojave Version 10.14 新系统字体问题和修改MAC中Launchpad启动器图标行列的数量
  4. CCF真题 201312-2 ISBN号码
  5. python一维列表的定义_数据结构-Python 列表(List)
  6. Spring boot 2.3优雅下线,距离生产还有多远?
  7. Mybatis学习总结(二)——Mapper代理开发
  8. redis的安装(Linux)和基本使用
  9. 资源放送丨Oracle 20C DataGuard 新特性解读PPT视频
  10. 三星获得加州自动驾驶测试许可,与Google苹果正面刚
  11. jdk1.8 windows 64位 下载
  12. php表格显示成绩,学生成绩表格展示
  13. python+selenium实战搭建PO模型
  14. 一个可以在多平台运行的任天堂GameBoy模拟器
  15. 【解决笔记本电脑声音音量低的方法】
  16. MySQL 千万级数据处理
  17. 拨号盘拨号数字间距太小 调大 修改通讯录里面收藏和所有联系人字体颜色
  18. Python数字图像处理---1.1图像的像素格式与图像读写
  19. 【工作笔记】Springboot一个比较通用的数据脱敏处理办法
  20. 相关系数,互相关函数,协方差,卷积

热门文章

  1. jquery点击事件遇到的小bug
  2. Android NDK编译中在libs\armeabi中加入第三方so库文件的方法
  3. a different object with the same identifier val...
  4. router3 BGP2 属性及选路
  5. 【转】子网划分实例与讲解
  6. 金融领域下的数据挖掘算法应用:AdaBoost模型摩天
  7. 你可能不清楚的 Vue Router 深度用法(二)
  8. Linux系统安装中文环境,中文帮助,中文输入法的实现
  9. Linux下基于Libmad库的MP3音乐播放器编写
  10. mysql grant 语法格式_MySQL grant 语法的详细解析