Android 工作室 - Gradle assemble 任务

Android Studio - Gradle assemble task

我目前正在努力处理 gradle 中的构建过程。我的目标是在最终的 .apk 中不要有特定的 java class 来获得特定的风味。 逻辑是这样的:

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

2.) 组装 apk 后复制回 MyClass.java 到我原来的文件夹

3.) 删除临时文件夹

只有当我构建特定风格时才会发生这种情况,所以它不会发生在所有构建变体上。当我只构建一种风格和一种构建变体时,我的代码可以完美运行,例如assembleFlavorRelease,但如果我不想让我的代码适用于多种构建类型;如果我 运行 assembleFlavor 它应该像构建 flavorRelease 一样构建 flavorDebug。 然而,我的逻辑只在第一次进入低谷,之后它就停止了,所以 flavorDebug 是用 MyClass 构建的,它不应该是,而 flavorRelease 不在 .apk 中包含 MyClass 因为我的代码 运行s 第一个时间.

代码如下所示:

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()
        }
    }
}

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

我觉得你处理问题的方式不对。而不是思考

Put the java file in src/main/java and remove it from flavorX

你应该改为接近它

Add an extra source directory to the source sets for flavorY and 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']
}

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

如果你想避免编译特定的 class 然后使用这个:

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