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

我们正在构build一个连接到云的Android应用程序。 我们有我们的API和生产URL的testingurl。 我们将应用程序连接到我们的本地开发机器,以便在开发时与数据库对话,但每次为Play商店生成APk时,都会发现我们将全局API URL修改为生产URL。

有没有更好的方式来pipe理Android的环境? 我们是否也有两个版本的应用(开发版本)和Play商店版本? 由于两个应用程序都具有相同的签名,因此我无法拥有两个版本。 我们如何最好地pipe理这个?

Solutions Collecting From Web of "在开发Android应用程序时如何pipe理多个环境?"

Android工作室和gradle现在简单。

在您的应用程序内build.gradle编辑签名configuration

signingConfigs { debug { storeFile file("debug.keystore") storePassword "..." keyAlias "..." keyPassword "..." } prod { storeFile file("prod.keystore") storePassword "..." keyAlias "..." keyPassword "..." } dev { storeFile file("dev.keystore") storePassword "..." keyAlias "..." keyPassword "..." } } 

添加buildTypes

 buildTypes { debug { buildConfigField 'String', 'BASE_URL', '"http://127.0.0.1:8080/"' ...... signingConfig signingConfigs.debug } prod { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField 'String', 'BASE_URL', '"http://prod.example.com"' ...... signingConfig signingConfigs.prod } dev { buildConfigField 'String', 'BASE_URL', '"http://dev.example.com"' ...... signingConfig signingConfigs.dev } } 

在你的代码中,通过这个代码在gradle文件中configuration基础url。

 public final static String BASE_URL = BuildConfig.BASE_URL; 

你也可以把不同的KEY或者Gradle文件中特定的构buildtypes的东西放在代码中,也可以根据你正在运行的构buildtypes来使用它们。

甚至有可能有不同的包名称。

 productFlavors { my_prod { applicationId "com.example.packtwo" } my_dev { applicationId "com.example.packone" } } 

在最近的gradleconfiguration中,指定包名称有一些更新。 如果使用productFlavours,则必须添加flavourDimensions。 请参阅下面的代码添加flavourDimensions

 flavorDimensions "pack" productFlavors { flavor_dev { applicationId 'com.example.packtwo' dimension "pack" } flavor_prod { applicationId 'com.example.packone' dimension "pack" } } 

这会给你更多关于产品口味和尺寸的细节

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

检查更多的可能性…

但是,如果你使用不同的风格,你可能不得不处理清单合并和所有。

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

为了达到这个要求:

首先,在您的项目的应用程序文件夹下创build2个文件,称为development.propsproduction.props 。 或者你可以添加这两个文件在应用程序文件夹下的configuration文件说。

在这里输入图像说明

基本上,这两个文件包含键和值。 这个键对于两个文件都是一样的。 但他们的价值观是不同的。 这些文件包含一个键“SERVER_URL”和它的值。 它会这样写:

SERVER_URL =” Server_url_value”

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

然后,在应用程序build.gradle文件中创buildProductFlavours,并进行开发和生产。 现在,访问不同的道具文件,其中包含相应的口味,如下所示:

 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 } 

现在,对于每种风味,都有一个构buildtypes,这个构buildtypes被添加到应用程序的build.gradle。 例如,生成types是debugging发布 。 我有两种口味,即开发和生产。 所以,Gradle任务将使用如下的风格和构buildtypes来创build:

 assemble{flavourName}{BuildType} 

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

./gradlew assembleProductionRelease将生成带有生产URL的发布版本。

./gradlew assembleDevelopmentDebug将生成带有开发URL的debugging版本。

./gradlew assembleProductionDebug将生成带有生产URL的debugging版本。

./gradlew assembleDevelopmentRelease将生成具有开发URL的发布版本。

前三名的gradle任务将会非常有帮助。 但是最后一个任务将会生成带有开发URL的发布版本。 但是这不被推荐。 所以,我们应该停止开发人员执行这个任务,即./gradlew assembleDevelopmentRelease

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

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

现在,如果我们尝试执行任务,即./gradlew DevelopmentRelease 。 Gradle将停止生成构build和抛出exception,并会说: 这个任务assembleDevelopmentRelease没有在根项目中find。

使用Ant构build至less生产版本。 这样你可以在构build过程中设置一些configuration值/标志。 假设您有一个包含服务器URL的config.xml文件。 您可以拥有不同的Ant构build目标,这些目标会将URL更改为指向相应的服务器。 看看这个教程。 它解释了如何完成。

这个我认为是在你使用android studio和gradle的情况下的韧体练习。

你可能想看看这篇文章: http : //tulipemoutarde.be/2013/10/06/gradle-build-variants-for-your-android-project.html

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

这也可以让你有两个不同的包名称为同一个应用程序。

它使用gradle风格来实现你正在寻找的东西,并且很容易实现。

你可以尝试gradle buildTypeproductFlavor 。 它将允许你指定不同的环境variables,比如url,versionName等。而applicationId可以让你有dev和prod构build。 有关更多详细信息,请访问http://developer.android.com/tools/building/configuring-gradle.html

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

您可以将您的应用程序设为LIB,并创build2个应用程序:生产应用程序和testing应用程序 导入你的库的这些应用程序,并build立他们的清单(这几乎是旧的复制粘贴)。 然后,replace每个应用程序中不同的/ res /文件(您可以创build一个具有该URL的config.xml文件)。