请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

productFlavor的dimension有两个,它们的差异化引用库要怎么实现?

我的productFlavor有两个dimension,

flavorDimensions "customer", "language"
productFlavors {
    newera {
        dimension "customer"
    }
    hello {
        dimension "customer"
    }
    world {
        dimension "customer"
    }

    cn {
        dimension "language"
    }
    en {
        dimension "language"
        applicationIdSuffix ".en"
    }
}

我想针对合并后的variant去引用不同的包,
比如 neweraEn 需要引用一个单独的库,其他都不需要。

单独一个dimension的implementation是正常的,比如 neweraImplementation project(":newera_en") 和 enImplementation project(":newera_en") 都正常,
但两个dimension混合后就会报错:neweraEnImplementation project(":newera_en") 就会报错:

Could not find method neweraEnImplementation() for arguments project ':newera en' on object of type0.internal.artifacts.dsl.dependencies..DefaultDependencyHandler .

请问这种场景有什么解决办法吗?

因为每个 customer 有许多共用代码,假设把dimension换成一维,定义 neweraCn, neweraEn,就要复制一大堆共用代码,反而不好维护。

正在回答 回答被采纳积分+3

1回答

Vincent文森 2023-09-21 15:52:03

同学你好,这种写法应该只支持单一维度。

可以尝试一下我在另一个答案回复的方案二:

通过本次执行的task名称来写if-else:

gralde.startParameter.taskNames.forEach{ name ->
    if (name = "buildAbc"){
       // ...
    }
}

希望能够解决你的问题。


0 回复 有任何疑惑可以回复我~
  • 提问者 逐梦稚者 #1
    我试了试这段代码,task里有各种其他的 neweraCn 相关,没有 build……
    不过先不管它。
    
    > Task :app:mergeNeweraCnDebugJavaResource
    > Task :app:dexBuilderNeweraCnDebug
    > Task :app:mergeProjectDexNeweraCnDebug
    > Task :app:packageNeweraCnDebug
    > Task :app:createNeweraCnDebugApkListingFileRedirect
    > Task :app:assembleNeweraCnDebug
    
    既然引用库只支持单一维度,那我问问 我的需求这样做可以吧:
    newera的cn, en有大量的相同代码和资源文件,我新建一个lib neweraBase,把它们放在这里,
    然后把两维给展开成 neweraCn, neweraEn,分别引用 neweraBase,然后 neweraEn 再单独引用它特殊的库。
    回复 有任何疑惑可以回复我~ 2023-09-21 16:12:04
  • Vincent文森 回复 提问者 逐梦稚者 #2
    1. gralde.startParameter.taskNames指的是你触发编译所使用的任务名,如果你不是用build任务就不会有build任务。
    2. 我没理解错的话你是说把二维展开成一维,只定义一个维度的flavor,这样应该是可行的。
    回复 有任何疑惑可以回复我~ 2023-09-22 15:29:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信