2016-05-25 9 views
14

私は非常にばかげた質問をしていますが、私はここ数時間から私のアプリの前に座っていますが、問題の内容を理解できません。製品の味:重複したクラスが見つかりました

私は(kotlinで書かれた)のAndroidアプリを持っていると私は2つの製品の味を作り、製品の風味でクラス/ファイルを上書きしたい:

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 


android { 
    ... 
    productFlavors { 
    foo { 
     applicationId "com.foo" 
    } 
    } 
} 

だから私のGradleのスクリプトはつまり私はfoo製品の風味でBar.ktファイルを上書きしたいと思いますので、基本的に

- src 
    - androidTest 
    - foo 
     - java 
     - com 
      - example 
      - Bar.kt 
    - main 
     - java 
     - com 
      - example 
      - Bar.kt 
    - test 

を、何とかそれを:

私のファイルは、以下のように構成されています動作しません:クラスバーが重複していると言います。

ヒント?

+2

は風味特定のソースは、すなわち、(あなたが定義したfalvorsにのみ存在すべきではありませんメインではない)?したがって、少なくとも2つのフレーバーを定義し、それらのフレーバーのソースセットにはBar.ktしかありません。 – Michael

+0

ええ、おそらくあなたは正しいです...実際には、ダガーモジュールをオーバーライドしようとしています...だから、Bar.ktは実際にダガー2モジュールです – sockeqwe

+0

[Android gradle buildTypes:Duplicate class](http: /stackoverflow.com/questions/18782368/android-gradle-buildtypes-duplicate-class) – miensol

答えて

25

The documentation for variants状態(強調鉱山):

注:特定のビルドバリアントの場合、Gradleのは 同じJavaクラスを定義した2つの以上のソース・セット・ディレクトリに遭遇 その場合、ビルドエラーがスローされます。たとえば、デバッグAPKを構築する場合、 はsrc/debug/Utility.javaとsrc/main/Utility.javaの両方を定義できません。 Gradleは、 のビルド中にこれらのディレクトリをすべて確認し、'duplicate class'エラーをスローするため、これは です。さまざまなタイプのビルドタイプに対して異なる バージョンのUtility.javaが必要な場合は、それぞれの ビルドタイプで独自のバージョンのファイルを定義し、それを メイン/ソースセットに含めないでください。

したがって、解決策は、バリアントあたりBar.ktという独自のバージョンを持ち、それをメインソースセットから除外することです。

+3

私が4-5のフレーバーを持っていて、そのうち3つが同じクラスを使用し、セットが特定のコードを使用している場合は、それを複製する必要がありますかどこでもsourceSetsできますか? ソースセットではできません –

+1

@AkhilDad私は別のモジュールを作り、フレーバー間でコードを共有できると思います。 – miensol

7

miensolによると、あなたのファイルはmainになり、フレーバー固有のフォルダにはなりません。また、gradleは、アンドロイドリソースシステムと同じように動作すると期待しています。しかし、私はあなたが持っているすべてのフレーバーフォルダにBar.ktをコピーする必要がないように、コードの重複なしにこれを行う方法を見つけました。

それでは、次の3つのフレーバーDEVPRODモックを持っているとしましょう。あなたの特別な嘲笑模擬にを模倣したいが、 devdフレーバーの通常の実装。あなたは模擬ファイルを模様フレーバー固有のフォルダmock/java/com/something/に置き、のようないくつかのランダムな名前を持つ新しいフォルダにあなたの "デフォルト"の実装を置きます。今度は、それらのフレーバーがどこのBar.ktクラスを探すべきなのかをgradleに伝えなければなりません。

あなたbuild.gradleにでこれを入れて:

android { 
    ... 
    sourceSets { 
     prod { 
      java.srcDirs('src/non-mock/java') 
     } 
     dev { 
      java.srcDirs('src/non-mock/java') 
     } 
    } 

} 
関連する問題