1. ホーム
  2. android

[解決済み】なぜビルドタイプとプロダクトフレーバーは別物なのですか?

2022-04-22 17:40:54

質問

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

今週は、Androidアプリのgradle設定について勉強しています。最初はビルドタイプとプロダクトフレーバーについてよく理解しているつもりでしたが、ドキュメントを深く読み込むにつれて、この2つの区別がまったく明確でないことに気づきました。

ビルドタイプで指定されたプロパティは、プロダクトフレーバーで指定されたプロパティより優先されるという意味で)階層が明確に定義されているので、ビルドタイプとプロダクトフレーバーを区別する必要性が全く理解できません。すべてのプロパティとメソッドを製品のフレーバーDSLオブジェクトに統合し、ビルドタイプを(デフォルトの)フレーバー次元として扱う方がよいのではないでしょうか?

私が混乱するきっかけとなった具体例をいくつか。

  • signingConfig プロパティは、ビルド・タイプとプロダクト・フレーバーの両方で設定することができます...が minifyEnabled (と、仮定します。 shrinkResources は、ビルドタイプでのみ設定できます。

  • applicationId は製品フレーバーでしか指定できない...そして applicationIdSuffix は、ビルドタイプにしか指定できないのですか!

実際の質問(複数可) :

上記の例から、ビルドタイプとプロダクトフレーバーの役割に明確な区別があるのでしょうか?

その場合、どのように理解すればよいでしょうか。

そうでない場合、最終的にはビルド タイプと製品フレーバーを 1 つの設定可能な DSL オブジェクトに統合する計画でしょうか。

どのように解決するのですか?

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

例えば、ウェブビューでウェブページを開くシンプルなアプリで、バージョンごとに異なるURLとブランディングを設定するような場合です。

繰り返しになりますが、エンドユーザーにとって重要ではないいくつかの違いを除けば、同じアプリケーションであり、特に1つを除いたすべてのバリエーションが自分自身のテストと開発用で、1つのバリエーションだけがエンドユーザーにデプロイされる場合、それはビルドタイプの良い候補となります。もしそれが別のアプリケーションで、複数のバリアントがユーザーにデプロイされるのであれば、おそらくそれはプロダクトフレーバーの候補になるでしょう。

ビルドタイプとフレーバーの間には、一方ではサポートされているが他方ではサポートされていないオプションがあるなど、機能的な違いがあることはすでにお分かりいただけたかと思います。しかし、コンセプトは似ていても異なるものであり、両者を統合する計画はありません。