gpt4 book ai didi

android - 在 Android gradle 构建中,在构建期间更改 strings.xml 的内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:23 26 4
gpt4 key购买 nike

我希望能够在 gradle 构建期间从我们的 CMS(或某些数据库)的 res/values/strings.xml 加载用户可见字符串的值。

例如

<string name="button_label">OK, do it</string>

可以改成

<string name="button_label">OK, do it now!</string>

...或其他什么。

我们的想法是在构建时从我们的 CMS 中读取新值,然后将其烘焙到 APK 文件中。 (动机是自动更改应用字符串,以便应用中的任何文本都可以从现有的 CMS 中读取)。

实现此目标的最佳方法是什么?是否可以在构建期间生成/修改资源文件(例如 strings.xml ),就在它们被 Android 构建系统使用之前?


添加更多要求:

最佳答案

这是一个通过外部属性文件修改字符串的解决方案。不确定这是否完全符合您的要求,但它应该让您开始。

我在我的构建中做了类似的事情——我有一些自定义的 gradle 任务,在它们的 doFirst() 中调用了这种类型的替换。这里的正则表达式可能需要一些改进,输入格式可能会根据您的要求而改变,但在一些本地测试中这似乎对我有用。

ext.updateStrings = {
println("Changing strings!")
Properties props = new Properties()
props.load(new FileInputStream(file('cms.properties')))
def stringsFile = file("src/main/res/values/strings.xml")
def stringsText = stringsFile.getText()
for (p in props) {
def pattern = Pattern.compile(String.format("%s\">.*<", p.key));
def match = pattern.matcher(stringsText);
match.find();
println("found key " + p.key + ", replacing string with " + p.value)
stringsText = match.replaceAll(String.format("%s\">%s<", p.key, p.value))
stringsFile.write(stringsText)
}
}

我将我的外部属性/函数保存在一个单独的文件中(例如 common.gradle)。在您的 build.gradle 中,您可以像这样添加一个自定义任务:

apply from: "common.gradle"
task updateStringsXml() {
doFirst {
updateStrings()
}
}

然后,您的 gradle 命令可能看起来像 gradle updateStringsXml assembleRelease

关于android - 在 Android gradle 构建中,在构建期间更改 strings.xml 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com