美文网首页
AOP之Transform

AOP之Transform

作者: android老男孩 | 来源:发表于2019-07-23 10:14 被阅读0次

Transform简介

是Android官方提供给开发者在项目构建阶段即由class到dex转换期间修改class文件的一套api。

我们可以通过Gradle插件来注册我们编写的Transform。注册后的Transform会被Gradle包装成一个Gradle Task,这个TransForm Task会在java compile Task执行完毕后运行。

Gradle插件

自定义gradle插件有三种方式

  • Build script gradle文件,构建脚本内,不过这种只能在文件内使用
  • buildSrc project 可以在自己的工程内随意使用,但是其他工程就无法使用
屏幕快照 2019-07-23 上午9.54.35.png

WubaTimeAssist.properties文件中需要实现这样一行代码

com.plugin.TestPlugin是你实现Plugin<Project>类的路径
implementation-class= com.plugin.TestPlugin
  • Standalone project 单独项目的插件,可以随意一个工程去引用,前提是需要发布到本地仓库或者maven私服
    工程结构与buildSrc project 差不多,但是需要发布maven,上传脚本,upload task


    屏幕快照 2019-07-23 上午10.04.33.png

Transform API

  • TransformInput:就是对输入的class文件转变成目标字节码文件,目前它包括两部分:DirectoryInput与JarInput。
  • DirectoryInput:就是项目编译的所有目录结构及其目录下的源码文件,可以借助于它来修改输出文件的目录结构、已经目标字节码文件。
  • JarInput:所有本地jar包或远程jar包,可以借助于它来动态添加jar包。
  • TransformOutputProvider:Transform的输出,可以通过它来获取输出路径

继承自Transform 的类需要实现几个重要方法

  • getName()就是指定自定义的Transform的名字。
  • 自定义的这个Transform处理的输入类型,现在的就是两种类型即分为class文件或者java资源(resource)
  @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }
  • 该方法是定义你tranform的作用范围,整个工程,当前工程等
 @Override
    public Set<QualifiedContent.Scope> getScopes() {
        return TransformManager.SCOPE_FULL_PROJECT
    }

注册Transform

注意这里是以开源项目DroidAssist为例子

class DroidAssistPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create("droidAssistOptions", DroidAssistExtension)
        //对整个工程的处理
        if (project.plugins.hasPlugin(AppPlugin.class)) {
            AppExtension extension = project.extensions.getByType(AppExtension)
            extension.registerTransform(
                    new DroidAssistTransform(project, true))
        }
       //只对lib工程做处理
        if (project.plugins.hasPlugin(LibraryPlugin.class)) {
            LibraryExtension extension = project.extensions.getByType(LibraryExtension)
            extension.registerTransform(
                    new DroidAssistTransform(project, false))
        }
    }
}

关于Extension

注册的名字,可以在gradle文件中配置,类似与一种bean,可以获取到gradle文件中相应的值,用来做一些输入控制
project.extensions.create("droidAssistOptions", DroidAssistExtension)

gradle文件中
droidAssistOptions {
    enable true
    logLevel 3
    config file("droidassist.xml")
    logDir file("${project.buildDir.absolutePath}/logs")
}

参考

官方API文档:
http://google.github.io/android-gradle-dsl/javadoc/2.1/com/android/build/api/transform/Transform.html
https://www.jianshu.com/p/031b62d02607

相关文章

网友评论

      本文标题:AOP之Transform

      本文链接:https://www.haomeiwen.com/subject/nzvnlctx.html