Удостоверение продукта быть ребенком другого

Я настраиваю продукты в своем приложении и сталкиваюсь с одной проблемой. Два моих вкуса продукта очень похожи друг на друга и отличаются только несколькими ресурсами, позвольте им назвать FlavorA и FlavorB. Я хотел бы настроить его так, чтобы FlavorA был родителем FlavorB, таким образом FlavorB может просто переопределить несколько ресурсов FlavorA, а затем FlavorA переопределяет кучу ресурсов из main. Есть ли способ настроить иерархию вкуса, такую ​​как это? Сейчас мне нужно дублировать много ресурсов между ними, чтобы он работал, и я хотел бы устранить это дублирование.

edit: ОК. У меня уже было пару ответов (оба удалены), которые не были связаны с моим вопросом, поэтому позвольте мне уточнить. Это не связано с Java OOP, я уже это хорошо знаю.:)

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть бесплатная/платная версия моего приложения, а затем несколько белых ярлыков, которые включают только изменения темы. Платная версия изменяет только несколько активов из бесплатной версии (кроме изменений кода). Вот как выглядит мой productFlavors:

productFlavors {
        whiteLabelA {
            applicationId "com.whiteLabelA.android"
        }

        whiteLabelB {
            applicationId "com.whiteLabelB.android"
        }

        mainFree {
            applicationId "com.mainFree.android"
        }

        mainPaid {
            applicationId "com.mainFree.android.paid"
        }
    }

Я бы хотел, чтобы mainPaid переопределял mainFree, поскольку он меняет только несколько ресурсов. Я хотел бы сделать это таким образом, а не как бесплатный/платный тип сборки, потому что белые ярлыки не имеют платных версий, и было бы проще иметь иерархию вкусов, например:

mainPaid extends mainFree {
    applicationId "com.mainFree.android.paid"
}

Ответ 1

Я нашел два решения:

1. Используйте размеры аромата.

android {
  ...
  flavorDimensions 'palette', 'color'

  productFlavors {
    blackAndWhite {
      dimension 'palette'
    }
    redAndWhite {
      dimension 'palette'
    }
    red {
      dimension 'color'
    }
    white {
      dimension 'color'
    }
  }
  variantFilter { variant ->
    def first = variant.getFlavors().get(0).name
    def second = variant.getFlavors().get(1).name
    if(!(first.equals('blackAndWhite') && second.equals('white')) ||
       !(first.equals('redAndWhite') && (second.equals('white') || second.equals('red')))) {
       variant.setIgnore(true);
    }
  }
  ...
}

Из-за variantFilter у нас есть 3 комбинации вместо 4:

blackAndWhite => white

redAndWhite   => white
              => red

Вы можете считать, что red расширяется redAndWhite и white, расширяя blackAndWhite или redAndWhite.

Этот ответ и вариант фильтра были полезны.

2. Изменить исходный набор.

productFlavors{
    flavor1 {
    }
    flavor2 {
    }
}

sourceSets {
    flavor2 {
        java.srcDirs = sourceSets.flavor1.java.srcDirs
        res.srcDirs = sourceSets.flavor1.res.srcDirs
        resources.srcDirs = sourceSets.flavor1.resources.srcDirs
        aidl.srcDirs = sourceSets.flavor1.aidl.srcDirs
        renderscript.srcDirs = sourceSets.flavor1.renderscript.srcDirs
        assets.srcDirs = sourceSets.flavor1.assets.srcDirs
    }
}

Пример кода был бесстыдно скопирован из этого сообщения в блоге. Большое спасибо автору.

Ответ 2

Я думаю, что вы не сможете сделать это непосредственно в объекте android, но вы можете использовать функцию конфигурации для установки общих свойств на вкус. Поместите это после объекта android:

void configureWhiteLabelFlavor(flavor) {
    flavor.useJack = true
}

configureWhiteLabelFlavor(android.productFlavors.whiteLabelA)

При необходимости вы можете реализовать глубокое наследование, вызывая другие функции из этой функции.

Ответ 3

Я искал аналогичную вещь в gradle и нашел варианты с несколькими вкусами. У меня есть приложение, которое должно иметь версии A и B, и у каждой версии есть dev и pro среды, поэтому я закончил с этим в своем gradle:

flavorDimensions 'app', 'environment'

productFlavors {
    versionA {
        flavorDimension 'app'
    }
    versionB {
        flavorDimension 'app'
    }
    pre {
        flavorDimension 'environment'
    }
    pro {
        flavorDimension 'environment'
    }
}

И в моих вариантах сборки у меня есть версияAPreDebug, versionAPreRelease, versionBPreDebug, versionBPreRelease и т.д. Я думаю, что вам нужно что-то в этом роде.