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

Cha*_*ere 6 android gradle android-gradle-plugin

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

  • 项目
    • 基础
    • V14
    • V18

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

模块

我的模块使用非常特定的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.
Run Code Online (Sandbox Code Playgroud)

在使用终端进行构建时./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
Run Code Online (Sandbox Code Playgroud)

这是我的v14 AndroidManifest.xml文件:

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

    <application />

</manifest>
Run Code Online (Sandbox Code Playgroud)

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

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

    <application />

</manifest>
Run Code Online (Sandbox Code Playgroud)

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

其次,我没有"主要表现".基本模块可能是我最接近的那个,所以v14模块究竟如何最终成为"主要清单"我觉得很混乱.

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

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

有任何想法吗?如有必要,我可以发布我的各种gradle文件(build.gradle,settings.gradle...).只是试图避免完全重载这篇文章.

编辑(2014年5月27日)

在本文开头添加了我的模块配置的屏幕截图.

mac*_*lir 0

如果您根据Gradle 插件用户指南使用风味:

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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

此外,您也不需要在清单中设置包名称。您可以按如下方式设置它们:

android {
    ...

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

        v14 {
            packageName "com.example.v14"
            ...
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)