【问题标题】:How to use ProductFlavors to define development behavior in app?如何使用 ProductFlavors 定义应用程序中的开发行为?
【发布时间】:2014-08-14 18:29:53
【问题描述】:

我有一个类 UserManager 处理创建和用户会话:

src/main/java/com/myapp/UserManager.java

public class UserManager {

    public UserManager(){
        if(BuildConfig.DEBUG){
           createAndLogin("dummy", "dummy");
        }
    }

    public void createAndLogin(String username, String password){
        // Create and login logic
    }

    /* Some more methods */

}

如您所见,在 debug 模式下,我想自动登录,所以我不需要每次将应用推送到开发设备时手动进行。


我想知道我是否可以更有效地做到这一点。我试图创建一个debug 文件夹,并复制该类。新设置是:

src/main/java/com/myapp/UserManager.java

public class UserManager {

    public void createAndLogin(String username, String password){
        // Create and login logic
    }

    /* Some more methods */

}

还有:

src/debug/java/com/myapp/UserManager.java

public class UserManager {

    public UserManager(){
       createAndLogin("dummy", "dummy");
    }

    public void createAndLogin(String username, String password){
        // Create and login logic
    }

    /* Some more methods */

}

不幸的是,这是不允许的,因为它抱怨重复类。


here 所述,您需要productFlavors 来完成此操作。 build.gradle 中的设置为:

buildTypes {
    debug {
        debuggable true
        signingConfig signingConfigs.debug
    }
    release {
        debuggable false
        signingConfig signingConfigs.release
    }
}

productFlavors  {
    dev { }
    prod { }
}

现在我已将这两个类移至src/prod/...src/dev/...,并从src/main/... 中删除了该类。

这行得通,但我还是不开心。我需要大量重复的代码,但我不确定我是否在使用 productFlavors,因为它们应该被使用。

TL;DR

如何使用productFlavors 或类似的东西轻松登录开发版本?

【问题讨论】:

  • 不要使用风味,在 src/debug 中有一个 UserManager 版本,在 src/release 中有另一个版本,而在 src/main 中没有?如果他们都想共享很多代码,那么为两者创建一个公共基类并将其放在 src/main.xml 中。说了这么多,我不确定它是否比您在 BuildConfig.DEBUG 上设置条件的第一种方法更容易——恕我直言,这比该类的多个版本更容易维护。
  • 嘿@ScottBarta,谢谢!那仍然需要我复制代码,对吗?也许我应该在debugrelease 中都创建一个子类,如果release 中的那个是空的,而debug 中的那个只包含构造函数?
  • @ScottBarta 老实说,我忘记了我可以使用release 文件夹,所以这是一个很大的帮助!
  • 是的,存在重复代码,但您似乎倾向于使用重复代码的方法——不重复的方法是if (BuildConfig.DEBUG)
  • 酷,我把它写成一个更具描述性的答案。

标签: java android gradle android-studio


【解决方案1】:

在我看来,你的第一种做法是:

    if(BuildConfig.DEBUG){
       createAndLogin("dummy", "dummy");
    }

没有那么糟糕。它将所有代码保存在一个地方。话虽如此,您将代码放入 src/debug 的第二种方法很接近,而且您根本不需要使用产品风格来实现这种方式。这样做:

  • UserManagercreateAndLogin 版本放入src/debug
  • 把普通版的UserManager放到src/release
  • 不要在 src/main 中添加任何内容。

如果该类的两个版本都有很多共同的逻辑,那么您可以让它们中的每一个都继承自您放入 src/main 中的共同基类。

这种方法的一个缺点是,目前,Android Studio 还不够聪明,无法让与当前版本不同的风格或构建类型的代码参与重构等重要事情。这意味着,如果您当前正在处理调试构建类型并且您重构 UserManager,例如,将其移动到不同的包,它不会重构您的发布构建类型中的副本,这将是在你去修复它之前一直是孤儿。

【讨论】:

  • 谢谢!显然,在现实生活中,我想在调试模式下提供更多配置,因此拥有一个包含这些配置的单独调试文件夹的想法听起来是一个不错的解决方案。我会为此挣扎,看看是否值得麻烦。类似Laravel's environment configurations‌​.
  • 是的,在我们的愿望清单上对这类事情保持聪明已经很长时间了,但不幸的是,它很难实现。
猜你喜欢
  • 2018-03-31
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2012-08-09
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多