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

如何用Gradle构建Android非Java自定义库并实现src目录变更触发构建

配置Gradle构建Android库:编译TypeScript到Assets并自动触发构建

我希望使用Gradle为自有项目构建一个Android库,将TypeScript文件编译为JS并添加到Android assets目录中。我不希望Gradle处理任何Java相关操作,请问如何配置Gradle,使其在src目录下的文件发生变更时自动触发构建?

以下是符合需求的Gradle配置方案,已针对你的场景做了优化调整:

plugins {
    id "com.android.library"
}

// 关闭所有Java/Kotlin相关构建流程,避免Gradle处理Java代码
android {
    compileSdk 34
    namespace "com.yourcompany.yourlibrary" // 替换为你的实际包名
    sourceSets {
        main {
            // 清空Java/Kotlin源目录,阻止Gradle扫描这类文件
            java.srcDirs = []
            kotlin.srcDirs = []
            // 将TS编译后的JS输出目录设为Assets源
            assets.srcDirs += project.layout.buildDirectory.dir("web-output")
        }
    }

    // 禁用Java/Kotlin编译任务
    tasks.withType(JavaCompile).configureEach {
        enabled = false
    }
    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
        enabled = false
    }
}

// 封装命令执行工具方法,捕获输出和错误信息
def runCommand(String command) {
    def proc = command.execute()
    proc.in.eachLine { line -> println "[WEB BUILD] $line" }
    proc.err.eachLine { line -> println "[WEB BUILD ERROR] $line" }
    proc.waitFor()
    if (proc.exitValue() != 0) {
        throw new GradleException("Web构建失败,退出码:${proc.exitValue()}")
    }
}

// 定义Web构建任务,配置输入输出实现自动触发和增量构建
tasks.register('buildWeb') {
    group "Build"
    description "编译TypeScript为JavaScript并输出到指定目录"

    // 输入:监听src目录下的TS/JS源码及配置文件(可根据项目调整匹配规则)
    inputs.dir(project.layout.projectDirectory.dir("src"))
        .include("**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "package.json", "tsconfig.json")

    // 输出:指定到Gradle构建目录下,避免污染项目根目录
    def webOutputDir = project.layout.buildDirectory.dir("web-output")
    outputs.dir(webOutputDir)

    doLast {
        // 执行npm build命令,指定src为工作目录
        runCommand("npm run build --prefix ${project.layout.projectDirectory.dir("src").getAsFile().absolutePath}")
        
        // 如果你的npm build输出目录不是webOutputDir,添加复制步骤(示例)
        // copy {
        //     from project.layout.projectDirectory.dir("src/dist")
        //     into webOutputDir
        // }
    }
}

// 关联Android Assets打包任务,确保先完成TS编译再打包Assets
tasks.named("mergeDebugAssets").configure {
    dependsOn buildWeb
}
tasks.named("mergeReleaseAssets").configure {
    dependsOn buildWeb
}

// 执行组装任务时自动触发Web构建
tasks.named("assembleDebug").configure {
    dependsOn buildWeb
}
tasks.named("assembleRelease").configure {
    dependsOn buildWeb
}

关键配置说明

  • 禁用Java相关构建:通过清空Java/Kotlin源目录、禁用编译任务,彻底跳过Gradle的Java代码处理流程
  • 自动触发与增量构建:给buildWeb任务配置输入输出目录,Gradle会自动检测src目录下的文件变化,仅在必要时重新执行构建
  • Assets打包关联:让Android的Assets合并任务依赖buildWeb,确保编译后的JS文件被正确加入到Assets目录
  • 命令执行优化:改进命令执行逻辑,单独捕获错误输出,方便定位构建失败原因

使用提示

  1. 确保src目录下存在package.json和tsconfig.json,且npm run build能正确将TS编译到指定目录
  2. 如果你的npm编译输出目录不是默认值,需在buildWeb任务的doLast块中添加复制步骤,将产物同步到webOutputDir
  3. 执行./gradlew assembleDebug或./gradlew assembleRelease时,会自动触发TS编译并将产物打包到Assets
  4. 当src目录下的TS/JS文件或配置文件变更时,Gradle会在下一次构建时自动重新执行buildWeb

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:11