如何用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目录 - 命令执行优化:改进命令执行逻辑,单独捕获错误输出,方便定位构建失败原因
使用提示
- 确保src目录下存在
package.json和tsconfig.json,且npm run build能正确将TS编译到指定目录 - 如果你的npm编译输出目录不是默认值,需在
buildWeb任务的doLast块中添加复制步骤,将产物同步到webOutputDir - 执行
./gradlew assembleDebug或./gradlew assembleRelease时,会自动触发TS编译并将产物打包到Assets - 当src目录下的TS/JS文件或配置文件变更时,Gradle会在下一次构建时自动重新执行
buildWeb
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

