Android手写配置Aspectj的插件AspectjPlugin

如何开发AspectjPlugin插件?

1.1 新建插件module,这里是plugin,项目结构最终如下图:

  • 将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
  • 在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录
  • 除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录
  • 在groovy目录下新建项目包名,就像Java包名那样
  • resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹
gradle_plugin_project_dir.png

1.2 在插件module plugin的build.gradle文件替换为:

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
    compile 'com.android.tools.build:gradle:3.0.1'
    compile 'org.aspectj:aspectjrt:1.9.1'
    compile 'org.aspectj:aspectjtools:1.9.1'
}

repositories {
    jcenter()
    mavenCentral()
}

1.3 新建AspectjPlugin.groovy文件

package com.zero.aspectj.plugin

import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile

class AspectjPlugin implements Plugin<Project> {
    @Override void apply(Project project) {
        def hasApp = project.plugins.withType(AppPlugin)
        def hasLib = project.plugins.withType(LibraryPlugin)
        if (!hasApp && !hasLib) {
            throw new IllegalStateException("'android' or 'android-library' plugin required.")
        }

        final def log = project.logger
        final def variants
        if (hasApp) {
            variants = project.android.applicationVariants
        } else {
            variants = project.android.libraryVariants
        }

        variants.all { variant ->
            JavaCompile javaCompile = variant.javaCompile
            javaCompile.doLast {
                String[] args = [
                        "-showWeaveInfo",
                        "-1.5",
                        "-inpath", javaCompile.destinationDir.toString(),
                        "-aspectpath", javaCompile.classpath.asPath,
                        "-d", javaCompile.destinationDir.toString(),
                        "-classpath", javaCompile.classpath.asPath,
                        "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)
                ]
                log.debug "ajc args: " + Arrays.toString(args)

                MessageHandler handler = new MessageHandler(true);
                new Main().run(args, handler);
                for (IMessage message : handler.getMessages(null, true)) {
                    switch (message.getKind()) {
                        case IMessage.ABORT:
                        case IMessage.ERROR:
                        case IMessage.FAIL:
                            log.error message.message, message.thrown
                            break;
                        case IMessage.WARNING:
                            log.warn message.message, message.thrown
                            break;
                        case IMessage.INFO:
                            log.info message.message, message.thrown
                            break;
                        case IMessage.DEBUG:
                            log.debug message.message, message.thrown
                            break;
                    }
                }
            }
        }
    }
}

1.4 在resources/META-INF/gradle-plugins/目录下新建一个文件:aspectj.plugin.properties

注意:该文件的命名就是你使用插件的名字,在里面输入

implementation-class=com.zero.aspectj.plugin.AspectjPlugin

如何使用这个插件?

发布到本地仓库使用

2.1 在插件module plugin的build.gradle添加以下代码

group = 'com.zero.aspectj.plugin'
version = '1.0.0'

uploadArchives {
    //使用当前目录下面的maven仓库,仓库在当前目录的repo文件目录中
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

同步之后,这时右侧的gradle标题栏中的:plugin中会出现一个任务,如图:


uploadArchives.png

2.2 在项目中使用该插件

buildscript {
    repositories {
        jcenter()
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        // group:moduleName:version
        classpath 'com.zero.aspectj.plugin:plugin:1.0.0'
    }
}
apply plugin: 'aspectj.plugin'

发布到jcenter库使用

参考发布项目到Jcenter

完成

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容