我想让我的应用程序在开发和生产Web服务之间切换,而不会在代码中进行太多改动(并且相对简单)。
现在,我的Web服务地址为static final String
个变量,用于执行实际的HTTP调用,并使用static final boolean
在应用程序的其余部分切换代码。
现在虽然boolean
非常方便,但我无法使用它来更改网络服务地址,因为它们本身就是static final
个变量。解决这个问题的最佳做法是什么?
我发现了一些有关使用Android SDK提供debug
变量的SO的讨论,但它虽然可以取代boolean
,但它并没有解决其他问题。
注意:如果您想知道,我静态使用Web服务类,所以我没有构造函数,我可以在其中检查debug
变量并更改变量,以及I& #39; d也希望他们成为static final
。
答案 0 :(得分:5)
<强>更新强>
使用gradle
构建系统现在变得非常容易。您可以在Server.java
中添加一个文件,例如src/debug/java
和开发服务器凭据,以及src/release/java
中包含生产凭据的文件(假设您使用的是默认的gradle项目配置,请根据自定义进行相应调整) 。然后,构建系统将根据您的buildType
使用相应的文件。
更好的是,我现在使用release
文件使用static final
个变量,而对于debug
版本,我使用的static
变量在代码中的使用方式完全相同(例如Server.url
,Server.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";
}
根据我的阅读,由于boolean
为static 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
的值来检查您正在使用的产品风格并相应地使用该网址。
希望这会有所帮助。