Android Gradle Library:如何将最终构建的AAR复制到指定目录并重命名
现有配置的核心问题
- 基于命令行请求的判断逻辑可靠性差:通过
gradle.getStartParameter().getTaskRequests()匹配构建类型,一旦出现多任务并行执行、命令行格式变更的场景,很容易匹配失效,导致分支逻辑走偏 - 复制任务的执行时机错位:普通Task中嵌套
copy代码块的写法,加上之前绑定的doLast、build.finalizedBy逻辑,无法保证AAR文件完全生成后再执行复制,经常出现复制空文件、复制历史残留文件的问题 - 重命名逻辑没有和具体构建变体绑定:硬扫
build/outputs/aar目录的写法,会把所有历史存在的aar文件都复制过去,重命名规则因为分支判断失效,也没法正确触发
可直接复用的落地配置
1. 移除不可靠的分支判断逻辑
把原来afterEvaluate块里所有通过taskReqStr.contains("assembleDebug")做分支判断的代码全部删除,替换为和Android构建变体强绑定的任务依赖逻辑,完全不依赖命令行参数做判断。
2. 重写AAR复制任务,采用标准Copy任务类型
原来的自定义copyAAR任务因为没有指定类型、执行时机不可控,需要替换为分别对应debug、release变体的独立Copy任务,精准匹配生成路径、自动完成重命名:
afterEvaluate { // 绑定Android插件自动生成的两个核心AAR构建任务 def assembleDebugTask = tasks.named("assembleDebug") def assembleReleaseTask = tasks.named("assembleRelease") // 配置Debug版本AAR的复制重命名规则 tasks.register("copyDebugAar", Copy) { // 必须等Debug版本AAR完全构建完成后再执行复制 dependsOn assembleDebugTask // 精准定位当前Debug构建产出的AAR文件,避免误扫目录下的历史残留文件 from "${buildDir}/outputs/aar/foo-debug.aar" // 指定目标输出目录 into "${projectDir}/../../../lib/" // 按固定规则重命名 rename "foo-debug.aar", "foo.aar" } // 配置Release版本AAR的复制重命名规则 tasks.register("copyReleaseAar", Copy) { dependsOn assembleReleaseTask from "${buildDir}/outputs/aar/foo-release.aar" into "${projectDir}/../../../lib/" rename "foo-release.aar", "foo.aar" } // 将复制任务绑定到对应构建流程的末尾,构建完成自动触发 assembleDebugTask.get().finalizedBy("copyDebugAar") assembleReleaseTask.get().finalizedBy("copyReleaseAar") // 保留原有的证书打包依赖逻辑,无需改动 tasks.preDebugBuild.dependsOn doPackCert tasks.preReleaseBuild.dependsOn doPackCert }
3. 清理冗余的无效配置
- 删除原来定义的旧
copyAAR整个任务块 - 删除文件最后一行
build.finalizedBy(copyAAR)的配置 - 原配置中设置的
archivesBaseName = "foo"可以保留,和上述AAR路径规则完全匹配。
注意:上述路径规则基于你现有配置中设置的
archivesBaseName = "foo"编写,如果后续调整AAR的基础文件名,同步修改from路径和rename匹配规则即可。
配置校验规则
- 该写法不需要手动触发复制任务,不管执行
./gradlew assembleDebug还是./gradlew assembleRelease,构建流程走完就会自动把对应AAR按规则复制到../../../lib/目录 - 复制逻辑是精准指向本次构建生成的AAR文件,不会把目录下其他版本的旧AAR一起复制,也不会出现AAR还没编译完成就提前执行复制的空文件问题
- 多任务并行执行场景下,不会因为命令行参数匹配错误出现复制逻辑错位的问题。
内容的提问来源于stack exchange,提问作者spartygw
相关产品推荐
相关产品推荐

