一个高性能的Android日志库.java
项目地址: https://github.com/linsea/cluegit
一般的Android日志库, 为了获取到class名, 方法名, 行号, 都是经过如下API实现的:github
StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); //expensive cost StackTraceElement element = stacks[4]; int lineNumber = element.getLineNumber(); String fileName = element.getFileName()
以上的方式损耗的性能是很高昂的, 线上代码中不该该出现.app
显然, 若是代码写好, 在编译以前, 全部的class名, 方法名, 行号是固定的, 不会再变化,不该该在运行时经过以上代价高昂的方式去动态获取.maven
clue日志库没有调用以上API来获取class名, 方法名, 行号, 而是换了另一种思路, 它经过在编译期操做class文件字节码, 从中获取这些信息. 这对于追求极致性能的应用很是有价值, 或者不但愿由于打印日志而下降应用的性能, 或者须要记录线上APP运行日志的场景尤为有用.ide
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
中应用插件.gradle
apply plugin: "com.github.linsea.clue-plugin"
3 在项目的 build.gradle
加入依赖库.ui
compile 'com.linsea:clue:1.0'
4 在 Application
class中加入一个log实例.url
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的实现.