android - 与 Gradle 的条件依赖关系,这可能吗?

标签 android gradle android-gradle-plugin

我有一个由不同模块组成的 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/

相关文章:

android - "The most simple Android project has the following build.gradle"

Android:OpenCore 是否支持音频效果?

gradle - 使用gradle时如何将jar/war依赖项添加到ant文件集?

build - Android Studio RC1 Gradle 版本更新后无法编译

android - Gradle错误:错误:任务 ':app:dexDebug'的执行失败

android - 禁用依赖权限

安卓开发: How To Keep Text When Orientation Changes?

android - 带有 DialogFragment 的上下文操作栏

android - 如何获取部分布局在另一个布局下

android lint 库模块中未使用的资源在应用程序中使用