【问题标题】:ProductFlavors ConfigurationProductFlavors 配置
【发布时间】:2017-10-14 20:57:26
【问题描述】:

我在我开发的应用程序的 build.gradle 中配置了一个常量。 它是 API 调用的“端点”常量。 当我在开发环境中开发时,应用程序调用一个“端点”,当我在生产环境中开发时,应用程序调用另一个“端点”。 现在问题来了,当我为应用程序开发测试时,配置无法正确获取端点。 有人可以帮我吗?

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();
}

【问题讨论】:

    标签: android android-gradle-plugin android-espresso android-productflavors


    【解决方案1】:

    您可以尝试这样做:

    还有一种味道

    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/"'
        }
    }
    

    【讨论】:

    • 我选择在我的应用程序中使用 3 种 buildTypes、realese、debug 和 uiTest。我的应用程序还有另一个问题,当我在应用程序中更改 uiTest 的 BuildVariant 时,测试库(Espresso 和 JUnit)停止工作。你能帮我解决这个问题吗?
    • 我建议您为此创建一个关于 SO 的新问题。你会做精心设计的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2017-10-05
    • 2018-03-31
    • 2022-11-07
    • 2014-06-09
    • 1970-01-01
    相关资源
    最近更新 更多