产品风味配置
ProductFlavors Configuration
我在我开发的应用程序的build.gradle中配置了一个常量。
它是 API 调用的 "End-Point" 常量。
当我在开发环境中开发时,应用程序调用一个 "End-Point",当我在生产环境中开发时,应用程序调用另一个 "End-Point"。
现在问题来了,当我为应用程序开发测试时,配置无法正确获取 End-Point。
有人可以帮助我吗?
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField STRING, API_URL, '"https://end-point-production/"'
}
debug {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
}
productFlavors {
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}
public class BaseController {
// Service url.
protected static final String API_URL = BuildConfig.API_URL;
/**
* Crates a basic retrofit request.
*
* @return Retrofit request.
*/
public static Retrofit getRetrofit() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(5, TimeUnit.SECONDS);
client.setReadTimeout(15, TimeUnit.SECONDS);
client.setWriteTimeout(5, TimeUnit.SECONDS);
return new Retrofit.Builder()
.baseUrl(API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create()))
.build();
}
}
@Before
public void setUp() throws Exception {
server = new MockWebServer();
server.start(8681);
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(5, TimeUnit.SECONDS);
client.setReadTimeout(15, TimeUnit.SECONDS);
client.setWriteTimeout(5, TimeUnit.SECONDS);
new Retrofit.Builder()
.baseUrl(API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create()))
.build();
}
您可以尝试这样做:
多了一个味道
productFlavors {
non_test {
}
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}
applicationVariants.all { variant ->
println("Iterating variant: " + variant.getName())
if (variant.getName() == "ui_testsRelease") {
buildConfigField STRING, API_URL, '"https://end-point-production/"'
} else if (variant.getName() == "ui_testsDebug") {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
} else if (variant.getName() == "non_testRelease"){
buildConfigField STRING, API_URL, '"https://end-point-production/"'
} else if (variant.getName() == "non_testDebug") {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
}
或者举个例子(看起来好一点):
只需移动 ui_tests
从 productFlavors
到 buildTypes
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField STRING, API_URL, '"https://end-point-production/"'
}
debug {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}
我在我开发的应用程序的build.gradle中配置了一个常量。 它是 API 调用的 "End-Point" 常量。 当我在开发环境中开发时,应用程序调用一个 "End-Point",当我在生产环境中开发时,应用程序调用另一个 "End-Point"。 现在问题来了,当我为应用程序开发测试时,配置无法正确获取 End-Point。 有人可以帮助我吗?
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField STRING, API_URL, '"https://end-point-production/"'
}
debug {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
}
productFlavors {
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}
public class BaseController {
// Service url.
protected static final String API_URL = BuildConfig.API_URL;
/**
* Crates a basic retrofit request.
*
* @return Retrofit request.
*/
public static Retrofit getRetrofit() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(5, TimeUnit.SECONDS);
client.setReadTimeout(15, TimeUnit.SECONDS);
client.setWriteTimeout(5, TimeUnit.SECONDS);
return new Retrofit.Builder()
.baseUrl(API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create()))
.build();
}
}
@Before
public void setUp() throws Exception {
server = new MockWebServer();
server.start(8681);
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(5, TimeUnit.SECONDS);
client.setReadTimeout(15, TimeUnit.SECONDS);
client.setWriteTimeout(5, TimeUnit.SECONDS);
new Retrofit.Builder()
.baseUrl(API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create()))
.build();
}
您可以尝试这样做:
多了一个味道
productFlavors {
non_test {
}
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}
applicationVariants.all { variant ->
println("Iterating variant: " + variant.getName())
if (variant.getName() == "ui_testsRelease") {
buildConfigField STRING, API_URL, '"https://end-point-production/"'
} else if (variant.getName() == "ui_testsDebug") {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
} else if (variant.getName() == "non_testRelease"){
buildConfigField STRING, API_URL, '"https://end-point-production/"'
} else if (variant.getName() == "non_testDebug") {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
}
或者举个例子(看起来好一点):
只需移动 ui_tests
从 productFlavors
到 buildTypes
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField STRING, API_URL, '"https://end-point-production/"'
}
debug {
buildConfigField STRING, API_URL, '"https://end-point-dev/"'
}
ui_tests {
buildConfigField STRING, API_URL, '"http://end-point-tests/"'
}
}