2017-02-15 9 views
0

Я разрабатываю приложение для Android для работы с некоторой серверной инфраструктурой. Теперь есть 3 серверные инфраструктуры, называемые serv1, serv2, serv3 (в этом примере). Также у меня есть 8 продуктов (flav1, flav2, ... flav8), и это число может быть увеличено.Соответствующая конфигурация сервера со многими производственными аксессуарами

Конфигурация сервера, такая как домен и порт, хранится в ServerConfig.java. Каждый аромат имеет SERVERCONFIG Java файл конфигурации инфраструктуры соответствующего сервера:

├ app/src 
| ├ flav1/java/app/package/name/ServerConfig.java //config for serv1 
| ├ flav2/java/app/package/name/ServerConfig.java //config for serv1 
| ├ flav3/java/app/package/name/ServerConfig.java //config for serv2 
| ├ flav4/java/app/package/name/ServerConfig.java //config for serv3 
| ├ flav5/java/app/package/name/ServerConfig.java //config for serv2 
| ├ flav6/java/app/package/name/ServerConfig.java //config for serv3 
| ├ flav7/java/app/package/name/ServerConfig.java //config for serv1 
| └ flav8/java/app/package/name/ServerConfig.java //config for serv3 

И это работает отлично, но, ИМХО, есть ко многим дублируется кода.

Теперь мне нужно добавить файл crt для проверки HTTPS. Я не хочу, чтобы файл apk содержал все 3 crt-файла. Так что я думаю о создании каталога для каждого сервера конфигурации:

├ app/src/main/java/app/package/name 
├ app/server 
| ├ serv1 
| | ├ ServerConfig.java 
| | └ ca.crt 
| ├ serv2 
| | ├ ServerConfig.java 
| | └ ca.crt 
| ├ serv3 
| | ├ ServerConfig.java 
| | └ ca.crt 

И использовать build.gradle скопировать конфигурацию и КРТ на источник основного местоположения.

android { 
    productFlavors.whenObjectAdded { flavor -> 
     flavor.ext.set('serverType', 'serv1') //serv1/serv2/serv3 
    } 
    productFlavors { 
     flav1 { 
      serverType = 'serv1' 
     } 
     flav1 { 
      serverType = 'serv2' 
     } 
     ... 
     flav8 { 
      serverType = 'serv3' 
     } 
    } 
} 
afterEvaluate { 
    android.applicationVariants.all { variant -> 
     variant.productFlavors.each { flavor -> 
       if(flavor.serverType.contains("serv1"){ 
       //add dependency to copy task to pre + variant.name + Build 
       //to copy serv1 config and crt from app/server/serv1 to app/src/main/java/app/package/name 
       } 
       ... 
     } 
    } 
} 

Большой недостаток этого решения заключается в жестко закодированных местах для копирования и вставки. Поэтому каждая рефакторизация ServerConfig и ca.crt (например, переименование) должна изменять файл build.gradle.

Есть ли лучшее решение для сопоставления конфигураций серверов (ServerConfig.java и ca.crt) с несколькими вариантами производства?

ответ

0

@Krish ответ был очень полезным, но в моем случае использование flavorDimensions привело к созданию 48 вариантов сборки. Чтобы уменьшить список вариантов сборки, я совмещаю свое предложение (в вопросе об этой теме), ответ Криш и вариант optionFilter.

android { 
    productFlavors.whenObjectAdded { flavor -> 
     flavor.ext.set('serverType', 'serv1') //set serv1 as default value //serv1/serv2/serv3 
    } 

    flavorDimensions "flav", "conf" 

    productFlavors { 
    //===== SERVER CONFIG FLAVORS ===== 
     serv1 { 
      dimension "conf" 
     } 
     serv2 { 
      dimension "conf" 
     } 
     serv3 { 
      dimension "conf" 
     } 
    //===== CLIENT FLAVORS ===== 
     flav1 { 
      serverType = 'serv1' //have to be one of server config flavours name 
      dimension "flav" 
     } 
     flav1 { 
      serverType = 'serv2' 
      dimension "flav" 
     } 
     ... 
     flav8 { 
      serverType = 'serv3' 
      dimension "flav" 
     } 
    } 

    variantFilter { variant -> 
     def firstFlav = variant.getFlavors().get(0) 
     def secondFlav = variant.getFlavors().get(1) 
     if (!firstFlav.serverType.equals(secondFlav.name)) { 
      variant.setIgnore(true); //hide variants where serverType mismatch server config flavor 
     } 
    } 
} 
+0

Было бы очень полезно, если вкус может наследовать от другого. [Возможность наследовать проблему ProductFlavor] (https://code.google.com/p/android/issues/detail?id=183350) – obywatelgcc

1

Мое решение использовать структуру папок, как это с небольшим изменением для файла сертификата,

enter image description here

И использовать его с flavorDimensions в Gradle.

И добавить, как это в файле градации.

flavorDimensions "flav", "conf" 

    productFlavors{ 
     flav1{ 
      applicationId "com.flav1" 
      dimension "flav" 
     } 

     flav2{ 
      applicationId "com.flav2" 
      dimension "flav" 
     } 

     serv1{ 
      dimension "conf" 
     } 

     serv2{ 
      dimension "conf" 
     } 
    } 
+0

Я не уверен, что это решение, которое я ищу. У меня есть 3 файла ca.crt, поэтому я должен скопировать эти файлы в 8 (больше в свойствах) активов ароматических активов. И использование базового класса в моем случае бесполезно, потому что ServerConfig имеет статические конечные поля с адресом сервера и т. Д., Для этих полей значения по умолчанию отсутствуют. – obywatelgcc

+0

Требования к изображению изображения для изменения адреса сервера, например. от serv1.domain.com до serv2.domain.com для flav7. Изменение только полей в ServerConfig без изменения ca.crt кем-то, кто не знает, что атрибут dir в flav7 содержит ca.crt, может привести к созданию сборки с большой ошибкой. Я искал масштабируемое решение, которое позволяло использовать как можно меньше шагов для переключения конфигураций серверов. – obywatelgcc

+0

@obywatelgcc Я обновил свой ответ, вы можете проверить это. – Krish

 Смежные вопросы

  • Нет связанных вопросов^_^