1. ホーム
  2. android

[解決済み] Build Flavorsの使用 - ソースフォルダとbuild.gradleの正しい構造化

2022-04-29 01:43:13

質問

ご注意ください。 Xavierの回答後に編集された回答

私は、異なる ビルドフレーバー Android Studioで1つの同じアプリケーションプロジェクトに対して しかし、適切に動作するように設定するのに大変苦労しているようです。

手順

  1. Android Studioプロジェクトを新規に作成し、名前を「Test」とします。
  2. build.gradle*を開き、以下の行を追加。

    productFlavors {
    flavor1 {
        packageName 'com.android.studio.test.flavor1'
        }
    flavor2 {
        packageName 'com.android.studio.test.flavor2'
        }
    }
    
    
  3. Android Studio を再起動すると、次のように表示されます。 4つのビルドバリアント の下にある「Build Variants」セクションをクリックします。ここまででプロダクトフレーバーのセットアップに成功したことを意味します。**
  4. の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フォルダにリソースファイルが作れないのも普通だと思います。メニューシステムは、これらの余分なリソースフォルダを扱うために更新されていないのです。これは後で来るでしょう。