【发布时间】:2016-04-04 01:04:00
【问题描述】:
假设我们有 strings_test.xml,它存储用于测试的字符串值,应该在调试版本中显示。当 apk 被构建为发布版本时,所有值都应更改为空字符串,例如<string name="test_some_card_text">@string/empty</string>.
有没有可能做到这一点?
一如既往,提前致谢。
【问题讨论】:
假设我们有 strings_test.xml,它存储用于测试的字符串值,应该在调试版本中显示。当 apk 被构建为发布版本时,所有值都应更改为空字符串,例如<string name="test_some_card_text">@string/empty</string>.
有没有可能做到这一点?
一如既往,提前致谢。
【问题讨论】:
是的,您可以在 buildTypes 下的应用程序 gradle 中执行此操作。
buildTypes {
mybuild {
resValue "string", "test_some_card_text", '"test"'
resValue "string", "other_text", '"other"'
}
debug {
resValue "string", "test_some_card_text", '"test"'
resValue "string", "other_text", '"other"'
}
}
然后像这样访问它。
getApplicationContext().getResources().getString(R.string.test_some_card_text);
getApplicationContext().getResources().getString(R.string.other_text);
对于构建,您需要选择 build variants 并且必须构建它。
【讨论】:
是的,Gradle 允许您覆盖字符串。
在你的 app/build.gradle 中的 buildTypes{} 中添加这个
调试{ applicationIdSuffix “调试” }
这应该在main 旁边创建一个名为debug 的目录。如果没有,则手动创建一个。 (说真的,我还没有尝试过,但我知道这是可能的。)
然后,如果您的 strings_test.xml 在 res/values 下,请在 debug/ 下创建类似的目录结构,并将带有调试特定字符串的 strings_text.xml 放在那里。这将显示在您的调试版本中。 release/main/res/values 下的那些将显示在您的发布版本中。
PS:您可以根据 buildTypes 和风格覆盖所有资源和资产数据。您不能覆盖 Java 文件,但是您可以添加它们。
【讨论】:
正如@Aditya Naik 所说,可以使用 Flavors。 官方文档说
BuildType -> Flavor -> main -> 依赖项。
这意味着如果在 Build Type 和 main 中都声明了一个资源,则会选择 Build Type 中的那个。
请注意,对于合并的范围,相同(类型、名称)但不同限定符的资源分别处理。
这意味着如果 src/main/res 有
- res/layout/foo.xml
res/layout-land/foo.xml
并且 src/debug/res 有
res/layout/foo.xml
然后合并的资源文件夹将包含来自 src/debug/res 的默认 foo.xml,但来自 src/main/res 的横向版本
【讨论】:
创建 apk 后无法更改字符串值。 但是您可以在创建 apk 后动态地将值分配给 text 或 edittext ... etx。
【讨论】:
对于那些来这里寻找某种方式将类似方法应用于raw 资源的人,我使用buildConfigField 处理它。
gradle
...
buildTypes {
debug {
...
buildConfigField "int", "shared_resource_name", 'R.raw.debug_resource_name'
...
}
prod {
...
buildConfigField "int", "shared_resource_name", 'R.raw.prod_resource_name'
...
}
}
注意引号。之后,将BuildConfig.shared_resource_name 放在以前可以直接访问R.raw.resource_value 的文件中。
这可以用于我认为的其他资源。
【讨论】: