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')
}
}
</font>
<ul>
<li>确保占位符写法匹配 Groovy 字符串插值风格(即 <code>${key}</code>,不是 <code>@key@</code> 或 <code>#{key}</code>)</li>
<li>在命令行传入属性:<code>./gradlew build -PappVersion=1.2.3</code>,XML 中的 <code>${appVersion}</code> 就会被替换成 <code>1.2.3</code></li>
<li>也可用 <code>ext</code> 预定义属性:<code>ext.apiHost = "https://api.example.com"</code>,然后在 XML 中写 <code>${apiHost}</code></li>
</ul>
<H3>对 Android 项目:用 manifestPlaceholders + AndroidManifest.xml</H3>
<p>Android Gradle 插件专门支持 <code>AndroidManifest.xml</code> 中的占位符,语法是 <code>${APP_NAME}</code>,需通过 <code>manifestPlaceholders</code> 注入。</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/1236" title="Lexica"><img
src="https://img.php.cn/upload/ai_manual/001/431/639/68b79dfcedec8508.png" alt="Lexica" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/1236" title="Lexica">Lexica</a>
<p>一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。</p>
</div>
<a href="/ai/1236" title="Lexica" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
<ul>
<li>在 <code>android.defaultConfig</code> 或 <code>buildTypes</code> 中设置:</li>
</ul>
<font color="#888">
<pre class="brush:php;toolbar:false;">
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),确保生成时机正确
注意事项与常见问题
占位符替换看着简单,但容易踩坑:









