一個高性能的Android日誌庫

clue

一個高性能的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

功能

  • 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 中應用插件.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的實現.

相關文章
相關標籤/搜索