Gradle Android Studio 中的任务排序问题
Gradle task ordering issue in Android Studio
我正在使用 Android Studio 2.2 Beta 3,我的测试项目使用 CMake 构建混合 C++ 和 Java 应用程序。 JNI 接口由 SWIG 生成。这意味着我想在 externalNativeBuild 和 JavaCompile gradle 任务之前生成 SWIG 包装器;即我的 CMakeLists.txt 指定了 SWIG 生成的 cpp 包装文件,我的 java 代码导入了 SWIG 生成的 java 包装文件。
为了确保 SWIG 是 运行 并在任何任务之前生成必要的包装文件,我在 app/build.gradle 文件
中指定了以下内容
project.afterEvaluate {
preBuild.dependsOn("runSwig")
}
当我 运行 从命令行使用命令
./gradlew assembleDebug
我没有遇到任何问题,正如预期的那样,我的任务 "runSwig" 运行 比任何其他任务都早
:app:runSwig
:app:preBuild
:app:preDebugBuild
<blah blah more tasks>
:app:externalNativeBuildDebug
但问题是当项目首次在 Android Studio 中打开时,看起来外部本机构建在 运行Swig 之前被调用,我收到错误
CMake Error at CMakeLists.txt:79 (add_library):
Cannot find source file:
../../../wrap.cxx
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
FAILURE: Build failed with an exception.
直到我 assemble 使用命令行或从我的 CMakeLists.txt 中删除 wrap.cxx 文件并在 swig 获取 [=41] 后重新添加它,错误才会消失=] 至少成功一次。
是的,这是因为 Android Studio IDE 需要在编译前获取要在 IDE 中显示的文件:暴露命令行和 IDE 构建之间的不同行为。在 here 中,我破解下载所需的 repo 比其他任何事情都早,所以 Android Studio 不会抱怨。但它并不漂亮...而且 android 工作室启动时间长...
我 运行 在 Android Studio 3(我猜是 2.3)中的构建顺序遇到了同样的问题。
我不知道这是否是传统上有效的解决方案,但它 - 似乎 - 在我的 Android/SWIG/NDK 示例中有效(此处:https://github.com/sureshjoshi/android-ndk-swig-example)
我将其添加到我的 Gradle 文件中,以便在构建因缺少文件而失败之前调用 CMake。 CMake 调用 SWIG 自动生成我的 Java 文件并适当放置它们。
project.afterEvaluate {
javaPreCompileDebug.dependsOn externalNativeBuildDebug
}
我可能还需要一个
javaPreCompileRelease.dependsOn externalNativeBuildRelease
或类似的...只是还没有测试过。
源于这个问题:https://github.com/sureshjoshi/android-ndk-swig-example/issues/8
问题:由于某些原因,在 'preBuild' 任务阻止 CMakeList.txt 编译中将 build.gradle 自定义任务添加到 运行 SWIG 生成。
上一个回答对我帮助很大。
我有 build.gradle.kts 模块,下面的代码有效:
tasks.register("make-swig-script-executable", Exec::class) {
description = "Make swig-generate script executable"
commandLine = "chmod +x swig/run_shig.sh".split(" ")
}
tasks.register("swig-generate", Exec::class) {
dependsOn("make-swig-script-executable")
description = "Generating JNI files by swig"
commandLine = "swig/run_shig.sh".split(" ")
}
tasks.withType(JavaCompile::class) {
dependsOn("swig-generate")
}
project.afterEvaluate {
task("javaPreCompileDebug").dependsOn("externalNativeBuildDebug")
}
我的代码中有以下几行,它不工作:
//same tasks swig-generate and make-swig-script-executable
//but different "trigger event" (on preBuild)
tasks.matching { it.name == "preBuild" }.all {
dependsOn("swig-generate")
}
我正在使用 Android Studio 2.2 Beta 3,我的测试项目使用 CMake 构建混合 C++ 和 Java 应用程序。 JNI 接口由 SWIG 生成。这意味着我想在 externalNativeBuild 和 JavaCompile gradle 任务之前生成 SWIG 包装器;即我的 CMakeLists.txt 指定了 SWIG 生成的 cpp 包装文件,我的 java 代码导入了 SWIG 生成的 java 包装文件。
为了确保 SWIG 是 运行 并在任何任务之前生成必要的包装文件,我在 app/build.gradle 文件
中指定了以下内容project.afterEvaluate {
preBuild.dependsOn("runSwig")
}
当我 运行 从命令行使用命令
./gradlew assembleDebug
我没有遇到任何问题,正如预期的那样,我的任务 "runSwig" 运行 比任何其他任务都早
:app:runSwig
:app:preBuild
:app:preDebugBuild
<blah blah more tasks>
:app:externalNativeBuildDebug
但问题是当项目首次在 Android Studio 中打开时,看起来外部本机构建在 运行Swig 之前被调用,我收到错误
CMake Error at CMakeLists.txt:79 (add_library):
Cannot find source file:
../../../wrap.cxx
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
FAILURE: Build failed with an exception.
直到我 assemble 使用命令行或从我的 CMakeLists.txt 中删除 wrap.cxx 文件并在 swig 获取 [=41] 后重新添加它,错误才会消失=] 至少成功一次。
是的,这是因为 Android Studio IDE 需要在编译前获取要在 IDE 中显示的文件:暴露命令行和 IDE 构建之间的不同行为。在 here 中,我破解下载所需的 repo 比其他任何事情都早,所以 Android Studio 不会抱怨。但它并不漂亮...而且 android 工作室启动时间长...
我 运行 在 Android Studio 3(我猜是 2.3)中的构建顺序遇到了同样的问题。
我不知道这是否是传统上有效的解决方案,但它 - 似乎 - 在我的 Android/SWIG/NDK 示例中有效(此处:https://github.com/sureshjoshi/android-ndk-swig-example)
我将其添加到我的 Gradle 文件中,以便在构建因缺少文件而失败之前调用 CMake。 CMake 调用 SWIG 自动生成我的 Java 文件并适当放置它们。
project.afterEvaluate {
javaPreCompileDebug.dependsOn externalNativeBuildDebug
}
我可能还需要一个
javaPreCompileRelease.dependsOn externalNativeBuildRelease
或类似的...只是还没有测试过。
源于这个问题:https://github.com/sureshjoshi/android-ndk-swig-example/issues/8
问题:由于某些原因,在 'preBuild' 任务阻止 CMakeList.txt 编译中将 build.gradle 自定义任务添加到 运行 SWIG 生成。
上一个回答
tasks.register("make-swig-script-executable", Exec::class) {
description = "Make swig-generate script executable"
commandLine = "chmod +x swig/run_shig.sh".split(" ")
}
tasks.register("swig-generate", Exec::class) {
dependsOn("make-swig-script-executable")
description = "Generating JNI files by swig"
commandLine = "swig/run_shig.sh".split(" ")
}
tasks.withType(JavaCompile::class) {
dependsOn("swig-generate")
}
project.afterEvaluate {
task("javaPreCompileDebug").dependsOn("externalNativeBuildDebug")
}
我的代码中有以下几行,它不工作:
//same tasks swig-generate and make-swig-script-executable
//but different "trigger event" (on preBuild)
tasks.matching { it.name == "preBuild" }.all {
dependsOn("swig-generate")
}