美文网首页
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