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
相关产品推荐
相关产品推荐

