【问题标题】:Gradle - using flavorsGradle - 使用风味
【发布时间】:2015-06-05 17:02:22
【问题描述】:

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

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

我的问题是:如果我只需要单个类中的差异,我应该尝试使用风味吗?另外,我该怎么做呢?我查看了 Gradle 文档,除了如何声明不同的风格外,没有太多内容,在实际设置中没有那么多。

我在flavors 部分找到了这个,

一个库是用“英语”和“法语”风格定义的。在编译“法语”变体时,定义了一个单独的宏,这会导致生成不同的二进制文件。

但仅此而已。我将如何实际设置二进制文件和更改?谢谢!

【问题讨论】:

    标签: android gradle android-productflavors


    【解决方案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

    【讨论】:

    • 是的,但有没有办法让我保留相同的包布局,但告诉 gradle 将两个 文件 视为不同的风格。除了这两种风格之外,所有代码都是相同的
    • 创建一个构建配置字段并为每种构建类型创建不同的值,并在代码中使用 te 字段创建一个 if。我已经更新了答案。
    • 那么你会在文件中使用 if(isDemo) 来确定它是否是演示?
    • 是的。 if(BuildConfig.isDemo) {}.
    • 太棒了。感谢您的所有帮助!
    【解决方案2】:

    你可以用风味来做到这一点,但由于它只是一个类,我建议你这样做:

    首先,制作一个界面:

    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();
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多