我们正在构建一个连接到云端的Android应用.我们有API的测试URL和生产URL.我们将应用程序连接到我们的本地开发机器,以便在开发时与数据库通信,但每当我们为Play商店生成APk时,我们都会发现自己正在修改生产URL的全局API URL.
有没有更好的方法来管理Android的环境?我们还可以有两个版本的应用程序(开发版本)和Play商店版本吗?我无法拥有两个版本,因为这两个应用程序具有相同的签名.我们如何最好地管理这个?
shi*_*jin 47
随着android studio和gradle的简单现在.
在您的应用内部build.gradle编辑签名配置
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 "..."
}
}
Run Code Online (Sandbox Code Playgroud)
添加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
}
}
Run Code Online (Sandbox Code Playgroud)
在您的代码中,通过此代码获取在gradle文件中配置的基本URL.
public final static String BASE_URL = BuildConfig.BASE_URL;
Run Code Online (Sandbox Code Playgroud)
您还可以在gradle文件中放置不同的KEY或特定构建类型的任何内容,并在代码中根据您运行的构建类型.
它甚至可能有不同的包名.
productFlavors {
my_prod {
applicationId "com.example.packtwo"
}
my_dev {
applicationId "com.example.packone"
}
}
Run Code Online (Sandbox Code Playgroud)
在最近的gradle配置中,指定包名称时会有一些更新.如果使用productFlavours,则必须添加flavourDimensions.请参阅下面添加了flavourDimensions的代码
flavorDimensions "pack"
productFlavors {
flavor_dev {
applicationId 'com.example.packtwo'
dimension "pack"
}
flavor_prod {
applicationId 'com.example.packone'
dimension "pack"
}
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供有关产品风味和尺寸的更多详细信息
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html
检查更多可能性......
但是如果你使用不同的口味,你可能需要处理Manifest合并和所有.
Juh*_*tta 15
这可以使用产品口味来实现.
为了达到这个要求:
首先,在项目的app文件夹下创建2个文件,说是development.props和production.props.或者你可以将这两个文件添加到app文件夹中的一个包中.
基本上,这两个文件包含键和值.这两个文件的密钥相同.但他们的价值观是不同的.这些文件包含一个键,表示"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
}
Run Code Online (Sandbox Code Playgroud)
现在,对于每种风格,都有一个构建类型,这个BuildType在app build.gradle中添加.例如,Build类型是Debug和release.我有两种口味,即开发和生产.因此,gradle任务将使用flavor和build类型创建,如下所示:
assemble{flavourName}{BuildType}
Run Code Online (Sandbox Code Playgroud)
现在,您只需要键入这些命令.它会生成所需的APK及其相应的URL.命令是:
./gradlew assembleProductionRelease 将使用生产URL生成发布版本.
./gradlew assembleDevelopmentDebug 将使用开发URL生成调试版本.
./gradlew assembleProductionDebug 将使用生产URL生成调试版本.
./gradlew assembleDevelopmentRelease 将使用开发URL生成发布版本.
前三个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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们尝试执行任务即./gradlew DevelopmentRelease.Gradle将停止生成构建并抛出异常,并说:在根项目中找不到此任务assembleDevelopmentRelease.
| 归档时间: |
|
| 查看次数: |
18005 次 |
| 最近记录: |