2017-02-15 2 views
0

일부 서버 인프라에서 작동하는 Android 애플리케이션을 개발합니다. 이제 serv1, serv2, serv3이라는 3 개의 서버 인프라가 있습니다 (이 예제에서). 또한 8 가지 제품 맛 (flav1, flav2, ... flav8)이 있으며 그 수가 늘어날 수 있습니다.많은 프로덕션 환경에서 일치하는 서버 구성

도메인 및 포트와 같은 서버 구성은 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 

그리고 잘 작동하지만 : 각각의 맛은 해당 서버 인프라 구성에 ServerConfig 자바 파일이 있습니다.

이제 HTTPS 확인을 위해 crt 파일을 추가해야합니다. 나는 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 

그리고 구성 및 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 (예 : rename)의 모든 리팩토링은 build.gradle 파일을 변경해야합니다.

서버 구성 (ServerConfig.java 및 ca.crt)을 여러 프로덕션 환경과 일치시키는 데 더 나은 솔루션이 있습니까?

답변

0

@Krish 대답은 매우 도움이되었지만, 제 경우에는 flavorDimensions를 사용하여 48 개 빌드 변형이 생성되었습니다. 빌드 변형 목록을 줄이기 위해 (이 스레드의 문제인) 제안, Krish 응답 및 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

맛이 다른 것으로부터 상속받을 수 있다면 매우 도움이 될 것입니다. [productFlavor 문제를 상속하는 가능성] (https://code.google.com/p/android/issues/detail?id=183350) – obywatelgcc

1

내 솔루션, 인증서 파일에 대한 작은 변화와 같은 폴더 구조를 사용하는

enter image description here

되고 Gradle을에 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

예 : 서버 주소 변경에 대한 이미지 필요. flav7의 경우 serv1.domain.com에서 serv2.domain.com으로 이동합니다. flav7에서 ca.crt가 포함 된 자산 디렉토리를 모르는 사람이 ca.crt를 변경하지 않고 ServerConfig의 필드 만 변경하면 큰 버그가있는 프로덕션 빌드가 생성 될 수 있습니다. 서버 구성을 전환하는 데 가능한 한 적은 단계 만 사용하도록 허용하는 확장 가능한 솔루션을 검색합니다. – obywatelgcc

+0

@obywatelgcc 제 답변을 업데이트했습니다. 확인해 주시겠습니까? – Krish

관련 문제