Android - 在开发和生产Web服务之间切换

时间:2012-05-07 17:13:49

标签: java android

我想让我的应用程序在开发和生产Web服务之间切换,而不会在代码中进行太多改动(并且相对简单)。

现在,我的Web服务地址为static final String个变量,用于执行实际的HTTP调用,并使用static final boolean在应用程序的其余部分切换代码。

现在虽然boolean非常方便,但我无法使用它来更改网络服务地址,因为它们本身就是static final个变量。解决这个问题的最佳做法是什么?

我发现了一些有关使用Android SDK提供debug变量的SO的讨论,但它虽然可以取代boolean,但它并没有解决其他问题。

注意:如果您想知道,我静态使用Web服务类,所以我没有构造函数,我可以在其中检查debug变量并更改变量,以及I& #39; d也希望他们成为static final

4 个答案:

答案 0 :(得分:5)

<强>更新

使用gradle构建系统现在变得非常容易。您可以在Server.java中添加一个文件,例如src/debug/java和开发服务器凭据,以及src/release/java中包含生产凭据的文件(假设您使用的是默认的gradle项目配置,请根据自定义进行相应调整) 。然后,构建系统将根据您的buildType使用相应的文件。

更好的是,我现在使用release文件使用static final个变量,而对于debug版本,我使用的static变量在代码中的使用方式完全相同(例如Server.urlServer.username等)但可以从开发抽屉中更改。什么是开发抽屉?有关此示例,请参阅Jake Wharton的u2020项目及相关演讲。


OLD ANSWER

我最终使用静态方法来访问定义调试状态的另一个static final boolean的地址。像这样:

public static String getWSAddress() {
    if(DEVELOPMENT_MODE) {
        return "http://dev.server.com";
    }

    return "http://prod.server.com";
}

根据我的阅读,由于booleanstatic final,编译器将进行优化,条件代码将被删除为无法访问。

这似乎是解决此问题的合适解决方案,但Android文献指出方法调用通常比直接变量访问更昂贵,因此无法确定这是否是比Chuck提供的更好的解决方案。

编辑:用于记录。我已经转移到了@ Blundell的解决方案。哪个很棒。因此,如果您想快速完成此操作,我建议您从此开始,但将其放在路线图上。

答案 1 :(得分:3)

我答应我会这样做,而且在这里:

还在GitHub上镜像:https://github.com/blundell/BuildChoiceTut

通过本教程,您可以使用Ant构建脚本切换配置。

在这里设置一个名为/ config /的目录,您可以保存所有常量以用于不同的配置。每个文件一次,即live.props dev.props beta.props

然后,当Ant运行时,它将读取所选文件并在编译之前将它们“注入”到构建中。

享受!

答案 2 :(得分:0)

如果您确实需要将配置置于静态最终常量中,那么解决方案就更复杂了。此解决方案仍然依赖于可在您的清单中正确设置的可调试性,因此它不是完全傻瓜式的。

我能想到帮助你记住debuggable的唯一方法是使用后面提到的调试标志将初始屏幕的背景颜色更改为红色。有点傻,但会工作。

您可以将地址变量声明为静态final,而不是为其赋值:

public static final String webServiceAddress;

您可以使用以下方式获取有关您的应用是否已设置为可调试的信息:

getApplicationInfo().flags;

这意味着您在发布应用程序时仍需要翻转开关,并在清单中将debuggable设置为false,但无论如何您都应该这样做以关闭您不希望用户看到的日志消息。

在默认活动的onCreate中,您可以使用它来分支并分配正确的地址。这是一个完整的例子。

//Store release configuration here, using final constants
public class ReleaseConfig {

    //Don't set webServiceAddress yet
    public static final String webSericeAddress;
    public static boolean configSet = false;

    static
    {
        //Set it as soon as this class is accessed
        //As long as this class is first accessed after the main activity's onCreate
        //  runs, we can set this info in a final constant
        webServiceAddress = MainActivity.configuredAddress;
    }
}

public class MainActivity extends Activity {

    public static String configuredAddress;

    //This should be one of the first methods called in the activity
    public void onCreate(Bundle savedInstanceState)
    {
        //Figure out if we are in debug mode or not
        boolean debuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));

        //Save off our debug configuration
        if (debuggable) configuredAddress = "the debuggable address";
        else configuredAddress = "the production address";

        //Access the static class, which will run it's static init block
        //By the time this runs, we'll have the info we need to set the final constant
        ReleaseConfig.configSet = true;
    }

答案 3 :(得分:0)

您可以为您的应用使用产品口味,例如dev的一种口味和production的另一种口味。为每种口味赋予独特的applicationId

然后在您的代码中,通过检查BuildConfig.APPLICATION_ID的值来检查您正在使用的产品风格并相应地使用该网址。

希望这会有所帮助。