我们正在构建一个连接到云端的Android应用。我们有API的测试URL和生产URL。我们将应用程序连接到我们的本地开发机器,以便在开发时与数据库进行通信,但每当我们为Play商店生成APk时,我们都会修改生产URL的全局API URL。
有没有更好的方法来管理Android环境?我们还可以有两个版本的应用程序(开发版本)和Play商店版本吗?我无法拥有两个版本,因为这两个应用程序具有相同的签名。我们如何最好地管理这个?
答案 0 :(得分:11)
这可以使用产品口味来实现。
为了达到这个要求:
首先,在项目的app文件夹下创建2个文件,说明 development.props 和 production.props 。或者您可以将这两个文件添加到app文件夹中的一个包中。比如config。
基本上,这两个文件包含键和值。这两个文件的密钥相同。但他们的价值观是不同的。这些文件包含一个键,表示“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文件)。