7

私たちのアプリケーションには無料版と有料版があります。また、ブランドバージョンも作成しています。つまり、アプリケーションは 2 つの次元で異なります。

次の 4 つのバージョンがあります。

  • アプリ、ナイキ編。自由
  • APP、ナイキ編。支払った
  • アプリ、アディダス編。支払った
  • アプリ、アディダス編。自由

私の解決策は、有料と無料の 2 つのビルド タイプを用意することです。

  buildTypes {
        paid {
            packageNameSuffix ".paid"
        }

        free {
            packageNameSuffix ".free"
        }
    }

2 つのビルド フレーバー:

productFlavors{
    nike{
        packageName "com.example.theapp.nike"
    }

    adidas{
        packageName "com.example.theapp.adidas"
    }

}

アプリのすべての無料バージョンは、フレーバー ビルド タイプの組み合わせごとに固有のコンテンツ プロバイダーであるコンテンツ プロバイダーになります。問題は、ビルド バリアントに基づいてソース ファイルを配置する場所がわからないことです。/src/nikeまたは/src/freeに配置されたソース ファイルは、ビルド タイプまたはフレーバーに応じて選択されます。しかし、ビルド バリアント (タイプとフレーバーの組み合わせ) に依存するソース ファイルはどうでしょうか。

4

4 に答える 4

9

ビルドまたはフレーバーごとに、src の下に新しいフォルダーを作成できます。例: 「無料」、「有料」、「ナイキ」、「アディダス」。

これらのフォルダーのいずれかに配置したファイルは、タイプに応じてビルド時に取得され、両方をビルドします。

Android Tools Project Site のGradle Plugin User Guideによると:

ビルド タイプと同様に、プロダクト フレーバーも独自のソースセットを通じてコードとリソースを提供します。

1 つの APK のビルドに使用されるすべてのソースセットを処理する場合、次のルールが使用されます。

  • すべてのソース コード (src/*/java) は、1 つの出力を生成する複数のフォルダーとして一緒に使用されます。
  • マニフェストはすべて 1 つのマニフェストにまとめられます。これにより、ビルド タイプと同様に、製品フレーバーにさまざまなコンポーネントや権限を持たせることができます。
  • すべてのリソース (Android のリソースとアセット) は、ビルド タイプがメインの sourceSet をオーバーライドするプロダクト フレーバーをオーバーライドするオーバーレイ優先度を使用して使用されます
  • 各ビルド バリアントは、リソースから独自の R クラス (またはその他の生成されたソース コード) を生成します。バリアント間で共有されるものはありません。

つまり、buildType「free」の Java ファイルは、フレーバー「nike」のファイルが同じ名前の場合に上書きされます。

しかし、マニフェストに何かを追加する場合、上のリストの 2 番目のポイントによると、最終的なマニフェストはすべてのマニフェストのマージになります。

さらにカスタマイズが必要な場合は、ビルド バリアントのフォルダー "src/freeNike/" にファイルを配置できます。

于 2013-07-03T08:10:54.300 に答える
3

オーバーレイ ルールが原因でビルド タイプがフレーバーをオーバーライドするという同様の問題がありました。

ビルドされたフレーバーに応じて、ビルド タイプ ソース セットを別のフォルダーにリダイレクトすることになりました。

android.applicationVariants.all { variant ->
    switch (variant.name) {
        case "FreeNike":
            variant.mergeResources.doFirst {
                android.sourceSets.free.setRoot("src/freeNike")
            }
            break;
        case "FreeAdidas":
            variant.mergeResources.doFirst {
                android.sourceSets.free.setRoot("src/freeAdidas")
            }
            break;
        case "PaidNike":
            variant.mergeResources.doFirst {
                android.sourceSets.paid.setRoot("src/paidNike")
            }
            break;
        case "PaidAdidas":
            variant.mergeResources.doFirst {
                android.sourceSets.paid.setRoot("src/paidAdidas")
            }
            break;
    }
}

もちろん、別のフォルダ構造を自由に使用できます。ここで例を参照してください: gradle ビルド バリアントのフォルダー命名規則

于 2013-11-03T08:26:41.313 に答える
1

バリアント固有のリソース http://tools.android.com/tech-docs/new-build-systemを使用できるようになった最新の Gradle プラグインをご覧ください。

そしてここに使用例があります https://android.googlesource.com/platform/tools/build/+/master/tests/overlay3/

于 2013-12-19T12:37:51.330 に答える
0

srcDir を sourceSets に入れようとしましたか? そのようです:

    sourceSets {
            main {
                java {
                    srcDirs 'src/java'
                }
            }
     }

nike と adidas の 2 つのソース コードを含む javaResources が出力されます。

于 2013-06-28T15:53:57.523 に答える