非常に愚かな質問がありますが、何時間も前からアプリの前に座っていますが、問題が何なのか理解できません。
Androidアプリ(kotlinで作成))があり、2つの製品フレーバーを作成し、製品フレーバーのクラス/ファイルをオーバーライドしたい:
私のgradleスクリプトは次のとおりです:
apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
Android {
...
productFlavors {
foo {
applicationId "com.foo"
}
}
}
私のファイルは次のように構成されています:
- src
- androidTest
- foo
- Java
- com
- example
- Bar.kt
- main
- Java
- com
- example
- Bar.kt
- test
したがって、基本的にfoo
製品フレーバーのBar.kt
ファイルをオーバーライドしたいと思いますが、どういうわけか機能しません。クラスBarが重複しているということです。
ヒントはありますか?
バリアントのドキュメント state(emphasis mine):
注:特定のビルドバリアントについて、同じJavaクラスを定義した2つ以上のソースセットディレクトリが検出されると、Gradleはビルドエラーをスローします。たとえば、デバッグAPKをビルドする場合、 src/debug/Utility.Javaとsrc/main/Utility.Javaの両方を定義します。これは、Gradleがビルドプロセス中にこれらの両方のディレクトリを確認し、a 'duplicate class' errorをスローするためです。異なるビルドタイプのUtility.Javaの異なるバージョンでは、各ビルドタイプに独自のバージョンのファイルを定義させることができますmain /ソースセットに含めない。
解決策は、独自のバージョンのBar.kt
バリアントごとに、メインソースセットから除外します。
Miensolで述べたように、ファイルをmain
およびフレーバー固有のフォルダーに配置することはできず、gradleが同じように機能することを期待できませんAndroidリソースシステムが機能します。しかし、これを行う方法を見つけましたコードの重複がないため、Bar.kt
をすべてのフレーバーフォルダーにコピーする必要がありません。
3つのフレーバーdev、prod、およびmockがあるとします。特別なモックBar.kt
をmockにしたいが、通常の実装はdevおよびprodフレーバーにしたい。モックされたファイルをmockフレーバー固有のフォルダーmock/Java/com/something/
に配置し、「デフォルト」実装をnon-mock/Java/com/something/
などのランダムな名前で新しいフォルダーに配置し、「common 」も理にかなっています。ここで、これらのフレーバーがBar.kt
クラスを探すべき場所をgradleに指示する必要があります。
これをbuild.gradle
に入れてください:
Android {
...
sourceSets {
prod {
Java.srcDirs('src/non-mock/Java')
}
dev {
Java.srcDirs('src/non-mock/Java')
}
}
}
A、B、Cなどの複数のフレーバーがある場合
メインコードにはすべてのアクティビティが含まれており、AおよびCフレーバーの場合、ShoppingCartActivityの一部のアクティビティの一部の機能を変更する必要があります。
次に、以下のようにいくつかの変更を行い、ShoppingCartActivityを3つすべてのフレーバー(Bを含む)に入れ、mainから削除し、すべてにファイルを宣言する必要がありますメインマニフェスト以外のマニフェストファイル
詳細については ソースセットでビルド を確認してください。
- A
- Java
- com
- example
- ShoppingCartActivity.kt(some changes)
- B
- Java
- com
- example
- ShoppingCartActivity.kt
- C
- Java
- com
- example
- ShoppingCartActivity.kt(new changes added)
- main
- Java
- com
- example
**(remove from here)**