3

を使用する Android プロジェクトに取り組んでいますFlavors。私のプロジェクトには現在 4 つのフレーバーがありますが、間もなく 6 ~ 7 つのフレーバーになる予定です。f1、f2、f3、f4 の 4 つのフレーバーがあるとします。

main/ の Android リソースがフレーバーのものによってオーバーライドされることはよく知っていますが、クラスはそうではありません (「クラスの重複」コンパイル エラーを参照)。したがって、 main/ にあり、このクラスをf3MyClassでのみ変更したい場合、いくつかの解決策があることを理解しています:

  • main/ から MyClass を削除し、すべてのフレーバーに配置してから、f3/MyClass で変更を行います。これはメンテナンス地獄につながります。私はそれをしたくありません。
  • MyClassと同じ内容のmain/aAbstractMyClassを持って、f1、f2、f4で空のMyClassで継承し、f3で継承して修正を行います。繰り返しますが、私はこのソリューションが好きではありません。なぜなら、クラス数が非常に急速に増加し、プロジェクトの可読性が損なわれるからです。実際、私が現在取り組んでいるプロジェクトはこのソリューションを使用していますが、プロジェクトが大きいため悪夢です。

この美しい投稿で別の解決策を見つけました: https://stackoverflow.com/a/30548238/8096984

この投稿では、f1、f2、および f4 には、MyClass を含む共通の追加の sourceSet へのリンクがあり (そのため、MyClass は main/ にはもうありません)、f3 にはリンクがないことを説明しています。そのため、クラスの重複エラーが発生することなく、MyClass の独自の実装を自由に定義できます。

このソリューションは 3 つの中で最良のようですが、1 つのオーバーライドが必要です。f2 のみを変更したい MyClass2 がある場合はどうなりますか? MyClass2 を追加の sourceSet に入れると、f3 を sourceSet にリンクする必要があるため、クラスの重複エラーのために行った最初のオーバーライドを中断します。

別の sourceSet を作成する必要がありますか? もしそうなら、私はこのソリューションがあまり好きではありません.6〜7種類のフレーバーを使用する大きなプロジェクトで作成しなければならないsourceSetの数を想像できるからです...

私は何をすべきか?

4

1 に答える 1