You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Android的configureCMake任务依赖自定义Conan安装任务?

在Android Gradle Plugin v8中让ConfigureCMake任务依赖自定义Conan安装任务的解决方案

针对你遇到的ConfigureCMake任务与自定义Conan安装任务执行顺序错乱、clean后构建失败的问题,可通过AGP v8的组件模型API实现可靠的任务依赖关联,具体方案如下:

1. 利用AndroidComponents关联任务

AGP v8推荐使用androidComponents块处理Variant相关配置,它能在任务延迟创建阶段正确定位到ConfigureCMake任务,避免空指针异常。

Kotlin DSL 实现

androidComponents {
    onVariants(selector().all()) { variant ->
        // 遍历当前Variant的所有CMake外部构建配置
        variant.externalNativeBuild.forEach { externalBuild ->
            if (externalBuild is CmakeExternalNativeBuild) {
                // 为每个ABI对应的ConfigureCMake任务添加依赖
                externalBuild.abis.forEach { abi ->
                    val configureTaskName = "configureCMake${variant.name.replaceFirstChar(Char::uppercase)}${abi.replaceFirstChar(Char::uppercase)}"
                    project.tasks.named(configureTaskName).configure {
                        // 关联自定义Conan安装任务(替换为你的任务名)
                        it.dependsOn("installConanDependencies")
                    }
                }
            }
        }
    }
}

Groovy 实现

androidComponents {
    onVariants(selector().all()) { variant ->
        variant.externalNativeBuild.each { externalBuild ->
            if (externalBuild instanceof CmakeExternalNativeBuild) {
                externalBuild.abis.each { abi ->
                    def configureTaskName = "configureCMake${variant.name.capitalize()}${abi.capitalize()}"
                    project.tasks.named(configureTaskName).configure {
                        it.dependsOn("installConanDependencies")
                    }
                }
            }
        }
    }
}

2. 确保自定义Conan任务的增量构建能力

为了避免Conan任务重复执行,必须为其声明正确的输入输出,让Gradle能根据文件哈希判断是否需要重新运行:

tasks.register<Exec>("installConanDependencies") {
    // 输入:依赖配置文件(根据你的实际路径调整)
    inputs.files("conanfile.txt", "src/main/cpp/CMakeLists.txt")
    // 输出:Conan生成的产物目录(根据你的实际输出路径调整)
    outputs.dir("$buildDir/conan_install")

    // 执行Conan安装命令,可根据Variant的构建类型、ABI动态调整参数
    val buildType = project.findProperty("buildType") ?: "debug"
    commandLine("conan", "install", ".", 
        "--output-folder=$buildDir/conan_install",
        "-s", "build_type=${buildType.uppercase()}",
        "-s", "compiler=clang"
    )
}

3. 关键原理说明

  • tasks.named()会等待目标任务被AGP延迟创建后再执行配置,避免了直接查找任务时的空指针问题。
  • 通过dependsOn明确依赖关系后,Gradle会强制Conan安装任务在ConfigureCMake任务之前执行,彻底解决并行执行或顺序颠倒的问题。
  • 正确的输入输出声明让Gradle仅在配置文件变化时才重新运行Conan任务,避免不必要的全量编译。

内容的提问来源于stack exchange,提问作者DoDo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:40:24