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

Nag*_*Nag 30 android

我们正在构建一个连接到云端的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合并和所有.

  • 我对这种方法的最大障碍是测试的 apk 不是部署的 apk。 (7认同)

Juh*_*tta 15

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

为了达到这个要求:

首先,在项目的app文件夹下创建2个文件,说是development.propsproduction.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类型是Debugrelease.我有两种口味,即开发和生产.因此,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.


Sim*_*ays 3

使用 Ant 至少构建生产版本。这样您就可以在构建过程中设置某些配置值/标志。假设您有一个 config.xml 文件,其中包含服务器的 URL。您可以使用不同的 Ant 构建目标来更改 URL 以指向适当的服务器。查看教程。它准确地解释了这是如何完成的。