如何使用ProductFlavors在app中定义开发行为?

时间:2014-08-14 18:29:53

标签: java android gradle android-studio

我有一个类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 模式下,我想自动登录,因此每次将应用程序推送到开发设备时,我都不需要手动执行此操作。< / p>


我想知道我是否可以更有效地做到这一点。我试图创建一个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或类似内容轻松登录开发版本?

1 个答案:

答案 0 :(得分:3)

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

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

不是那么糟糕。它将所有代码保存在一个地方。话虽如此,您在 src / debug 中放置代码的第二种方法是关闭的,并且您根本不需要使用产品风格来实现这一目标。这样做:

  • createAndLoginUserManager放入 src / debug
  • 将正常版本的UserManager放入 src / release
  • 不要在 src / main 中放置任何内容。

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

这种方法的一个缺点是,目前Android Studio还不够智能,无法使用当前版本之外的代码或构建类型参与重构等重要事项。这意味着,如果您当前正在处理调试构建类型并重构UserManager,比如将其移动到另一个包,则它不会在您的发布版本中重构该副本类型,这将是孤立的,直到你修复它。