5

私が次のものを持っているとしましょうsourceSets

sourceSets {
    flavor1 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor2 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
    flavor3 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor4 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
}

あなたが気づいて同じsrcDirsを持っているなら、そしてflavor1そうです。flavor3flavor2flavor4


可能性を試す#1

次のようなものを使用して冗長性を回避する方法があるかどうかを調べようとしていました。

sourceSets {
    flavor1, flavor3 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor2, flavor4 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
}

上記は機能しません(すでに試しました)。sourceDirs一連のフレーバーに共通のセットを提供できるように、似たようなものを探しています。誰かが似たようなことを試してみて、いくつかの指針を提供できますか?


可能性を試す#2

の名前はフレーバーの名前sourceSetsと同じである必要がありますか?

sourceSets個別に名前を付けて、productFlavorsこのようにマッピングできますか?

productFlavors {
    flavor1 {
      sourceset = "src1"
    }
    flavor2 {
      sourceset = "src2"
    }
    flavor3 {
      sourceset = "src1"
    }
    flavor4 {
      sourceset = "src2"
    }
}

sourceSets {
    src1 {
    }
    src2 {
    }
}

可能性を試す#3

同じことを達成するために、どうにかしてタスクを介してソースセットを動的に割り当てることはできますか?


アップデート

ダグラスの答えは、最終的に探していたものに非常に近づくのに役立ちました(build.gradleのコードを減らします)。彼は上記の可能性 #3 を使用しました。ありがとうダグラス!賞金稼ぎからのより良い代替手段は引き続き歓迎されます (上記の可能性 #1 と #2 に近いもの)。何も起こらない場合、私が彼の答えを受け入れたので、賞金は期間が終了したときにすでにダグラスのものです. しかし、より良い代替案を見つけることについては楽観的です。

4

3 に答える 3

6

また、最初の可能性にかなり近づいていました。

sourceSets {
    [flavor1, flavor3].each {
        it.assets.srcDirs = ['repo-assets/flavor1']
        it.res.srcDirs = ['repo-res/flavor1']
    }
    [flavor2, flavor4].each {
        it.assets.srcDirs = ['repo-assets/flavor2']
        it.res.srcDirs = ['repo-res/flavor2']
    }
}

上記は IDEA エディターでは見栄えが悪く、多くの警告が表示されます。コード補完を取得する場合は、タイプを設定できます。

import com.android.build.gradle.api.AndroidSourceSet
android {
    sourceSets {
        [flavor2, flavor4].each { AndroidSourceSet ss ->
            ss.assets.srcDirs = ['repo-assets/flavor2']
            ss.res.srcDirs = ['repo-res/flavor2']
        }
    }
}

もう 1 つのトリック: この方法では、フレーバーの定義がソース セット リストと同じ場所に配置されます。

android
    productFlavors {
        flavor1 {
            applicationId "flavor1.app.id"
        }
        flavor2 {
            applicationId "flavor2.app.id"
        }
        [flavor1, flavor2].each {
            sourceSets[it.name].assets.srcDirs = ['repo-assets/flavor1']
            sourceSets[it.name].res.srcDirs = ['repo-assets/flavor1']
        }
    }

いずれにせよ、 についても注目すべき点がありsrcDirsます。ソースを参照してください。

println assets.srcDirs // say it's [src/flavor/assets]
assets.srcDirs = ['dir1', 'dir2'] // overwrites existing directories: output would be [dir1, dir2]
assets.srcDirs 'dir1', 'dir2' // appends existing directories: output would be [src/flavor/assets, dir1, dir2]
assets.srcDir 'dir1' // appends only one dir, output would be [src/flavor/assets, dir1]
于 2016-03-28T23:51:04.823 に答える
2

@jmols がコメントで言おうとしていることは、次のようなものだと思います。

構造から行く

repo-assets
    flavor1
    flavor2
repo-res
    flavor1
    flavor2

flavor1
    assets
    res
flavor2
    assets
    res

と使用

sourceSets {
    //flavor1.setRoot('flavor1') // default
    //flavor2.setRoot('flavor2') // default
    flavor3.setRoot('flavor1')
    flavor4.setRoot('flavor2')
}

デフォルトの構造については、http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Project-Structureを参照してください。setRootソース コードはsetRoot次のとおりです。すべてのカスタマイズがリセットされることに注意してください。そのため、既定の構造に一致させることが重要です。その組み込み呼び出しはhereにあります。

于 2016-03-28T23:32:47.147 に答える