[解決済み】なぜビルドタイプとプロダクトフレーバーは別物なのですか?
質問
前置き:これは、Androidアプリでビルドタイプとプロダクトフレーバーを使用する方法についての質問ではありません。基本的なコンセプトは理解しています。この質問は、ビルド タイプで指定すべき構成と、プロダクト フレーバーで指定すべき構成、およびその区別が実際に必要であるかどうかを理解しようとするものです。
今週は、Androidアプリのgradle設定について勉強しています。最初はビルドタイプとプロダクトフレーバーについてよく理解しているつもりでしたが、ドキュメントを深く読み込むにつれて、この2つの区別がまったく明確でないことに気づきました。
ビルドタイプで指定されたプロパティは、プロダクトフレーバーで指定されたプロパティより優先されるという意味で)階層が明確に定義されているので、ビルドタイプとプロダクトフレーバーを区別する必要性が全く理解できません。すべてのプロパティとメソッドを製品のフレーバーDSLオブジェクトに統合し、ビルドタイプを(デフォルトの)フレーバー次元として扱う方がよいのではないでしょうか?
私が混乱するきっかけとなった具体例をいくつか。
-
は
signingConfig
プロパティは、ビルド・タイプとプロダクト・フレーバーの両方で設定することができます...がminifyEnabled
(と、仮定します。shrinkResources
は、ビルドタイプでのみ設定できます。 -
applicationId
は製品フレーバーでしか指定できない...そしてapplicationIdSuffix
は、ビルドタイプにしか指定できないのですか!
実際の質問(複数可) :
上記の例から、ビルドタイプとプロダクトフレーバーの役割に明確な区別があるのでしょうか?
その場合、どのように理解すればよいでしょうか。
そうでない場合、最終的にはビルド タイプと製品フレーバーを 1 つの設定可能な DSL オブジェクトに統合する計画でしょうか。
どのように解決するのですか?
CommonsWare がコメントで述べたことを発展させると、基本的な考え方は、ビルド タイプは、機能的に異なるわけではないアプリケーションの異なるビルドのためにあるということです。アプリのデバッグ版とリリース版がある場合、それらは同じアプリですが、一方にはデバッグ コード、おそらくより多くのロギングなどが含まれ、もう一方は効率化、最適化、おそらく ProGuard を通じた難読化が施されています。フレーバーでは、アプリが何らかの方法で顕著に異なることを意図しています。最も明確な例は、アプリの無料版と有料版ですが、開発者は、アプリが配布される場所に基づいて区別することもできます(これはアプリ内課金APIの使用に影響する可能性があります)。
例えば、ウェブビューでウェブページを開くシンプルなアプリで、バージョンごとに異なるURLとブランディングを設定するような場合です。
繰り返しになりますが、エンドユーザーにとって重要ではないいくつかの違いを除けば、同じアプリケーションであり、特に1つを除いたすべてのバリエーションが自分自身のテストと開発用で、1つのバリエーションだけがエンドユーザーにデプロイされる場合、それはビルドタイプの良い候補となります。もしそれが別のアプリケーションで、複数のバリアントがユーザーにデプロイされるのであれば、おそらくそれはプロダクトフレーバーの候補になるでしょう。
ビルドタイプとフレーバーの間には、一方ではサポートされているが他方ではサポートされていないオプションがあるなど、機能的な違いがあることはすでにお分かりいただけたかと思います。しかし、コンセプトは似ていても異なるものであり、両者を統合する計画はありません。
関連
-
[解決済み】パッケージ名(Google Analytics)に一致するクライアントが見つからない - 複数のproductFlavorsとbuildTypes
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Android TextViewにandroid:ellipsize=endのバグがある。
-
SpinnerのOnItemSelectedListenerのonItemSelectedメソッドの4つのパラメーターの意味
-
[解決済み] Gradleの実装とAPIの設定
-
[解決済み] Android Studioがbuild.gradleでデフォルトでビルドするProduct Flavorは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
gitlab 設定エラー。リモートリポジトリから読み込めなかったか、ホストキーの検証に失敗しました。
-
Androidで発生した問題、解決策とヒント
-
最新のandroidプロジェクトディレクトリにあるarmeabi-v7aとarmeabiの具体的な意味とその違いを教えてください。
-
IllegalStateException。ArrayAdapter は、リソース ID が TextView である必要があります。
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
WeChatとQQは、他のアプリのオープンリストに自分のアプリを追加し、ファイルパスを取得することができます
-
Androidの美しいSeekBarスタイルのカスタマイズ
-
Androidのカラーグラデーション実装のまとめ
-
android.content.ActivityNotFoundException を解決します。Intent問題を処理するActivityが見つからない