Android模块化流水线优化:能否单独构建模块并附加到主应用工件?
优化Azure DevOps Android流水线:仅构建变更模块并更新主工件
当然可以实现,针对你这种已模块化的Android应用,核心思路是自动识别变更模块→仅构建变更部分→替换主工件中的对应模块,具体方案如下:
一、第一步:自动检测变更模块
在流水线中添加脚本任务,通过Git对比当前提交与上一次成功构建的提交,精准定位变更的模块 prom举一反三Calculate其中有 freedoms [ial即可 proposed swing
归档 sign,直接用脚本提取:
示例Bash脚本(Azure DevOps任务中执行)
# 获取上一次成功构建的Commit SHA LAST_SUCCESS_COMMIT=$(az pipelines build list --definition-id $(System.DefinitionId) --status succeeded --top 1 --query "[0].sourceVersion" -o tsv) # 提取变更文件对应的模块 CHANGED_MODULES=() for FILE in $(git diff --name-only $LAST_SUCCESS_COMMIT $(Build.SourceVersion)); do # 匹配你的模块目录(core/domain/app) MODULE=$(echo $FILE | cut -d'/' -f1) if [[ "$MODULE" =~ ^(core|domain|app)$ ]]; then CHANGED_MODULES+=(":$MODULE") fi done # 去重并设置流水线变量,供后续步骤调用 CHANGED_MODULES=($(echo "${CHANGED_MODULES[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) echo "##vso[task.setvariable variable=ChangedModules]${CHANGED_MODULES[*]}"
二、分场景处理模块更新
根据你的模块类型(动态特性/静态Library),选择对应的更新方案:
1. 动态特性模块(推荐,最适合独立更新)
如果你的:core/:domain是动态特性模块(与主:app模块分离,可独立分发):
- 仅构建变更模块:执行
./gradlew ${ChangedModules}:bundleRelease生成对应模块的bundle文件 - 从Azure Artifacts下载最新的主AAB/APK工件
- 解压主AAB(本质是Zip包),替换其中对应模块的编译产物目录
- 重新压缩为新的AAB,并用与原工件相同的签名密钥签名
- 将新的AAB/APK发布回Azure Artifacts
2. 静态Library模块(依赖型模块)
如果:core/:domain是被:app依赖的静态Library模块:
- 启用Azure DevOps的Gradle缓存:添加
Cache@2任务,缓存.gradle/caches、.gradle/wrapper以及各模块build/outputs/aar目录,避免重复编译未变更模块 - 仅构建变更的Library模块:执行
./gradlew ${ChangedModules}:assembleRelease生成新的AAR文件 - 构建主
:app模块:Gradle会自动使用缓存的未变更模块AAR,仅编译打包:app模块的变更部分(如果有的话),生成新的APK/AAB - 将新工件发布到Azure Artifacts
三、关键注意事项
- 签名一致性:更新后的APK/AAB必须使用与原工件完全相同的签名密钥,否则无法作为合法的应用更新包
- 缓存有效性:针对静态Library模块,合理配置缓存能大幅缩短构建时间,即使需要构建
:app模块,也无需重复编译未变更的依赖 - 模块边界清晰:确保模块间依赖关系简单,避免变更一个模块触发其他模块的重新编译(比如避免循环依赖、减少跨模块代码引用)
内容的提问来源于stack exchange,提问作者Marcelo Esser
相关产品推荐
相关产品推荐

