android – 与Gradle的条件依赖,是否可能?

我有一个Android项目(已经移植到Android Studio并使用Gradle),它由不同的模块组成.

该项目实际上用于创建两个不同的应用程序,其中代码几乎相同,除了一些资源.

因此,资源被分成两个不同的模块.

该项目的原作者曾经在Eclipse中工作,并根据他想要构建的应用程序切换依赖项中包含的资源模块.他还习惯在AndroidManifest.xml中手动更改包名

我想自动完成所有这些并且仍然只有一个代码库,但是有两个构建目标,每个目标都有特定的模块.这对Gradle来说可行吗?

更新:

为了使事情变得更加困难,我的项目的层次结构几乎是以下几点:

--+--MainProject
  +--LibData
  +--LibBase
  +--LibResA
  +--LibResB

哪里:

> MainProject依赖于LibBase和LibData.
> LibData依赖于LibBase
> LibBase要么基于我需要构建的最终APK依赖于LibResA或LibResB.

正如所建议的那样,我已经尝试通过在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构建时就没有错误,但是我可以看到包含的资源总是LibResA的资源,就像defaultPublishConfig是唯一一直使用的资源一样.

如果我在Android Studio(0.8.1 atm)中打开此项目,结果是如果我尝试切换LibBase模块的构建变体并将其设置为productbRelease,则会显示以下错误错误:模块’LibBase’具有变量’productbRelease’被选中,但模块”LibData”取决于变体’productaRelease’.

我的想法已经不多了.

最佳答案
这不是最好的方法,但如果productFlavors不足以指定条件依赖项,则可以依赖于内联if并根据可以通过external properties注入的某个值对其进行评估.

例如,这里是我如何切换LeakCanary(no-op只是另一个的空实现):

的build.gradle

dependencies {
    compile "com.squareup.leakcanary:leakcanary-android"+(project.ext.has("leakCanary")?"":"-no-op")+":1.3.1"
}

用com.squareup.leakcanary构建:leakcanary-android:1.3.1:

$./gradlew :app:assembleDebug -PleakCanary

认情况下,它使用空实现com.squareup.leakcanary构建:leakcanary-android-no-op:1.3.1:

$./gradlew :app:assembleDebug

这提供了一种使用构建命令切换事物的快速且更灵活的方式,但是过多而且事情会很快变得混乱.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...