在做Android项目时有的时候要在gradle编译时期需要修改编译产物或者在task之前插入自己的task,有两种方案可以,第一种可以自己写一个gradle插件,然后引用自己的插件,这种方式还可以将写好的插件推到远程仓库;第二种直接在app的gradle中写创建task然后进行task依赖就可以。
删除生成的class文件需要对gradled的打包流程有所了解,需要在class到dex之前将其删除掉。过程很简单在app的android块中创建task
project.afterEvaluate { project.tasks.create(name: "自己的taskName", group: "分组的名称") doLast { def fileName = "/Users/catkin/Desktop/worksapcefordemo/XFrameWork/app/build" + "/intermediates/classes/debug/catkin/com/xxx.class" project.logger.log(LogLevel.ERROR, "fileName = " + fileName) File file = new File(fileName) if (!file.exists()) { assert "文件不存在" } file.delete() } def taskName = "compileDebugJavaWithJavac" def taskA = project.tasks.findByName(taskName)
taskA.dependsOn(taskName)
def generateJsonModelDebug = project.tasks.findByName("generateJsonModelDebug") if (generateJsonModelDebug == null) { assert "transformClassesWithDexForDebug is null" } generateJsonModelDebug.dependsOn("taskA")
}
或者上面的代码直接写成
taskName.doLast { taskName.outputs.files.files.each { deleteClassFile(it) } }
def deleteClassFile(File file) { if (file.isDirectory()) { file.eachFileRecurse { deleteClassFile(it) } }else { if (file.name.equals("xxx.class")) { file.delete() } } }
还有一种比较简单的方法直接在gradle写自己的插件,并写出自己Transform,Transform 是google为了方便在dx将class编译成dex文件时可以进行一些操作
1、定义自己的gradle插件
class MyPlugin implements Plugin{ @Override void apply(Project target) { def MyClassTransform = new MyClassTransform() def android = target.extensions.getByName("android") android.registerTransform(MyClassTransform) } }
2定义自己的Transform
class MyClassTransform extends Transform { MyClassTransform() {} @Override String getName() { return "MyClassTransform" } @Override SetgetInputTypes() { return TransformManager.CONTENT_CLASS } @Override Set getScopes() { return TransformManager.SCOPE_FULL_PROJECT } @Override boolean isIncremental() { return false } @Override void transform( @NonNull TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException { Collection inputs = transformInvocation.getInputs() Collection referenceInputs = transformInvocation.getReferencedInputs() TransformOutputProvider outPutProvider = transformInvocation.getOutputProvider() inputs.each { TransformInput transformInput -> transformInput.directoryInputs.each { it -> deleteClassFile(it.file.absolutePath) def dest = outPutProvider.getContentLocation(it.name, it.contentTypes, it.scopes, Format.DIRECTORY) project.logger.log(LogLevel.ERROR,"dest===="+dest.absolutePath) FileUtils.copyDirectory(it.file, dest) } transformInput.jarInputs.each { it-> def jarName = it.name def md5Name = DigestUtils.md5Hex(it.file.absolutePath) if (jarName.endsWith(".jar")) { jarName = jarName.substring(0, jarName.length() - 4) } def dest = outPutProvider.getContentLocation(jarName + md5Name, it.contentTypes, it.scopes, Format.JAR) FileUtils.copyFile(it.file,dest) } } }
需要在app的gradle 中添加
import com.android.build.api.transform.* import com.android.build.gradle.internal.pipeline.TransformManager
import org.apache.commons.codec.digest.DigestUtils
import org.apache.commons.io.FileUtils
apply plugin: MyPlugin
compile 'com.android.tools.build:transform-api:1.5.0'