我有一个由不同模块组成的 Android 项目(已经移植到 Android Studio 并使用 Gradle)。
该项目实际上用于创建两个不同的应用程序,其中的代码几乎相同,除了一些资源。
因此资源被分成了两个不同的模块。
该项目的原作者曾经在Eclipse中工作,并根据他要构建的应用程序切换依赖项中包含的资源模块。而且他还习惯了手动更改AndroidManifest.xml中的包名
我想将所有这些自动化并且仍然有一个代码库,但是有两个构建目标,每个目标都有特定的模块。这对 Gradle 可行吗?
更新:
让事情变得更难的是,我的项目有一个层次结构,大致如下:
--+--MainProject
+--LibData
+--LibBase
+--LibResA
+--LibResB
地点:
- MainProject 依赖于 LibBase 和 LibData。
- LibData 依赖于 LibBase
- LibBase 依赖于 LibResA 或 LibResB,具体取决于我需要构建的最终 APK。
按照建议,我尝试通过在 MainProject build.gradle 中添加以下内容来实现这一点:
productFlavors {
producta {
}
productb {
}
}
然后在 LibBase 中,我将以下内容添加到它的 build.gradle 中:
dependencies {
productaCompile project(':LibResA')
productbCompile project(':LibResB')
}
但是,当我构建项目时,LibData 找不到从 LibBase 继承的类和资源。所以现在我陷入了这个错误。在我看来,LibBase 似乎没有被复制到 LibData 的中间体。这样 LibData 就无法解析 LibBase 中的类,但这只是我的假设。
更新 2:
我一直在调查这个问题,现在我已经将我的 build.gradle 文件更改为如下所示:
主项目 build.gradle:
defaultPublishConfig "productaRelease"
publishNonDefault true
productFlavors {
producta {
applicationId "com.producta"
}
productb {
applicationId "com.productb"
}
}
dependencies {
compile project(':LibData')
}
LibData build.gradle(没有产品风格,只有依赖项):
dependencies {
compile project(':LibBase')
}
LibBase build.gradle:
defaultPublishConfig "productaRelease"
publishNonDefault true
productFlavors {
producta {
}
productb {
}
}
dependencies {
productaCompile project(path: ':LibResA')
productbCompile project(path: ':LibResB')
}
这样我在执行通常的 gradle clean build
时不会出错,但我可以看到包含的资源始终是 LibResA 的资源,就像 defaultPublishConfig 是唯一一直使用的资源一样。
如果我在 Android Studio (0.8.1 atm) 中打开这个项目,结果是如果我尝试切换 LibBase 模块的构建变体并将其设置为 productbRelease,则会显示以下错误:Error:Module ' LibBase' 已选择变体 'productbRelease',但模块 ''LibData'' 依赖于变体 'productaRelease'。
我的想法用完了。
最佳答案
因为您已经有了产品口味:
productFlavors {
producta {
}
productb {
}
}
定义以 flavor 名称为前缀的依赖项。 示例:
dependencies {
productaImplementation 'com.google.android.gms:play-services:11.0.2'
productbImplementation 'com.google.android.gms:play-services:12.0.1'
}
公共(public)依赖将被正常定义。
现在为个人口味构建 apk。
关于android - 与 Gradle 的条件依赖关系,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410995/