ビルドタイプと製品フレーバーが異なるのはなぜですか? 質問する

ビルドタイプと製品フレーバーが異なるのはなぜですか? 質問する

前書き: これは、Android アプリでビルド タイプとプロダクト フレーバーを使用する方法に関する質問ではありません。関連する基本的な概念は理解しています。この質問は、ビルド タイプでどの構成を指定すべきか、プロダクト フレーバーでどの構成を指定すべきか、そして実際に区別が必要かどうかについて理解しようとするものです。

今週は、Android アプリの Gradle 構成についてさらに学習しました。当初はビルド タイプとプロダクト フレーバーについてよく理解していると思っていましたが、ドキュメントを詳しく読んでいくうちに、この 2 つの違いがまったく明確でないことに気付きました。

明確に定義された階層があるため (ビルド タイプで指定されたプロパティが製品フレーバーで指定されたプロパティよりも優先されるという意味で)、ビルド タイプと製品フレーバーを区別する必要がある理由がまったくわかりません。すべてのプロパティとメソッドを製品フレーバー DSL オブジェクトにマージし、ビルド タイプを (デフォルトの) フレーバー ディメンションとして扱う方がよいのではないでしょうか。

私が混乱する原因となった具体的な例をいくつか挙げます。

  • このsigningConfigプロパティは、ビルド タイプと製品フレーバーの両方で設定できますが、minifyEnabled(そして、おそらくshrinkResources) ビルド タイプでのみ構成できます。

  • applicationIdプロダクトフレーバーでのみ指定可能...applicationIdSuffixビルドタイプでのみ指定可能!?

実際の質問:

上記の例を踏まえると、ビルド タイプと製品フレーバーの役割には明確な違いがあるでしょうか?

もしそうなら、それを理解する最善の方法は何でしょうか?

そうでない場合、最終的にはビルド タイプと製品フレーバーを 1 つの構成可能な DSL オブジェクトに統合する予定はありますか?

ベストアンサー1

@CommonsWare がコメントで述べたことをさらに詳しく説明すると、ビルド タイプは機能的に異なるものではないアプリケーションの異なるビルド用であるというのが基本的な考え方です。つまり、アプリのデバッグ バージョンとリリース バージョンがある場合、それらは同じアプリですが、一方にはデバッグ コードや、おそらくより多くのログ記録などが含まれ、もう一方は合理化され、最適化され、ProGuard によって難読化されている可能性があります。フレーバーの場合、アプリが何らかの点で著しく異なることが意図されています。最も明確な例は、アプリの無料バージョンと有料バージョンですが、開発者はアプリが配布される場所に基づいて区別することもできます (アプリ内課金 API の使用に影響する可能性があります)。

さまざまな顧客向けに、類似のアプリのさまざまなバージョンを多数作成する開発者がいます。たとえば、バージョンごとに URL とブランドが異なる、Web ビューで Web ページを開くシンプルなアプリなどです。これは、フレーバーの適切な使用方法です。

繰り返しになりますが、エンド ユーザーにとって重要ではないいくつかの違いを除けば「同じアプリケーション」であり、特に 1 つを除くすべてのバリアントが独自のテストおよび開発用であり、エンド ユーザーに展開されるバリアントが 1 つだけである場合は、ビルド タイプに適した候補となります。「異なる」アプリケーションであり、複数のバリアントがユーザーに展開される場合は、製品フレーバーの候補となる可能性があります。

ビルド タイプとフレーバーには機能上の違いがあり、一方では一部のオプションがサポートされていても、もう一方ではサポートされていないことは既に確認しました。ただし、概念は似ていても異なり、これらを統合する予定はありません。

おすすめ記事