1. 写一个Plugin
  2. 创建一个配置类
  3. 通过Transfrom Api 注入配置
  4. 扫描包名通过ASM注入到class中

  • gradle插件的方法请自行查阅百度;
  • 创建一个dsl,传入要插入的方法的信息,注入Transform
project.extensions.create(EXT_NAME,AutoRegisterConfig)//写入自定义配置,创建dsl
def android = project.extensions.getByType(AppExtension);
def  transformImpl = new RegeisterTransform();
android.registerTransform(transformImpl);
复制代码
  • 遍历directoryInputs,找到要注入的类,插入asm
ClassReader cr = new ClassReader(bytes);
ClassWriter cw = new ClassWriter(cr, 0);
ClassVisitor cv = new MyClassVisitor(Opcodes.ASM5, cw);
cr.accept(cv, ClassReader.EXPAND_FRAMES);
byte[] b = cw.toByteArray();
复制代码
  • 采用AdpterAdvice注入到方法,这是MethodVistor的子类,封装的接口可以方便插入代码到方法内部,在onMethodEnter中写入方法,ig:

mv.visitMethodInsn(INVOKESTATIC, "com/xxx/myapplication/TimeLog","printTime", "()V");

参数可以通过第一步创建的dsl获取到 第一个参数代表Static,第二个参数是全类名,第三方参数是方法名,第四个参数是返回值类型(百度自行查阅字节码的类型表示) 插入的方法:

public class TimeLog {public static void printTime(){Log.e("time",System.currentTimeMillis() + "");}
}
复制代码
  • 将生成的byte[] 重新写回源文件
FileOutputStream fos = new FileOutputStream(file.absolutePath);
fos.write(b);
fos.close();
复制代码
  • 依赖插件,build项目运行

##自定义一个自动注入Log 的 插件相关推荐

  1. 从源码层面带你实现一个自动注入注解

    如何自己实现一个自动注入的注解 首先,需要了解到的是.Spring Bean 的生命周期 在生命周期中.注入bean属性的位置是在以下代码:populateBean 位置中 那么我们在项目中使用注解 ...

  2. cordova自定义一个简单的alert的插件(android平台)

    官网的插件开发文档:http://cordova.apache.org/docs/en/latest/guide/hybrid/plugins/index.html 插件文件布局: 比如我在d盘新建了 ...

  3. Android流媒体开发之 自定义一个完备的log模块

    Android音视频开发之 自定义一个完备的log模块 前言 基础知识的掌握 Log系统 为什么需要自定义一个log模块呢? 做什么? 怎么做? 确定成员变量: 初始化LogUtil 输出功能的实现 ...

  4. 自定义平台MQ,SpringBoot自动注入【xdx-mq-starter】

    视频地址:https://www.bilibili.com/video/BV1mr4y1J77n 之前面试的时候都会被问到为什么使用MQ,使用MQ的好处是什么,我都会照本宣科的说:异步.解耦.削峰,这 ...

  5. 自定义实现IOC容器的自动装配和自动注入

    自定义注解@MyBean用于实现自动装配 @Target({ ElementType.TYPE })//类上面有效 @Retention(RetentionPolicy.RUNTIME)//运行时有效 ...

  6. 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)...

    DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害.本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期.单利生命周 ...

  7. 自定义一个月份选择器插件

    这里笔者制作了一个简单还算美观的月份选择器,来实现年月份随意选择的需求. 实际开发中可能会碰到这样的需求,只需要选择年月份就可以,不需要其他日期,时间等的选择,有些日期了的插件较大,杀猪焉用宰牛刀,没 ...

  8. AOP通过开启注解方式自动注入值

    注解:EnableDimEnhance package com.comma.teeth.enhance.dim.annotation;import java.lang.annotation.Docum ...

  9. jQuery 设计和自定义一个带展开动画效果的导航栏

    设计和自定义一个带展开动画效果的导航栏,尝试写了一个demo,加上设计和调试差不多写了一天吧. 这里就来讲讲如何从设计->写布局->写样式->写JS代码 完成一个完全自己设计的导航栏 ...

最新文章

  1. Eclipse使用EGit管理git@OSC项目
  2. C#操作XML小结_转载
  3. BZOJ4855 : [Jsoi2016]轻重路径
  4. sql server 2008学习1–系统数据库
  5. go语言查询某个值是否在数组中_go语言中的数组
  6. linux socket ip层配置,Linux下Socket通信(TCP实现)
  7. 唱好铁血丹心谐音正规_长沙正规的音乐高考培训学校
  8. linux系统不关机添加硬盘吗,Linux服务器不关机新增硬盘的方法
  9. [转载] Python中filter筛选函数匿名参数问题
  10. (转)python3之模块io使用流的核心工具
  11. 在SUSE 10下安装oracle 11g
  12. 黑马程序员传智播客 python 迭代器学习笔记
  13. ADODB.Recordset 错误 '800a0e7d' 的解决方法
  14. c语言 控制电脑程序,c语言程序设计
  15. 智能计算/计算智能、仿生算法、启发式算法的区别与关系?
  16. 【联想拯救者R7000】蓝牙和wifi图标不显示问题(已解决)
  17. ireport 循环_IReport 常见问题整理
  18. 淘宝订单同步及解决方法
  19. 计算机网络—自顶向下 计算机网络和因特网
  20. IPv6- TC实现IPv6流量限速测试详情

热门文章

  1. win10安装配置gcc编译环境
  2. 智能假手与机器人融合可以灵活抓取物品
  3. 陈勋教授的脑电信号降噪视频与讲座总结
  4. pyglet wave.Error: file does not start with RIFF id
  5. php sql alert,SQL ALTER
  6. 刚评上院士的马斯克就飘了,说要每天发射三次大火箭,向火星转移100万吨物资...
  7. 项目福利政策报名 | 项目启动资金、股权投资、住房购房补贴
  8. 腾讯的电商,在东南亚击败了阿里巴巴
  9. 中国半导体最强助攻来了!十年免税、上下游一揽子扶持,明确「集成电路」为一级学科...
  10. 关于SQL Server 2017中使用json传参时解析遇到的多层解析问题