产品风味配置

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