[解決済み] Build Flavorsの使用 - ソースフォルダとbuild.gradleの正しい構造化
質問
ご注意ください。 Xavierの回答後に編集された回答
私は、異なる ビルドフレーバー Android Studioで1つの同じアプリケーションプロジェクトに対して しかし、適切に動作するように設定するのに大変苦労しているようです。
手順
- Android Studioプロジェクトを新規に作成し、名前を「Test」とします。
-
build.gradle*を開き、以下の行を追加。
productFlavors { flavor1 { packageName 'com.android.studio.test.flavor1' } flavor2 { packageName 'com.android.studio.test.flavor2' } }
- Android Studio を再起動すると、次のように表示されます。 4つのビルドバリアント の下にある「Build Variants」セクションをクリックします。ここまででプロダクトフレーバーのセットアップに成功したことを意味します。**
-
のSourceフォルダーを新規作成。 フレーバー1 しかし、この方法が正しいかどうかわかりません。以下は、その方法です。
-
このプロジェクトのパッケージ名を覚えておいてください。
com.foo.test
-
を右クリックします。
src
フォルダを、flavor1では、実際にエクスプローラで個々のフォルダを作成し、その構造は次のようになります。src/flavor1/java/com/foo/test/MainActivity.java
. - 上記は、'java'フォルダが 青 つまり、IDEはそれがアクティブなソースディレクトリであることを認識しています。また、パッケージは自動的に作成されました。にもかかわらず、重複するクラスが見つかったという警告が表示されます。 こちらのスクリーンショットをご覧ください。
- flavor2については、手動でパッケージを作成してみましたが、flavor2の「src」フォルダが青色になっていないようで、右クリックしたときのオプションが異なり、「新規パッケージ」が使用できない状態になっています。 こちらの画像をご覧ください。
- しかし、AndroidリソースファイルやAndoridリソースディレクトリを作成する機能は提供されませんので、フレーバーごとに異なるリソースを使用したい場合は注意が必要です。
-
このプロジェクトのパッケージ名を覚えておいてください。
私は何か間違ったことをしているのだろうか?それとも何か見落としているのでしょうか?もっと情報が必要なら教えてください。
*私のプロジェクトは 二 build.gradleファイルです。1つはプロジェクトフォルダのルート( \GradleTest )にあり、こちらは空です。2つ目はGradleTestというラベルのついたサブフォルダ(GradleTest-GradleTest)のルートにあり、こちらは開くとすでにコードが入っているため、編集したのはこちらのファイルです。
** gradleの設定を確認したところ、どうやら 自動インポートを使用する は がすでに有効になっています。 にもかかわらず、build.gradle ファイルに変更を加えると は自動的に更新されません。 ビルドバリアント 注意 ビルド - プロジェクトの再構築、ビルド - プロジェクトの作成も試しましたが、ダメでした。プロジェクトを閉じて、再度開くと、変更が反映されます。
解決方法は?
Studio の環境設定の Gradle セクションで、プロジェクトの自動インポートを有効にすることができます (後でデフォルトで有効にします)。これにより、build.gradleを編集するたびに、Studioが再インポートするようになります。
フレーバーを作成しても、そのためのカスタムコードを使用するわけではないので、フォルダは作成しません。自分で作成する必要があります。
を見てみると 私のIO講演 をクリックすると、フレーバーとビルドタイプの値を混ぜて variant を作成する方法がわかります。
Javaソースの場合。
src/main/java
src/flavor1/java
src/debug/java
は、3つとも1つの出力を作成するために使用されます。つまり、これらは同じクラスを定義することはできません。
もし、2つのフレーバーで同じクラスの異なるバージョンを持ちたい場合は、両方のフレーバーで作成する必要があります。
src/flavor1/java/com/foo/A.java
src/flavor2/java/com/foo/A.java
そして、src/main/java にあるあなたのコードは、次のようになります。
import com.foo.A
選択されたフレーバーに応じて、com.foo.A の正しいバージョンが使用されます。
これはまた、両方のバージョンのAが同じAPIを持っていなければならないことを意味します(少なくとも、src/main/java/...のクラスによって使用されるAPIに関しては)。
修正された質問に合わせて編集する
さらに、同じAクラスは相互に排他的なソースフォルダにのみ置くことが重要です。この場合、src/flavor1/java と src/flavor2/java は一緒に選択されることはありませんが、main と flavor1 は一緒に選択されます。
もし、あるアクティビティの異なるバージョンを異なるフレーバーで提供したい場合は、src/main/javaに配置しないでください。
もしあなたが3つのフレーバーを持っていて、フレーバー2とフレーバー3が同じアクティビティを共有している間、フレーバー1のためのカスタム1だけが必要な場合は、それらの他の2つのアクティビティのための共通のソースフォルダを作成することができることに注意してください。新しいソースフォルダーを作成し、それを使用するようにソースセットを構成する上で、完全な柔軟性を持っています。
その他のご指摘について。
2ndフレーバーのソースフォルダが青くないのは正常です。2ndフレーバーに切り替えて有効にすると、中にパッケージやクラスを作成できるようになります。それまでは、Studioはこのフォルダをソースフォルダとは見なしません。将来的には、IDEがこれらを認識できるように改善することを期待しています。 非アクティブ ソースフォルダを使用します。
resフォルダにリソースファイルが作れないのも普通だと思います。メニューシステムは、これらの余分なリソースフォルダを扱うために更新されていないのです。これは後で来るでしょう。
関連
-
[解決済み】パッケージ名(Google Analytics)に一致するクライアントが見つからない - 複数のproductFlavorsとbuildTypes
-
android studioが "The activity must be exported or contain an intent-filter" と表示され実行される。
-
指定された子にはすでに親がいます。まず、その子の親に対して removeView() をコールする必要があります。
-
アンドロイドリストビュー
-
[解決済み] gradleのキャッシュをクリアする方法は?
-
[解決済み】Android Studioです。jarをライブラリとして追加しますか?
-
[解決済み】google-services.jsonで異なるproductFlavorsを指定する場合
-
[解決済み】すべてのSDKライセンスを自動的に受け入れる
-
[解決済み】Android Studio エラー "インストールされたビルドツールリビジョン 31.0.0 は破損しています" について
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
ジャークとして。起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりません アクティビティ起動中のエラー
-
RuntimeException: アクティビティを開始できません ComponentInfo solution
-
IllegalStateException。ArrayAdapter は、リソース ID が TextView である必要があります。
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
エラー:未宣言の識別子(AS)の使用
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
プロセス 'command 'F:\sdkbuild-tools', 26.0.2 AAAPT.exe' finished with non-zero exit value 1
-
AndroidでListViewを使ってカスタムテーブルを描画する