Gradle Plugin

255 阅读1分钟
本质:

把逻辑独立的代码抽取和封装

创建方式

image-20220316212040060.png 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等