You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Gradle插件从3.0.1升级到3.1.0报错,附固定资源ID代码

AGP 3.1.0升级后public-xml脚本报错的解决方案

我来帮你排查这个AGP升级导致的问题——这本质上是因为AGP 3.1.0对插件API做了不少非兼容改动,你原来的脚本依赖了内部未公开的API(比如VariantDataScope),这些API在3.1.0版本中被调整或移除,导致脚本无法正常运行。下面是修复后的完整代码和关键改动解释:

修复后的脚本代码

afterEvaluate {
    android.applicationVariants.all { variant ->
        // 使用AGP公开API获取mergeResources任务,替代原内部Scope调用
        def mergeResourcesTask = variant.mergeResourcesProvider.get()
        
        mergeResourcesTask.doLast {
            copy {
                int i = 0
                from(android.sourceSets.main.res.srcDirs) {
                    include 'values/public.xml'
                    rename 'public.xml', i++ == 0 ? "public.xml" : "public_${i}.xml"
                }
                // 标准化获取任务输出目录,替代原outputDir直接访问
                into(mergeResourcesTask.outputs.files.singleFile)
            }
        }
    }
}

关键改动点

  • 替换内部API为公开API
    原代码中variant.getVariantData().getScope()是AGP内部未公开的API,在3.1.0版本中被废弃。现在改用variant.mergeResourcesProvider.get()直接获取合并资源的任务,这是AGP 3.1+官方支持的公开API,稳定性和兼容性更好。
  • 修正输出目录访问方式
    AGP 3.x之后,任务的输出目录不再通过直接访问outputDir获取,而是需要通过outputs.files.singleFile来定位,这是Gradle任务输出的标准化访问方式。
  • 优化Variant遍历方式
    将原for (variant in android.applicationVariants)改为android.applicationVariants.all { variant -> },这是Gradle推荐的集合遍历写法,避免潜在的并发或遍历问题。

额外注意事项

如果你是在Library模块中使用这个脚本,需要把android.applicationVariants替换为android.libraryVariants,因为Library模块的Variant类型和Application模块不同。

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

火山引擎 最新活动