Gradle - 使用口味

时间:2015-06-05 17:02:23

标签: android gradle android-productflavors

我有一个项目,在一个班级中使用蓝牙低功耗扫描。从API 21开始,Android已经弃用了我使用的一些方法,并希望我用新的方法替换它们。我并不是真的想要切断所有API 19和20,所以我试图研究Gradle风味。

到目前为止我发现的是,为了创建不同的口味,您需要两个不同的包,用于包含不同源代码的两种口味。

我的问题是:如果我只需要一个班级中的差异,我应该尝试使用口味吗?另外,我应该怎么做呢?我已经查看了Gradle文档了,但是并没有多少但是如何声明不同的风格,而不是实际的设置。

我在flavors

的部分中找到了这个
  

一个图书馆用英语'定义。和' french'味道。在编译“法语”时变体,定义了一个单独的宏,它导致生成不同的二进制文件。

但这就是它的意义。我如何实际设置二进制和更改?谢谢!

2 个答案:

答案 0 :(得分:1)

gradle风味的一个例子:

android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        demo {
            applicationId "com.buildsystemexample.app.demo"
            versionName "1.0-demo"
            buildConfigField 'Boolean', 'isDemo', 'true'
        }
        full {
            applicationId "com.buildsystemexample.app.full"
            versionName "1.0-full"
            buildConfigField 'Boolean', 'isDemo', 'false'
        }
    }
}

您可以为每个构建版本添加不同的源代码。

请阅读此页:https://developer.android.com/tools/building/configuring-gradle.html

答案 1 :(得分:0)

你可以用风味来做到这一点,但因为它只是一个类我建议做这样的事情:

首先,创建一个界面:

public interface Something{
    //Put anything that will be common to both classes here.
    public void doSomething();
}

创建两个实现该接口的类。一个使用新的令人兴奋的版本:

public class SomethingWithNewStuff implements Something{
    @Override
    public void doSomething(){
        //Go nuts and use new fancy features where you need them
    }
}

然后覆盖旧版本需要更新的方法:

public class LegacySomething implements Something{
    @Override
    public void doSomething(){
        //do something in a legacy way.
    }
}

然后,当您实例化该类时:

Something something;

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){
    something = new SomethingWithNewStuff();
} else{
    something = new LegacySomething();
}

something.doSomething();

根据您的具体操作,您可以通过多种方式实现相同的功能。在某些情况下,让一个类扩展另一个类而不是从公共接口继承等等可能更好。

无论哪种方式,最终这可能比维护两个单独的构建以进行小的更改要少。