AOP之Transform

2019-07-23  本文已影响0人  android老男孩

Transform简介

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

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

Gradle插件

自定义gradle插件有三种方式

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

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

com.plugin.TestPlugin是你实现Plugin<Project>类的路径
implementation-class= com.plugin.TestPlugin

Transform API

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

  @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }
 @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

上一篇下一篇

猜你喜欢

热点阅读