Gradle通过processResources过滤、manifestPlaceholders(Android专用)或自定义Copy任务实现XML占位符${key}替换;需注意转义($$)、属性作用域及XML合法性校验。

Gradle 本身不直接解析或替换 XML 文件中的占位符(如 ${name}),但可以通过多种方式在构建过程中实现 XML 占位符的替换,核心思路是:把 XML 当作资源文件处理,在打包(如生成 APK、JAR 或 WAR)前用 Gradle 的资源过滤机制或自定义任务完成替换。
使用 processResources 任务做资源过滤
这是最常用、最轻量的方式,适用于 src/main/resources 下的 XML(比如配置文件、Spring bean 定义等)。Gradle 的 processResources 默认支持属性替换,只需启用过滤并提供属性源。
- 在
build.gradle中配置:
processResources {
filesMatching('**/*.xml') {
expand(project.properties) // 替换 ${key} 为 project.property('key')
}
}
- 确保占位符写法匹配 Groovy 字符串插值风格(即
${key},不是@key@或#{key}) - 在命令行传入属性:
./gradlew build -PappVersion=1.2.3,XML 中的${appVersion}就会被替换成1.2.3 - 也可用
ext预定义属性:ext.apiHost = "https://api.example.com",然后在 XML 中写${apiHost}
对 Android 项目:用 manifestPlaceholders + AndroidManifest.xml
Android Gradle 插件专门支持 AndroidManifest.xml 中的占位符,语法是 ${APP_NAME},需通过 manifestPlaceholders 注入。
- 在
android.defaultConfig或buildTypes中设置:
android {
defaultConfig {
manifestPlaceholders = [appName: "MyApp", versionCode: 42]
}
buildTypes {
release {
manifestPlaceholders += [trackingEnabled: "true"]
}
}
}
- 在
AndroidManifest.xml中使用:android:label="${appName}"或meta-data android:value="${trackingEnabled}" - 注意:只对
AndroidManifest.xml生效,且仅限该文件;其他 XML(如 res/xml/)不走这套机制
自定义 Copy 任务处理任意 XML 文件
当 XML 不在标准资源路径(如放在 config/ 目录下),或需要更灵活控制(比如多环境模板、保留原始文件),可写一个 Copy 任务。
- 示例:从
src/config/template.xml复制并替换后输出到build/config/app.xml
task generateConfigXml(type: Copy) {
from 'src/config/template.xml'
into 'build/config'
expand(
appName: project.findProperty('appName') ?: 'DevApp',
env: project.findProperty('env') ?: 'dev'
)
}
- 用
expand()替换${appName};用findProperty()安全读取参数,避免未定义时报错 - 让其他任务依赖它:
classes.dependsOn generateConfigXml),确保生成时机正确
注意事项与常见问题
占位符替换看着简单,但容易踩坑:










