Android打包编译时删除class文件

    在做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
    Set getInputTypes() {
        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'

你可能感兴趣的:(Android打包编译时删除class文件)