Android gradle插件打印时间戳

综合技术 2018-09-22 阅读原文

在性能调优时经常要打印函数执行时间、参数值等, 为了调试加了很多代码,调完后还要删掉, 这个事很繁琐。 我们可以用Android Profiler或methodtracing打印函数执行时间,但日志太多了且缺少参数值。所以JakeWharton写了个hugo库, 是用AspectJ实现的,基于AOP思想。 我看了hugo源码,总共四个文件左右,代码量很少。

我想做个同功能的插件,顺便学习一下gradle插件制作方法和字节码注入。

用法很简单,参考 https://github.com/brycegao/TimePlugin/tree/master/demo

项目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'

在想打印日志的类或方法前添加注解@DebugLogger即可,用法参照hugo实现的。

@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); //仅仅为了测试
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

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

运行程序:

日志.png

原理:

注解的作用表示要修改哪个函数, gradle插件的作用是遍历.class, Javassist是字节码注入工具。

在编译期间进行字节码注入, 打开./app/build/intermediates/classes/debug/transforms/TPTransform/1目录可以看到修改后的字节码。

注入字节码.png

优点:在编译期间注入业务逻辑代码,比在源码里加log更方便,不用feature时只要配置gradle 插件不参与编译即可。

展望:在编译期间加日志只是一个点, 还可以实现很多其它业务逻辑。

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

简书

责编内容by:简书阅读原文】。感谢您的支持!

您可能感兴趣的

TechBridge 技術週刊 – (第 85 期) 如果你沒有趕上 deadline,... 屬於開發者、設計師和創客的資訊交流社群 TechBridge Weekly 技術週刊 /* TechBridge Weekly 是一個開發者為開發者編輯...
Android接入友盟统计(顺带多渠道打包)、友盟分享... 小弟原创文章,转载烦请注明本文出处 http://www.jianshu.com/p/5e15b886d7fe 感觉自己堕落了,三个月没更任何东西 o(╥﹏╥)o 前言 像这些第三方接入,还都是蛮简单的,基本上按照文档就可以...
Android缓存之DiskLruCache(磁盘缓存) DiskLruCache和LruCache不同的是,LruCache是内存缓存,而DiskLruCache是指磁盘缓存,顾名思义就是把文件缓存到磁盘,也也就是手机的内存卡中。接下来先简单介绍DiskLruCache的使用方法。 下载源码...
PSPDFKit 4.0 for Android Say hello to PSPDFKit 4.0 for Android! Our newest release of PSPDFKit for Android is fully compatible with Android Oreo...
Android数据存储之SharedPreferences(下) 之前写过一篇 SharedPreferences 简单的介绍: Android数据存储之SharedPreferences(上) 忙过了这段时间后 准备一点点的把从项目中学习到的新知识慢慢的做一个总结。就先从S...