三种产品口味:两种非常相似,一种较小但不同

时间:2017-01-13 20:56:52

标签: android android-studio gradle

现在我在gradle中有两个productFlavors。我需要添加第三个。现有的两种产品风味几乎包含所有内容。称他们为猫和狗 - 他们都是动物。我需要添加的第三种风格实际上是应用程序的沙盒版本。我们可以称之为自行车。

说我的应用程序现在有十二个活动,全部由Cat和Dog共享。但是自行车产品的味道应该只能访问其中三个活动和自行车需要拥有它自己的启动器活动。如何重构我的代码以智能地适应这种情况?同样,两种口味几乎分享所有东西,而一种口味与其他两种口味相比要少得多。

更新

似乎有一种聪明的方法可以使用Change default source set configurations来解决这个问题。基本上,我会保留/main sourceSet用于整个应用程序中常见的所有内容;一个/dogCat源集,用于Dog和Cat共同的所有内容;和一个/bike sourceSet只适用于Bike。

已经弄清楚了,我在编写gradle sourceSets部分时仍然遇到一些问题

android {
  ...
  sourceSets {
    . . . 
  }
}

5 个答案:

答案 0 :(得分:3)

将所有常见类保持在主要风格中。例如,您有三种口味,猫,狗和自行车。在这三种口味中,猫和狗大多是相同的,除了一些。另一方面,Bike也有一些常见的类。

三种情景:

<强> 01。当所有风味都有共同的功能

喜欢,Cat,Dog和Bike都有一个名为PriceInformation的类。然后保持这个类的主要味道。

<强> 02。当Cat和Dog具有相同的功能但Bike不会。

就像,Cat和Dog有一个叫LifeSpan的常用功能,然后只保留这个类。

<强> 03。当只有Bike有共同的功能,但另外两种味道没有。

然后将该特定课程仅保留在Bike Flavor中。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.productflavor"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {

        cat {
            applicationId "com.cat.theme"
        }
        dog {
            applicationId "com.dog.theme"
        }
        bike {
            applicationId "com.bike.theme"
        }
    }
}

Below is the Image I'm attaching.

因为,MainActivity很常见,所以只提到主要风格。

答案 1 :(得分:2)

我想我能够解决自己的问题。我所要做的就是

android {
  ...
  sourceSets {
    main {
      …
    }
    dog {
      java.srcDirs = [‘dog_cat/java']
      …
    }
    cat {
      java.srcDirs = [‘dog_cat/java']
      …
    }
    bike {
      java.srcDirs = [‘bike/java’]//which is actually superfluous
      …
    }
  }

现在我要测试确认

答案 2 :(得分:1)

您可以按照以下步骤创建项目的多种风格:

第1步。复制Res。 App / src / res的文件夹并粘贴在 App / src / YourFlavourName(Cat / Dog / Bike)/ Res。

步骤2.应用build.gradle

android {

    productFlavors {

    Cat {
        applicationId = "com.cat"
    }

    Dog {
        applicationId = "com.dog"
        versionCode 1
        versionName "1.0"
    }

    Bike {
        applicationId = "com.bike"
        versionCode 1
        versionName "1.0"
    }

  }

sourceSets {

    main {
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        jniLibs.srcDirs = ['libs']
    }

    Cat { java.srcDirs = ['src/Cat/java', 'src/Cat/java/'] }
    Dog { java.srcDirs = ['src/Dog/java', 'src/Dog/java/'] }
    Bike { java.srcDirs = ['src/Bike/java', 'src/Bike/java/'] }

}

}

第3步:android studio的左侧有两个幻灯片选项收藏夹和构建变量 enter image description here 单击Build Varients并选择BuildVarient以运行perticulat flavor

第4步:运行应用

答案 3 :(得分:1)

@Nouvel Travay,看看当你定义风格时会发生什么,你定义了应用程序行为的不同方式。假设您想要以不同的风格显示不同的字符串,那么您需要单独定义那些不同风格的字符串。同样,如果要定义不同的行为/功能,则必须单独定义不同风格的行为。重要说明: - 文件名应该保持不变,就像您可以将MainActivity命名为一种风味而不是像StartActivity这样的名称,以获得与其他风味相同的行为。希望我让你明白。随意请求更多许可。

答案 4 :(得分:0)

您可以尝试以下两种方法:

  • 实现主要风格中的所有活动(java / main与Gradle定义的所有风格共享),每个风格的Android清单应仅引用他们需要工作的活动。在Proguard的帮助下,您可以确保未使用的未引用活动的代码不会部署在您的工件(APK)中。在每个风格的 AndroidManifest.xml

  • 中定义时,可以使用不同的启动器
  • 使用图书馆项目。通过这种方式,您可以加载每种风格的不同库集,并再次加载不同的清单。

  

我将尝试用其他一些例子来扩展这个答案   时间。