我们现在有一个Android应用,可以使用Retrofit正常工作。我们正在尝试自动化构建以进行测试和产品发布,以减少人为错误的可能性(例如,开发人员在为生产而构建时忘记将基本URL指向产品。等)
我注意到翻新的基本URL在类文件中定义。是否可以使用任何方法将其配置为在属性文件或xml中,以便我们可以使用Gradle脚本选择要包含在构建中的正确文件?
谢谢
答案 0 :(得分:2)
您可以在buildTypes中定义一个常量:
buildTypes {
debug {
buildConfigField "String", "API_URL", "\"https://url/pre/\""
}
release {
buildConfigField "String", "API_URL", "\"https://url/pro/\""
}
}
然后在改造生成器中使用它:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.API_URL)
.build();
请注意,如果您有不同的模块,则在每个模块中都定义BuildConfig。对于这种情况,我在app模块中定义buildTypes,并在使用改造生成器对该模块的调用中将BuildConfig.API_URL作为参数传递。
答案 1 :(得分:0)
您可以创建一个类似于“ urls.xml”的文件,并以字符串形式获取您的url。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="base_url">https://www.myurl.com</string>
</resources>
这样,您可以根据自己的风格和构建类型配置不同的url。
答案 2 :(得分:0)
除了Gradle构建类型配置外,如果您的逻辑比几个字段(或确切的实现)多,则可以通过将其放置在正确的文件夹中来定义仅存在于flavor / build-type中的类/文件。
例如,您可以创建一个config
文件(Java / Kotlin),而不是将其放置在模块的main/java/example/package/config.java
文件夹中,而是将其放置在debug/java/example/package/config.java
和{{1 }}使用相同的程序包名称,以区分那些构建类型的实现。
以您的示例为例,该文件可以包含一个静态字段release/java/example/package/config.java
,该字段在不同的构建类型/风味上具有不同的值。
这也可以用完全相同的方式完成。
答案 3 :(得分:0)
好吧,昨天我只是被困在这个问题上,却找不到任何能解决我问题的东西,所以这就是我的工作方式:
在需要BASEURL或任何内容时随时创建一个公共类,并在其中创建公共静态字符串名称(BASE)并在其中输入基本URL。
现在从改造类中访问该类,并在BASEURL.BASE之类的baseURL方法中选择该静态元素;
为什么我需要做一些事情,例如Retrofit .baseurl方法只需要一个静态字符串,当我们从strings.xml访问一个字符串时,将其保存为静态字符串会产生一些错误,所以这是我解决的另一种方法效果很好,将为您服务。
答案 4 :(得分:0)
我认为由 Gradle 执行此类任务是最佳选择,因为它可以轻松自动化构建过程。但我将通过 build.gradle(:app)
与图像共享执行此过程的过程,因为我们需要支付额外费用在 buildTypes
中添加 API URL 时注意 java 的 escape sequence 否则 URL 将无法在 BuildConfig
中正确生成并产生 Cannot resolve ...
错误,如下图 -
所以正确的解决方案是添加遵循转义序列的 URL,如下图所示-