我有一个Android项目(已经移植到Android Studio并使用Gradle),它由不同的模块组成。
该项目实际上用于创建两个不同的应用程序,其中代码几乎相同,除了一些资源。
因此资源被分成两个不同的模块。
此项目的原作者曾经在Eclipse中工作,并根据他想要构建的应用程序切换依赖项中包含的资源模块。他还习惯手动更改AndroidManifest.xml中的包名称
我想自动完成所有这些并且仍然只有一个代码库,但是有两个构建目标,每个目标都有特定的模块。这对Gradle来说是可行的吗?
更新
为了使事情变得更加困难,我的项目的层次结构几乎是以下几个:
--+--MainProject
+--LibData
+--LibBase
+--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 build
时就没有错误,但我可以看到包含的资源总是LibResA的资源,就像defaultPublishConfig是唯一一直使用的资源一样。
如果我在Android Studio(0.8.1 atm)中打开此项目,结果是如果我尝试切换LibBase模块的构建变体并将其设置为productbRelease,则会显示以下错误:错误:模块& #39; LibBase'有变种' productbRelease'已选中,但模块' LibData''取决于变体&product;发布'。
我的想法已经不多了。
答案 0 :(得分:3)
不是最好的方法,但如果productFlavors
不足以指定条件依赖项,则可以依赖内联if
并根据可以通过{{注入的某个值对其进行评估3}}
例如,这里是我如何切换external properties(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
这提供了一种使用构建命令切换事物的快速且更灵活的方法,但是过多而且事情会很快变得混乱。
答案 1 :(得分:1)
是的,确实如此。基于Gradle的新Android构建系统通过其产品风格概念支持您的用例。 http://tools.android.com/tech-docs/new-build-system/user-guide
请注意,在迁移到Gradle build时,您可能希望从Eclipse切换到Android Studio。
答案 2 :(得分:0)
因为您已经具有产品风味:
productFlavors {
producta {
}
productb {
}
}
定义带有风味名称前缀的依赖项。 示例:
dependencies {
productaImplementation 'com.google.android.gms:play-services:11.0.2'
productbImplementation 'com.google.android.gms:play-services:12.0.1'
}
通常将定义公共依赖项。
现在为每种口味构建apk。