【发布时间】:2014-05-23 23:28:07
【问题描述】:
我的 Android 库项目由四个模块组成:
- 项目
- 基础
- 工厂
- v14
- v18
这是来自 IntelliJ 的此设置的屏幕截图:
我的模块使用非常具体的 Android SDK 级别设置:
- 基地
compileSdkVersion 19minSdkVersion 14targetSdkVersion 19
- 工厂
compileSdkVersion 19minSdkVersion 14targetSdkVersion 19
- v14
compileSdkVersion 17minSdkVersion 14targetSdkVersion 17
- v18
compileSdkVersion 18minSdkVersion 18targetSdkVersion 18
随着新版本 Android 的发布,基本模块和工厂模块的compileSdkVersion 和targetSdkVersion 级别也会随之出现。但是 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.gradle、settings.gradle...)。只是试图避免完全超载这篇文章。
编辑(2014 年 5 月 27 日)
在本文开头添加了我的模块配置的屏幕截图。
【问题讨论】:
-
“在 Eclipse 风格的项目中设置这个模块配置绝对是微不足道的”——只是因为您请求的设置被忽略了。对于 Ant/Eclipse,在运行时重要的
minSdkVersion和targetSdkVersionAPI 级别是应用程序上的级别,而不是库中的级别。你认为你从这些设置中得到了什么? -
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