本质:
把逻辑独立的代码抽取和封装
创建方式
HenCoder.groovy
package com.hencoder.plugin
import com.android.build.gradle.BaseExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
class HenCoder implements Plugin<Project> {
@Override
void apply(Project target) {
def extension = target.extensions.create('hencoder', HenCoderExtension)
target.afterEvaluate {
println "Hi ${extension.name}!"
}
def transform = new HenCoderTransform()
def baseExtension = target.extensions.getByType(BaseExtension)
baseExtension.registerTransform(transform)
}
}
HenCoderExtension.groovy
package com.hencoder.plugin;
class HenCoderExtension {
def name = 'rengwuxian'
}
Resources/META-INFO/gradle-plugins/.properties中的是擦肩的名称,例如*.properties是com.hencoder.plugindemo.properties
最后在应用插件的代码应该是
apply plugin 'com.hencoder.plugindemo'*.properties中只有遗憾,格式是
implementation-class=com.hencoder.plugin_demo.DemoPlugin
关于buildSrc
在grade V6.0以后,buildSrc已经成为保留字,在setting.gradle中不允许配置名为buildSrc的module
Transform
用途(定义?):
Android提供的在项目构建过程中把编译后的文件(jar文件和class文件)添加自定义的中间处理过程的工具
用法
添加依赖
repositories {
google()
jcenter()
}
dependencies {
implementation "com.android.tools.build:gradle:4.0.0-beta04"
}
继承 com.android.build.api.transform.Transform,创建子类HenCoderTransform.groovy
package com.hencoder.plugin
import com.android.build.api.transform.Format
import com.android.build.api.transform.QualifiedContent
import com.android.build.api.transform.Transform
import com.android.build.api.transform.TransformException
import com.android.build.api.transform.TransformInvocation
import com.android.build.gradle.internal.pipeline.TransformManager
import com.android.utils.FileUtils;
class HenCoderTransform extends Transform {
@Override
String getName() {
return 'hencoder'
}
@Override
Set<QualifiedContent.ContentType> getInputTypes() {
return TransformManager.CONTENT_CLASS
}
@Override
Set<? super QualifiedContent.Scope> getScopes() {
return TransformManager.SCOPE_FULL_PROJECT
}
@Override
boolean isIncremental() {
return false
}
@Override
void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
def inputs = transformInvocation.inputs
def outputProvider = transformInvocation.outputProvider
inputs.each {
it.jarInputs.each {
File dest = outputProvider.getContentLocation(it.name, it.contentTypes, it.scopes, Format.JAR)
println "Jar: ${it.file}, Dest: ${dest}"
FileUtils.copyFile(it.file, dest)
}
it.directoryInputs.each {
File dest = outputProvider.getContentLocation(it.name, it.contentTypes, it.scopes, Format.DIRECTORY)
println "Dir: ${it.file}, Dest: ${dest}"
FileUtils.copyDirectory(it.file, dest)
}
}
}
}
修改字节码,需要引入其他工具,比如javassist、ams等