在开发Android应用程序时如何管理多个环境?

时间:2014-04-10 17:32:53

标签: android

我们正在构建一个连接到云端的Android应用。我们有API的测试URL和生产URL。我们将应用程序连接到我们的本地开发机器,以便在开发时与数据库进行通信,但每当我们为Play商店生成APk时,我们都会修改生产URL的全局API URL。

有没有更好的方法来管理Android环境?我们还可以有两个版本的应用程序(开发版本)和Play商店版本吗?我无法拥有两个版本,因为这两个应用程序具有相同的签名。我们如何最好地管理这个?

5 个答案:

答案 0 :(得分:11)

这可以使用产品口味来实现。

为了达到这个要求:

首先,在项目的app文件夹下创建2个文件,说明 development.props production.props 。或者您可以将这两个文件添加到app文件夹中的一个包中。比如config。

enter image description here

基本上,这两个文件包含键和值。这两个文件的密钥相同。但他们的价值观是不同的。这些文件包含一个键,表示“SERVER_URL”及其值。它将写成这样:

<强> SERVER_URL =” Server_url_value”

在这种情况下,只有URL不同。所以,我在Props文件中只添加了一个键值对。你可以添加更多。

然后,在app build.gradle文件中创建ProductFlavours,说开发和生产。现在,访问包含URL的不同道具文件,如下所示:

productFlavors {
    development {
        getProps('./config/development.props').each { p ->
            buildConfigField 'String', p.key, p.value
        }
    }
    production {
        getProps('./config/production.props').each { p ->
            buildConfigField 'String', p.key, p.value
        }
    }
}

def getProps(path) {
    Properties props = new Properties()
    props.load(new FileInputStream(file(path)))
    return props
}

现在,对于每种风格,都有一个构建类型在app build.gradle中添加了 BuildType 。例如,构建类型为调试发布。我有两种口味,即开发和生产。因此,gradle任务将使用flavor和build类型创建,如下所示:

assemble{flavourName}{BuildType}

现在,您只需要输入这些命令。它会生成所需的APK及其相应的URL。命令是:

./gradlew assembleProductionRelease会使用生产网址生成发布版本。

./gradlew assembleDevelopmentDebug将使用开发URL生成调试版本。

./gradlew assembleProductionDebug将使用生产URL生成调试版本。

./gradlew assembleDevelopmentRelease将使用开发网址生成发布版本。

三个gradle任务非常有用。但最后一项任务将使用开发URL生成Release版本。但不建议这样做。因此,我们应该阻止开发人员执行此任务,即./gradlew assembleDevelopmentRelease

现在要限制开发人员使用开发URL生成发布版本,请在app build.gradle文件中添加此代码段:

android.variantFilter { variant ->
    if(variant.buildType.name.equals('release')
            && variant.getFlavors().get(0).name.equals('development')) {
        variant.setIgnore(true);
    }
}

现在,如果我们尝试执行任务,即./gradlew DevelopmentRelease。 Gradle将停止生成构建并抛出异常,并说:此任务在根项目中找不到assembleDevelopmentRelease。

答案 1 :(得分:3)

使用Ant至少构建生产版本。这样,您可以在构建期间设置某些配置值/标志。假设您有一个包含服务器URL的config.xml文件。您可以拥有不同的Ant构建目标,这些目标将更改URL以指向相应的服务器。查看this教程。它完全解释了如何完成。

答案 2 :(得分:2)

如果您使用带有gradle的android studio,我认为这是一种麻烦的做法。

您可能需要查看此文章:http://tulipemoutarde.be/2013/10/06/gradle-build-variants-for-your-android-project.html

也可在YouTube视频中使用:https://www.youtube.com/watch?v=7JDEK4wkN5I

这也允许您为同一个应用程序提供两个不同的包名称。

它使用gradle风格来实现您正在寻找的内容,并且非常容易实现。

答案 3 :(得分:2)

您可以尝试使用gradle buildType productFlavor 。它将允许您指定不同的环境变量,如url,versionName等。而applicationId将允许您拥有dev和prod构建。 有关详细信息http://developer.android.com/tools/building/configuring-gradle.html

答案 4 :(得分:0)

我不知道在这种情况下最佳做法是什么,但我确实喜欢这样:

您可以将您的应用设为LIB并创建2个应用:生产应用和测试应用。导入这些应用程序的lib并构建其清单(它几乎是旧版本的复制粘贴)。然后你替换每个应用程序中不同的/ res /文件...(你可以创建一个包含URL的config.xml文件)。