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

AGP 7中DefaultManifestParser已废弃,获取versionName的替代方案是什么

AGP 7.0+ 从AndroidManifest获取versionName的可行方案

以下是两种经过验证的稳定实现方式,优先推荐使用公开API避免后续版本兼容问题:

方案1:直接解析AndroidManifest文件(通用兼容)

如果仅需要读取静态清单文件的固定值,不需要和构建Variant配置联动,可以直接用Groovy/Kotlin自带的XML解析能力实现,不依赖AGP内部API,适配所有AGP版本:

// Module级build.gradle
def getVersionNameFromManifest() {
    def manifestFile = file("src/main/AndroidManifest.xml")
    def manifest = new XmlSlurper().parse(manifestFile)
    return manifest.@versionName
}

// 调用示例
println "静态manifest的versionName:${getVersionNameFromManifest()}"

如果是多渠道/多构建类型有独立manifest,替换对应文件路径即可读取对应配置。

方案2:使用AGP新Variant API获取(官方推荐)

官方废弃DefaultManifestParser后,推荐通过公开Variant API获取合并后的最终versionName,支持懒加载机制,数值和最终打包进APK的配置完全一致:

android {
    // 其他原有配置...
    onVariants { variant ->
        // 直接获取经过风味、构建类型合并后的versionName
        def versionName = variant.mergedFlavor.versionName.get()
        println "${variant.name}构建的versionName:${versionName}"
        
        // 如果需要读取合并后最终manifest的完整内容,可以监听构建任务
        variant.outputs.each { output ->
            output.processManifestProvider.get().doLast { task ->
                def mergedManifestFile = new File(task.manifestOutputDirectory.get().asFile, "AndroidManifest.xml")
                def finalVersionName = new XmlSlurper().parse(mergedManifestFile).@versionName
                println "合并后最终versionName:${finalVersionName}"
            }
        }
    }
}

你提到的VariantDslInfo属于AGP内部非公开API,没有稳定调用入口,后续版本可能随时变更,不建议在构建脚本中直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:27:03