

新闻资讯
技术学院Gradle通过processResources过滤、manifestPlaceholders(Android专用)或自定义Copy任务实现XML占位符${key}替换;需注意转义($$)、属性作用域及XML合法性校验。
Gradle 本身不直接解析或替换 XML 文件中的占位符(如 ${name}),但可以通过多种方式在构建过程中实现 XML 占位符的替换,核心思路是:把 XML 当作资源文件处理,在打包(如生成 APK、JAR 或 WAR)前用 Gradle 的资源过滤机制或自定义任务完成替换。
这是最常用、最轻量的方式,适用于 src/main/resources 下的 XML(比如配置文件、Spring bean 定义等)。
Gradle 的 processResources 默认支持属性替换,只需启用过滤并提供属性源。
build.gradle 中配置:
processResources {
filesMatching('**/*.xml') {
expand(project.properties) // 替换 ${key} 为 project.property('key')
}
}
${key},不是 @key@ 或 #{key})./gradlew build -PappVersion=1.2.3,XML 中的 ${appVersion} 就会被替换成 1.2.3ext 预定义属性:ext.apiHost = "https://api.example.com",然后在 XML 中写 ${apiHost}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/)不走这套机制当 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),确保生成时机正确占位符替换看着简单,但容易踩坑:
$(比如正则表达式、货币符号),需写成 $$,否则会被误认为占位符开头project.properties 只包含命令行 -P 和 gradle.properties 中的键;ext 属性需显式传入 expand(...) 才生效& 应保持为 &),建议在 CI 中加 XML 校验步骤processResources 的替换结果,调试时看到的是原始 XML —— 实际打包产物才含替换后的内容