57

私はAndroidスタジオに移動し、フレーバーを使用するようにセットアップした古いEclipseプロジェクトを持っています。フレーバー間で異なる Java ファイルを使用しようとするまでは、問題なく動作しているように見えました。

私のプロジェクト設定はこれです:

ProjectRoot
+- acitonbarsherlock
+- facebook
+- myLib1
+- myProject
   +- src
      +- commonFiles
         +- flavor1
         +- flavor2
   +- res
      +- flavor1
      +- flavor2

myProject gradle ファイル android クロージャーの内部は次のようになります。

android {
compileSdkVersion 17
buildToolsVersion "18.0.1"

signingConfigs {
     ...
}

productFlavors {
    flavor2 {
    }
    flavor1 {
    }
}

sourceSets{
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/commonFiles/java']
        resources.srcDirs = ['src/commonFiles/java']
        aidl.srcDirs = ['src/commonFiles/java']
        renderscript.srcDirs = ['src/commonFiles/java']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    flavor2 {
        manifest.srcFile 'AndroidManifest-flavor2.xml'
        res.srcDirs = ['res-flavor2', 'res']
        java.srcDirs = ['src/flavor2/java','src/commonFiles/java']
        resources.srcDirs = ['src/flavor2/java','src/commonFiles/java']
        aidl.srcDirs = ['src/flavor2/java','src/commonFiles/java']
        renderscript.srcDirs = ['src/flavor2/java','src/commonFiles/java']
    }

    flavor1 {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/flavor1/java','src/commonFiles/java']
        resources.srcDirs = ['src/flavor1/java','src/commonFiles/java']
        aidl.srcDirs = ['src/flavor1/java','src/commonFiles/java']
        renderscript.srcDirs = ['src/flavor1/java','src/commonFiles/java']
        res.srcDirs = ['res-flavor1','res']
        assets.srcDirs = ['assets']
    }

    // Move the tests to tests/java, tests/res, etc...
    instrumentTest.setRoot('tests')

    // Move the build types to build-types/<type>
    // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
    // This moves them out of them default location under src/<type>/... which would
    // conflict with src/ being used by the main source set.
    // Adding new build types or product flavors should be accompanied
    // by a similar customization.
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')

}

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

}

このような私のセットアップでは、gradle はクラスを見つけることができないと文句を言います。

ここで私が見た他のさまざまなトピックから、他の人がソースセットを定義さえしていないことがわかります。

これを以前に実験したことがあり、これを適切に構成する方法を知っている人はいますか?

4

6 に答える 6

67

sourceSetsカスタムを定義するのではなく、デフォルトのgradle構成を使用する方がよいと思います。慣例が便利であることに気付くまで、私はカスタム ソースセットを作成していました。

次のようなものが必要です。

+ src
    + main // this is your common code
        + java 
        + res
    + flavor1
        + java
        + res
    + flavor2
        + java
        + res

次に、ソースセットのクロージャーを削除するだけですbuild.gradle

注:構成ではgradle、リソースはマージまたはオーバーライドされますが、すべてのjavaコードは同じクラスパスに置かれます。たとえば、AndroidManifest.xml各フレーバーのファイルには、mainのマニフェスト ファイルとの違いだけが必要です。たとえば、ic_launcherフレーバーにアセットがあると、ic_launcherそのようなファイルが存在する場合、from main がオーバーライドされます。ただし、フレーバーとフレーバーのHomeActivity.java両方にファイルをmain含めることはできず、重複ファイル エラーが発生します。

于 2013-12-03T08:01:16.590 に答える
44

必要に応じて、カスタムsourceSetsand flavours(またはbuildTypes) を使用してもかまいません。

例として、Gradle ファイルで次のように設定できます。

productFlavors {
    flavor2 {
    }
    flavor1 {
    }
}

sourceSets{
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/commonFiles/java']
        resources.srcDirs = ['src/commonFiles/java']
        aidl.srcDirs = ['src/commonFiles/java']
        renderscript.srcDirs = ['src/commonFiles/java']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
  flavor1 {
       java.srcDirs = ['src-flavor1'] 
       res.srcDirs = ['res-flavor1']
       ...
    }

}
于 2014-02-10T13:46:51.433 に答える
7

これが私のGradleの外観です:

   productFlavors {
    // Still keeping the productFlavors closure in case we decide to add flavors later
    normal {
        applicationId 'com.akshat'
    }
    qa {
        applicationId 'com.akshat.qa'
    }
}

 sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jni.srcDirs = [] // Set empty since we use our own ndkBuild task
        jniLibs.srcDirs = ['libs']
    }

    normal {
        java.srcDirs = ['src_normal']
    }
    qa{
        java.srcDirs = ['src_qa']
    }

そして、これが私のディレクトリ構造の方法です:

MyApplication
    - res
    - libs
    - jni 
    - src
         -com/akshat/
    - src_qa
         - com/akshat/util/FlavorConst.java
    - src_normal
         - com/akshat/util/FlavorConst.java
于 2016-05-21T05:57:23.270 に答える