@Override
public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
long start = System.currentTimeMillis()
//是否增量编译
final boolean isIncremental = transformInvocation.isIncremental() && this.isIncremental()
//transform的结果,重定向输出到这个目录
final File rootOutput = new File(project.matrix.output, "classes/${getName()}/")
if (!rootOutput.exists()) {
rootOutput.mkdirs()
}
final TraceBuildConfig traceConfig = initConfig()
Log.i("Matrix." + getName(), "[transform] isIncremental:%s rootOutput:%s", isIncremental, rootOutput.getAbsolutePath())
//获取Class混淆的mapping信息,存储到mappingCollector中
final MappingCollector mappingCollector = new MappingCollector()
File mappingFile = new File(traceConfig.getMappingPath());
if (mappingFile.exists() && mappingFile.isFile()) {
MappingReader mappingReader = new MappingReader(mappingFile);
mappingReader.read(mappingCollector)
}

Map<File, File> jarInputMap = new HashMap<>()
Map<File, File> scrInputMap = new HashMap<>()

transformInvocation.inputs.each { TransformInput input ->
input.directoryInputs.each { DirectoryInput dirInput ->
//收集、重定向目录中的class
collectAndIdentifyDir(scrInputMap, dirInput, rootOutput, isIncremental)
}
input.jarInputs.each { JarInput jarInput ->
if (jarInput.getStatus() != Status.REMOVED) {
//收集、重定向jar包中的class
collectAndIdentifyJar(jarInputMap, scrInputMap, jarInput, rootOutput, isIncremental)
}
}
}
//收集需要插桩的方法信息,每个插桩信息封装成TraceMethod对象
MethodCollector methodCollector = new MethodCollector(traceConfig, mappingCollector)
HashMap<String, TraceMethod> collectedMethodMap = methodCollector.collect(scrInputMap.keySet().toList(), jarInputMap.keySet().toList())
//执行插桩逻辑,在需要插桩方法的入口、出口添加MethodBeat的i/o逻辑
MethodTracer methodTracer = new MethodTracer(traceConfig, collectedMethodMap, methodCollector.getCollectedClassExtendMap(http://www.my516.com))
methodTracer.trace(scrInputMap, jarInputMap)
//执行原transform的逻辑;默认transformClassesWithDexBuilderForDebug这个task会将Class转换成Dex
origTransform.transform(transformInvocation)
Log.i("Matrix." + getName(), "[transform] cost time: %dms", System.currentTimeMillis() - start)
}

最新文章

  1. PhoneGap: Android 自定义组件
  2. 分享一个在线生成站点地图SiteMap制作工具
  3. Linux经常用到的命令
  4. Struts2 面试题分析
  5. Uva 1625,颜色的长度
  6. think in java 读书笔记 2 —— 套接字
  7. Chrome 控制台不完全指南【转载】
  8. DB2 创建数据库
  9. Oracle数据库锁表的查询方法以及解锁的方法
  10. 10.30 NFLS-NOIP模拟赛 解题报告
  11. C# -- 什么是方法签名?
  12. 安装Windows7操作系统 - 初学者系列 - 学习者系列文章
  13. 实参时丢弃了类型 discards qualifiers discards qualifiers问题
  14. Nginx教程(三) Nginx日志管理
  15. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引
  16. FL Studio里的常规设置介绍
  17. python作业练习
  18. Centos7配置JAVA_HOME
  19. Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
  20. [转]c# winform tcp connect timeout 连接超时设置

热门文章

  1. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(&quot;全路径名&quot;) 、getClass()、class
  2. 从新向你学习javase(第一天)
  3. 剑指offer--day08
  4. java程序利用ansible修改redis服务参数
  5. Navicat Premium 12.1.20.0安装与激活
  6. linux文件io与标准io
  7. C语言如何操作内存
  8. MySQL binlog之数据恢复
  9. mysql : 使用不等于过滤null的问题
  10. 移动端自动化测试之Appium的工作原理学习