問題タブ [android-build-flavors]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - AndroidフレーバーでJava/Kotlinクラスを柔軟にオーバーライドするにはどうすればよいですか?
を使用する Android プロジェクトに取り組んでいますFlavors
。私のプロジェクトには現在 4 つのフレーバーがありますが、間もなく 6 ~ 7 つのフレーバーになる予定です。f1、f2、f3、f4 の 4 つのフレーバーがあるとします。
main/ の Android リソースがフレーバーのものによってオーバーライドされることはよく知っていますが、クラスはそうではありません (「クラスの重複」コンパイル エラーを参照)。したがって、 main/ にあり、このクラスをf3MyClass
でのみ変更したい場合、いくつかの解決策があることを理解しています:
- main/ から MyClass を削除し、すべてのフレーバーに配置してから、f3/MyClass で変更を行います。これはメンテナンス地獄につながります。私はそれをしたくありません。
- MyClassと同じ内容のmain/a
AbstractMyClass
を持って、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の数を想像できるからです...
私は何をすべきか?
android - 動的機能とビルド フレーバーを使用する場合のマニフェスト マージ エラー
dynamic-feature-modules を使用するとAndroidManifest.xml
、モジュールを事前にインストールする必要があるかどうかを定義できます。
か否か:
私のプロジェクトには 2 つのビルド フレーバーがあります。モジュールは 1 つのフレーバーにプリインストールする必要がありますが、他のフレーバーにはインストールしないでください。
AndroidManifest.xml
アイデアは、main
ソース セットにこのデフォルトを含めることです。
モジュールがプリインストールされている必要があるビルドフレーバーの場合、そのプロパティを次のAndroidManifest.xml
ようにオーバーライドするファイルを作成します。dist:onDemand
false
残念ながら、これは機能しません。マニフェスト マージャーは、次のエラーで失敗します。
マージ エラー: エラー: tools:replace が属性 dist:onDemand の行: 11 で指定されていますが、ショップ マニフェストに新しい値が指定されていません。行 10 エラー: 検証に失敗しました。ショップ マニフェストを終了します。
ここで何が問題なのか誰にもわかりますか?