Android gradle插件打印時(shí)間戳

在性能調(diào)優(yōu)時(shí)經(jīng)常要打印函數(shù)執(zhí)行時(shí)間、參數(shù)值等, 為了調(diào)試加了很多代碼,調(diào)完后還要?jiǎng)h掉, 這個(gè)事很繁瑣。 我們可以用Android Profiler或methodtracing打印函數(shù)執(zhí)行時(shí)間,但日志太多了且缺少參數(shù)值。所以JakeWharton寫(xiě)了個(gè)hugo庫(kù), 是用AspectJ實(shí)現(xiàn)的,基于AOP思想。 我看了hugo源碼,總共四個(gè)文件左右,代碼量很少。
我想做個(gè)同功能的插件,順便學(xué)習(xí)一下gradle插件制作方法和字節(jié)碼注入。

用法很簡(jiǎn)單,參考https://github.com/brycegao/TimePlugin/tree/master/demo

項(xiàng)目build.gradle文件里添加classpath和maven。
buildscript { 
    repositories {
        google()
        jcenter()
        maven { url "https://dl.bintray.com/brycegmail/maven" }
    }
    dependencies {
      classpath 'com.android.tools.build:gradle:3.1.3'
      classpath 'com.brycegao.timeplugin:timeplugin:1.0.4'
      // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://dl.bintray.com/brycegmail/maven" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在app模塊的build.gradle文件添加

apply plugin: 'timeplugin'
...
    implementation 'com.brycegao.tpannotation:tpannotation:1.0.2'

在想打印日志的類(lèi)或方法前添加注解@DebugLogger即可,用法參照hugo實(shí)現(xiàn)的。

@DebugLogger
public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    showMsg(1, "this is test");

    findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
      }
    });
  }

  private void showMsg(int i, String msg) {
    try {
      Thread.sleep(100); //僅僅為了測(cè)試
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  @Override public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
  }
}

運(yùn)行程序:


日志.png

原理:
注解的作用表示要修改哪個(gè)函數(shù), gradle插件的作用是遍歷.class, Javassist是字節(jié)碼注入工具。
在編譯期間進(jìn)行字節(jié)碼注入, 打開(kāi)./app/build/intermediates/classes/debug/transforms/TPTransform/1目錄可以看到修改后的字節(jié)碼。


注入字節(jié)碼.png

優(yōu)點(diǎn):在編譯期間注入業(yè)務(wù)邏輯代碼,比在源碼里加log更方便,不用feature時(shí)只要配置gradle 插件不參與編譯即可。

展望:在編譯期間加日志只是一個(gè)點(diǎn), 還可以實(shí)現(xiàn)很多其它業(yè)務(wù)邏輯。

完整代碼:https://github.com/brycegao/TimePlugin 求star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容