Android Studio - Gradle汇编任务

时间:2015-07-21 13:19:43

标签: android-studio gradle task android-productflavors

我目前正在使用gradle进行构建过程。我的目标是在最终的.apk中没有特定的java类用于特定的风格。 逻辑是这样的:

1。)在编译项目之前删除MyClass.java并将其复制到临时文件夹

2。)将apk副本组装回MyClass.java到我的原始文件夹

之后

3.删除临时文件夹

只有在我构建特定的风格时才会发生这种情况,因此所有构建变体都不会发生这种情况。当我只构建一个flavor和一个构建变体时,我的代码工作正常。 assembleFlavorRelease,但如果我不想使我的代码适用于多种构建类型;如果我运行assembleFlavor,它应该像flavorRelease一样构建flavorDebug。 但是我的逻辑只是第一次出现,之后就停止了,所以flavorDebug是用MyClass构建的,它不应该是,而flavorRelease不包含.apk中的MyClass,因为我的代码第一次运行。

代码如下所示:

task copyResource << {
    copy {
        from 'src/main/java/MyClass.java'
        into 'src/temp'
    }
}

task deleteResource << {
    delete {
        'src/main/java/MyClass.java'
    }
}

task deleteTemp << {
    delete {
        'src/temp'
    }
}

task copyBackToSource << {
    copy {
        from 'src/temp/MyClass.java'
        into 'src/main/java'
    }
    deleteTemp.execute()
}

android.applicationVariants.all { variant ->
    if (variant.name.contains('flavor')) {
        deleteResource.dependsOn copyResource
        variant.javaCompile.dependsOn deleteResource
        variant.assemble.doLast {
            copyBackToSource.execute()
        }
    }
}

我认为我在代码中使用的目录在第二次尝试执行整个过程时会以某种方式被锁定?

2 个答案:

答案 0 :(得分:1)

我觉得你正以错误的方式解决问题。而不是思考

  

将java文件放在src / main / java中并从flavorX

中删除它

您应该将其视为

  

为flavorY和flavorZ

的源集添加一个额外的源目录

一旦你接近这样的问题就变得容易了

如果您只想要一种风格的文件,可以使用内置约定(即src/flavorX/java)将文件放在特定于风味的源文件夹中

如果您希望文件包含多种风格,可以将MyClass.java放在src/common/java中并执行类似

的操作
android {
   productFlavors {
       flavor1 {
       }
       flavor2 {
       }
       flavor3 {
       }
   }
}
sourceSets {
    flavor1.java = ['src/flavor1/java','src/common/java']
    flavor2.java = ['src/flavor2/java','src/common/java']
}

答案 1 :(得分:0)

好的,我从这里得到了正确的解决方案:https://discuss.gradle.org/t/android-gradle-assemble-tasks/10711

如果您想避免编译特定的类,请使用:

variant.javaCompile.exclude '**/SourceFileToExclude.java'