2017-02-15 6 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のjavaファイルを持っています。

ここで、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のリファクタリング(例:名前の変更)はすべて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

フレーバーが他のフレーバーから継承することができれば非常に役に立ちます。 [商品の問題の継承の可能性](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 ServerConfigサーバーのアドレスなどで静的な最終フィールドを持っている無駄です、そのフィールドの既定値はありません。 – obywatelgcc

+0

私はサーバーアドレスの変更のためのイメージ要件を必要とします。 flav7の場合はserv1.domain.comからserv2.domain.comになります。 flav7のアセットディレクトリにca.crtが含まれていることを知らない人がca.crtを変更せずにServerConfigのフィールドのみを変更すると、大きなバグでプロダクションビルドが生成される可能性があります。私はスケーラブルなソリューションを検索し、できるだけ少ないステップでサーバーの設定を切り替えることができました。 – obywatelgcc

+0

@obywatelgcc私は自分の答えを更新しました。これを確認できますか? – Krish

関連する問題