Android Library Manifest与App Manifest的区别

42

我在这里看到过类似的问题,但有几个问题还不是很清楚。使用Library Project意味着我的整个项目将有两个清单文件——一个是库项目的清单文件,另一个是“主”应用程序项目的清单文件。我不确定哪个文件应该写什么或是否存在某些冗余。

我正在开发一个带有“精简版”和“付费版”的应用小部件,因此几乎所有的代码都会放在库项目中。作为小部件,库中至少会有一个接收器、一个服务、一个配置活动以及其他几个活动。那么这些组件(包括意图、过滤器等)的完全声明应该在哪里声明?它们应该在库的清单文件中声明,还是在应用程序包本身的清单文件中引用库中的类进行声明(例如android:name="com.foo.mylibrary.MyService")?

我查看了一些示例,似乎在两个清单文件中都声明了它们,但我怀疑将它们放在其中一个清单文件中是无操作的。

3个回答

44
使用库项目意味着我的整个项目将有两个清单文件——一个用于库,另一个用于“主”应用程序项目——我不清楚哪个应该放在哪里或是否存在某些冗余。 目前未使用库项目清单。 Gradle for Android,因此Android Studio支持库项目和AAR发布清单。这可以包括活动声明、所需权限或功能或最低支持的Android SDK级别等内容。
特别是当考虑构建类型和产品风味时,库清单与应用程序自己的清单合并的规则有a bit complex
那么这些组件的完整声明——包括意图、过滤器等——应该在哪里声明? 在主机项目中。 库可以发布这些组件,然后Android Studio主机项目可以根据需要删除它们。
它们是在库的清单文件中声明,还是在应用程序包本身的清单文件中引用库中的类(例如android:name="com.foo.mylibrary.MyService")?

后者。

无论是在Gradle for Android和Android Studio中,理论上来说,库发布组件更容易,因此应用程序作者不必这样做。个人而言,我不太喜欢这种方式,因为太多的开发人员将会发布不必要的清单条目。


谢谢。这确实是最有意义的(并不是说总是有意义!)。 - gordonwd
2
@CommonsWare - 我总是喜欢你直接的回答。在这种情况下,它帮了我大忙! - Matt
4
自ADT r20预览版3起,现在可以合并清单文件。因此,通用配置现在可以放入库清单中。https://dev59.com/Imkx5IYBdhLWcg3wAvqn#10400355 - Jade

9
自ADT r20 Preview 3版本起,现在可以合并清单文件(manifests)。因此,通用配置现在可以放入库清单文件(library manifest)中。有关更多信息,请参见https://dev59.com/Imkx5IYBdhLWcg3wAvqn#10400355
需要Intellij IDEA的13版以支持清单文件合并(manifestmerger.enabled=true)。此外,基于Gradle构建系统的Android Studio支持也是必要的。

5
任何引用的Android元素,如activities、receivers、services等,都必须放入您的应用程序清单中,否则它们将不被操作系统识别。正如您所猜测的那样,库清单文件基本上是一个空实现。
更新:正如CommonsWare在上面指出的,Android构建工具现在将尝试代表您合并各种清单。保留原始答案供后人参考。

谢谢。阅读一些文章后,感觉好像清单会被合并之类的。很高兴能够澄清这一点。 - gordonwd
由于这个答案已经四年了,也许需要指出它现在是不正确的。请参见上面Commonsware的更新答案。 - JHH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接