web-dev-qa-db-ja.com

Androidのカスタムソースセットを使用したGradleフレーバー-gradleファイルはどのように表示されますか?

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はflavor1またはflavor2のcommonFilesから継承しようとしているクラスを見つけることができないことについて不平を言っています。

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

誰もこれを以前に実験し、これを適切に設定する方法を知っていますか?

49
AdamWardVGP

カスタム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というアセットがある場合、そのようなファイルが存在する場合、mainからのic_launcherがオーバーライドされます。ただし、mainとフレーバーの両方にファイルHomeActivity.Javaを含めることはできず、ファイルの重複エラーが発生します。

55
Saad Farooq

必要に応じて、カスタムsourceSetsおよび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']
       ...
    }

}
39
Ryan

私の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
5
Akshat

この方法は私には有効です。楽しい

sourceSets {
        main {
            manifest.srcFile 'src/AndroidManifest.xml'
            Java.srcDirs = ['src/Java']
            resources.srcDirs = ['srs/others']
            res.srcDirs = ['src/res']
            assets.srcDirs = ['src/assets']
            jniLibs.srcDirs = ['jniLibs']
        }
        development{
            res.srcDirs += ['development/src/res']
        }
        standford{
            res.srcDirs += ['standford/src/res']
        }

        commercial{
            res.srcDirs += ['commercial/src/res']
        }

    }
    productFlavors {
        development{
            flavorDimensions "default"
        }
        standford{
            flavorDimensions "default"
        }
        commercial{
            flavorDimensions "default"
        }
    }
2
Qamar

以下の例のようにコーディングできます

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        res.srcDirs = ['res']
        Java.srcDirs = ['src', '../3party/Alohalytics/src/Android/Java', 'ttsearch/jni/out']
        assets.srcDirs = ['assets', 'flavors/mwm-ttf-assets']
        jniLibs.srcDirs = ['libs', 'jniLibs', 'ttsearch/libs']
    }
    flavor {
        manifest.srcFile 'flavor'
        assets.srcDirs = ['flavor/assets']
        res.srcDirs = ['flavor/res']
        res.srcDirs = ['flavor/res']
        ....
    }
}
0
Benchur Wong