Opracowuję aplikację na Androida do pracy z infrastrukturą serwera. Teraz istnieje 3 infrastrukturę serwera o nazwie Serv1, Serv2, Serv3 (w tym przykładzie). Mam też 8 smaków produktów (flav1, flav2, ... flav8) i ten numer można zwiększyć.

Konfiguracja serwera, taka jak domena i port są przechowywane w ServerConfig.java. Każdy smak ma plik serwerconfig Java z odpowiednią konfiguracją infrastruktury serwera:

├ 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

I to działa dobrze, ale IMHO, istnieje wiele zduplikowanego kodu.

Teraz muszę dodać plik CRT do weryfikacji HTTPS. Nie chcę pliku APK zawiera wszystkie pliki 3 CRT. Więc myślę o tworzeniu jednego katalogu na konfigurację serwera:

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

I użyj build.gradle, aby skopiować konfigurację i CRT do głównej lokalizacji.

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
              }
              ...
        }
    }
}

Dużą wadą tego rozwiązania jest trudne zakodowane lokalizacje do radzenia sobie i wklejania. Tak więc każda refaktoryzacja serwera i ca.crt (np. Zmień nazwę) musi zmienić plik Build.gradle.

Czy istnieje lepsze rozwiązanie do dopasowywania konfiguracji serwerów (serverconfig.java i ca.crt) z wieloma smakami produkcyjnymi?

0
obywatelgcc 15 luty 2017, 17:19

2 odpowiedzi

Najlepsza odpowiedź

@Krish Odpowiedź była bardzo pomocna, ale w moim przypadku przy użyciu flavordimension spowodowało utworzenie 48 wariantów budowy. Aby zmniejszyć listę wariantów budowlanych, łączą moją propozycję (omówienie tego wątku), funkcji Krlystycznej odpowiedzi i Variantfilter.

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
obywatelgcc 16 luty 2017, 14:50

Moim rozwiązaniem jest użycie takiego struktury folderów, jak to z małą zmianą pliku certyfikatów,

enter image description here

I użyj go z flawordimensionami w gradle.

I dodaj w ten sposób w pliku gradle.

flavorDimensions "flav", "conf"

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

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

        serv1{
            dimension "conf"
        }

        serv2{
            dimension "conf"
        }
    }
1
Krish 15 luty 2017, 20:56