Build Single Apk с несколькими шаблонами / вкусами - PullRequest
3 голосов
/ 07 мая 2019

Можно ли построить apk с более чем 1 вкус продукта?

Например: У меня есть проект с 3 вариантами (App1 - App2 - App3).
и каждое приложение имеет свои собственные конфигурации, такие как applicationId и т. д.

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

Моя проблема в том, что папка res будет огромной, и ее будет сложно обслуживать, поэтому я пытаюсь найти способ разделить различные макеты и сохранить их в максимально возможной степени чистыми.

И если это возможно, то как мне настроить или перезапустить приложение для сборки других версий?

Еще одна вещь, которую я имел в виду, состояла в том, чтобы собрать все файлы XML в главном разрешении и выбрать разные классификаторы, например, когда мы делаем это при создании экрана другого размера (sm - larg - и т. Д.), Но я не смог найти способ добавить собственные классификаторы ,

Мой Gradle код выглядит так:

flavorDimensions "default"

    productFlavors {

        demo {
            applicationId "test.demo"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.demo.fileprovider"
            resValue "string", "bc", "com.demo"
            resValue "string", "bc_e", "extra_data.com.demo"
            resValue "string", "default_hostname", "demo.test.com"
            resValue "string", "default_username", "demo"
            resValue "string", "default_password", "demo"
        }
         AppOne {
            applicationId "test.AppOne"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.AppOne.fileprovider"
            resValue "string", "bc", "com.AppOne"
            resValue "string", "bc_e", "extra_data.com.AppOne "
            resValue "string", "default_hostname", "AppOne.test.com"
            resValue "string", "default_username", "AppOne"
            resValue "string", "default_password", "AppOne"
        }
          AppTwo {
            applicationId "test.AppTwo"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.AppTwo.fileprovider"
            resValue "string", "bc", "com.AppTwo"
            resValue "string", "bc_e", "extra_data.com.AppTwo"
            resValue "string", "default_hostname", "demoAppTwotest.com"
            resValue "string", "default_username", "AppTwo"
            resValue "string", "default_password", "AppTwo"
        }
}

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вы не можете создать APK с несколькими вариантами, так же как вы не можете создать его в отладочных и выпусках buildTypes.Конфигурация / ресурсы выбранного вкуса помещаются в фактические метаданные / манифест APK, поэтому не могут быть изменены во время выполнения.

Вам нужно будет включить весь ваш контент в папку res, но есть несколькоспособы, которые могут помочь облегчить управление.Я бы порекомендовал первые 3 варианта и четвертый, если у вас очень большое количество файлов кода + макета с различным поведением:

  1. Используйте фрагменты , чтобы избежать большинства вашихКод Java / Kotlin, требующий дублирования.
  2. Включайте макеты XML вместо того, чтобы каждый раз переопределять все для повторного использования общих элементов.
  3. Тщательно присваивайте имена своим файлам, например template1_background, template2_background.
  4. Используйте несколько модулей , по одному на каждый «шаблон».Затем у вас будет несколько разумных res папок.

Я могу понять, почему ароматы могли показаться решением, но, поскольку вам нужны все ароматы в одном приложении, этот подход, к сожалению, не будетРабота.Вы, вероятно, обнаружите, что шаг # 2 удалит почти все дубликаты файлов, полностью избежав этой проблемы!

0 голосов
/ 19 мая 2019

Вы можете объединить ресурсы из разных разновидностей, используя команду sourceSets. SourceSet Позволяет настроить папки ресурсов buildVariants. например, вы можете настроить свой вариант App2 так, чтобы он включал папку Res2 и папку Res1. Пример кода:

sourceSets {


        App2Debug{
            res.srcDirs = ['src/App1/res', 'src/App2/res']

        }

    }
...