【问题标题】:How to build Android gradle project that contains modules with different compileSdkVersion, targetSdkVersion, and minSdkVersion?如何构建包含具有不同 compileSdkVersion、targetSdkVersion 和 minSdkVersion 模块的 Android gradle 项目?
【发布时间】:2014-05-23 23:28:07
【问题描述】:

我的 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 绝对不能跟风。

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

  • 基地
    • 不依赖于任何其他模块
  • 工厂
    • 取决于基础、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 日)

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

【问题讨论】:

  • “在 Eclipse 风格的项目中设置这个模块配置绝对是微不足道的”——只是因为您请求的设置被忽略了。对于 Ant/Eclipse,在运行时重要的 minSdkVersiontargetSdkVersion API 级别是应用程序上的级别,而不是库中的级别。你认为你从这些设置中得到了什么?
  • Android 的内部 android.media.IRemoteControlDisplay.Stub 类在 API 18 和 API 14 - 17 中是不同的。因此我也必须有不同的子类(一个包含 14 - 17,另一个只是18)。这就是我发现自己的洞。
  • 充其量,这会影响您的构建目标(又名compileSdkVersion)。除非您为设备制造商工作(这样您可以准确地知道您的设备的内部类是什么样的),否则请不要混淆这些。关于您的问题,我相信他们正在强制执行compileSdkVersion 兼容性,因为 AAR 是编译的,而不是基于源的库项目。从错误的exploded-aar 来看,感觉您的模块是库项目,这可能会导致您在最后获得单个 JAR 时遇到问题。
  • 是的,我理解您的担忧!但是我的实现实际上在我测试过的所有设备(大约 10 种不同的制造商和类型)上都非常有效。但是好吧,根据这个对话,我可能无法将这个库向前移动到 gradle。不过,我会继续调查,感谢您的宝贵时间。
  • 模块是指味道吗?

标签: android gradle android-gradle-plugin


【解决方案1】:

如果您根据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"
            ...
        }
        ...
    }
}

【讨论】:

  • ScootrNova 提到他在最后生产单罐。但是使用风味会产生多种输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2022-01-10
  • 2017-01-06
  • 2014-04-15
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多