And*_*tel 5 android gradle android-studio android-productflavors android-sourcesets
可以说我有以下内容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']
}
}
Run Code Online (Sandbox Code Playgroud)
如果你注意到flavor1并且flavor3有相同的srcDirs,那么flavor2和flavor4.
我试图找出是否有办法通过使用这样的东西来避免冗余:
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']
}
}
Run Code Online (Sandbox Code Playgroud)
以上不起作用(已经尝试过).寻找类似的东西,这样我就可以提供一套通用sourceDirs的一套口味.有人试过做类似的事情,可以提供一些指示吗?
名称是否sourceSets需要与口味相同?
我可以sourceSets单独命名,然后将它们映射到productFlavors这样吗?
productFlavors {
flavor1 {
sourceset = "src1"
}
flavor2 {
sourceset = "src2"
}
flavor3 {
sourceset = "src1"
}
flavor4 {
sourceset = "src2"
}
}
sourceSets {
src1 {
}
src2 {
}
}
Run Code Online (Sandbox Code Playgroud)
可以通过某种方式动态分配源集来实现相同的东西吗?
道格拉斯的答案有点帮助我最终得到了我正在寻找的东西(减少了build.gradle中的代码).他使用了上面的可能性#3.谢谢道格拉斯!任何更好的替代赏金猎人仍然是受欢迎的(更接近上面的可能性#1和#2).如果什么都没有出现,那么当我接受他的回答时,道格拉斯已经在这段时间结束了.但仍然会对寻找更好的替代方案持乐观态度.
你也很接近你的第一种可能性:
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']
}
}
Run Code Online (Sandbox Code Playgroud)
上面在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']
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个技巧:通过这种方式,风味的定义与源集列表位于同一位置。
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']
}
}
Run Code Online (Sandbox Code Playgroud)
无论你走哪条路,还有一个值得注意的事情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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |