如何开发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文件夹
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中会出现一个任务,如图:
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库使用
完成
- github地址:AspectJPlugin