如何构建包含具有不同compileSdkVersion,targetSdkVersion和minSdkVersion的模块的Android gradle项目?

时间:2014-05-23 23:28:07

标签: android gradle android-gradle

我的Android库项目由四个模块组成:

  • 项目
    • 工厂
    • V14
    • V18

以下是IntelliJ的此设置的屏幕截图:

modules

我的模块使用非常具体的Android SDK级别设置:

    • compileSdkVersion 19
    • minSdkVersion 14
    • targetSdkVersion 19
    • compileSdkVersion 19
    • minSdkVersion 14
    • targetSdkVersion 19
  • V14
    • compileSdkVersion 17
    • minSdkVersion 14
    • targetSdkVersion 17
  • V18
    • compileSdkVersion 18
    • minSdkVersion 18
    • targetSdkVersion 18

随着Android的新版本发布,基础和工厂模块可以跟随compileSdkVersiontargetSdkVersion级别。但是,v14和v18都绝对不能效仿。

我的模块以非常具体的方式相互依赖:

    • 不依赖于任何其他模块
    • 取决于base,v14和v18
  • V14
    • 取决于基础
  • V18
    • 取决于基础

所以当我去构建我的项目时,我收到了这个错误:

Error:Gradle: Execution failed for task ':v14:processReleaseManifest'.
> Manifest merging failed. See console for more info.

使用./gradlew build --stacktrace通过终端构建时,我会获得更多信息:

:v14:processReleaseManifest
[/blahblah/project/v14/build/exploded-aar/blahblah/base/unspecified/AndroidManifest.xml:2] Main manifest has <uses-sdk android:targetSdkVersion='17'> but library uses targetSdkVersion='19'
:v14:processReleaseManifest FAILED

这是我的v14 AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.v14">

    <application />

</manifest>

(我的基础AndroidManifest.xml文件几乎完全相同)

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example">

    <application />

</manifest>

这个错误对我来说没什么意义。首先,我没有在我的四个不同AndroidManifest.xml文件中的任何一个中指定版本级别(而是让我通过我的四个不同的build.gradle文件继承这些值。)

其次,我没有“主要清单”。基本模块可能是我最接近的那个,所以v14模块到底是怎样的“主要清单”我觉得很混乱。

最后,如果这个项目设置不可行,那我很震惊。在Eclipse风格的项目中设置这个模块配置是非常简单的。这就是我几个月来一直在建立图书馆的方式。

顺便说一下,我的最终目标是将所有文件编译成单个.jar文件,这是我当前的Eclipse风格项目可以做的。只是我试图完全迁移到gradle而不是被遗忘在沉没的船上......

有什么想法吗?如有必要,我可以发布各种gradle文件(build.gradlesettings.gradle ...)。试着避免完全超载这篇文章。

编辑(2014年5月27日)

在此帖子的开头添加了我的模块配置的屏幕截图。

1 个答案:

答案 0 :(得分:0)

如果您根据Gradle plugin user guide使用口味:

  

defaultConfig提供所有口味的基本配置   每种味道都可以覆盖任何价值。

例如,您可以在build.gradle文件中进行以下设置:

    android {

    ...

        defaultConfig {
            ...
            compileSdkVersion 19
            minSdkVersion 14
            targetSdkVersion 19
        }

        productFlavors {
            base {
                compileSdkVersion 19
                minSdkVersion 14
                targetSdkVersion 19
            }

            factory {
                compileSdkVersion 19
                minSdkVersion 14
                targetSdkVersion 19
            }

            v14 {
                compileSdkVersion 17
                minSdkVersion 14
                targetSdkVersion 17
            }

            v18 {
                compileSdkVersion 18
                minSdkVersion 18
                targetSdkVersion 18
            }
        }
    }

此外,您无需在清单中设置包名称。您可以像下面这样设置它们:

android {
    ...

    productFlavors {
        base {
            packageName "com.example"
            ...
        }

        v14 {
            packageName "com.example.v14"
            ...
        }
        ...
    }
}