【发布时间】:2015-05-25 17:01:35
【问题描述】:
我已经为 Android 开发了几个月,这个问题一次又一次地出现:添加全新功能 (API) 以支持库而不在标准 SDK 中提供它们的动机是什么?
示例:
FragmentTabHost API 只能通过android.support.v4.app.FragmentTabHost 使用。大多数时候都很好,但是如果你想同时使用片段嵌套和PreferenceFragment,你就死定了——嵌套需要你切换到android.support.v4.app.Fragment(用于支持4.2以下),但是没有在此支持库中实现 PreferenceFragment。因此,您要么实现自定义解决方法,要么使用已经实现它们的第三方库(请参阅this question)
编辑:正如@eugen 在他的回答中指出的那样,我自己从支持本机片段的 support-v13 中引用了 FragmentTabHost。但是,此信息不会改变整个问题。事实上,如果我将这个 API 与片段嵌套一起使用,我的应用程序将无法在今天大约 30% 的设备上运行(原生片段从 4.2 开始支持嵌套)。
示例:
我今天遇到的另一个问题(并且浪费了太多时间)是通过android.support.v7.app.ActionBarDrawerToggle 提供的ActionBarDrawerToggle。我想使用这个功能,因此我将整个 com.android.support:appcompat-v7:21.0.+ 添加到项目的依赖项中。我猜这会做,但我错了——我的应用程序没有编译(缺少支持库引用的资源)。在尝试了网上的一些技巧后,我找到了this question,它最终提供了解决方案。简而言之:v7支持库依赖于SDK,因此我必须定义compileSdkVersion 21。
后果:
现在,我告诉自己:FragmentTabHost 尚未添加到任何 SDK 版本中,这意味着即使在 4-5 年后,开发人员仍将继续使用 support-v4 lib 来提供此功能(因为即使此 API是今天添加的,您可能需要数年时间才能安全地假设所有目标设备都本机支持它),对吧?相同的论点适用于 android.support.v4.widget.DrawerLayout 和仅存在于支持库中的其他 API。
如果开发人员一定要使用支持库多年,这也意味着他们一定会在这些问题已经解决很久之后遇到上述不一致/依赖问题,对吧?
问题:
Google 为什么要永久保留这些库?如果将所有新 API 与兼容性库并行添加到 SDK 中,这样兼容性库可能会老化并在某个时候“退役”,这不是更好吗?
编辑:遵循@eugen 的回答,我现在更加困惑 - 一些 API “演变”与更新的支持库,但没有进入主 SDK(如 FragmentTabHost,它从 support-v4 演变为支持-v7)。不将它们添加到 SDK 的原因是什么?
【问题讨论】:
-
补充一点,
RecyclerView必须只能从支持库访问。我相信除了你已经列出的原因之外,如果谷歌可以将“额外的、非标准”的功能放在不同的库中,这可能是一种尽量保持 SDK 最小化的方法。 -
FragmentTabHost不是从任何东西进化而来的。有两个单独的版本。support-v4处理支持片段,support-v13处理原生片段。 ||| 使用支持片段更好,因为它们可以更快地得到修复。图书馆经常得到修复。为了修复任何原生的东西,谷歌必须推出一个新版本的 Android,而修复将是该新版本独有的。其他所有人都必须使用支持库。 -
@EugenPechanec,让我再次尝试解释一下自己。如果将原生
Fragment的FragmentTabHost添加到主SDK 而不是support-v13,那么当然会发现一些错误(与任何新API 一样)。但是这些错误将在 1-3 个 SDK 版本中得到解决,并且从 Android 5.x(或 6.x 等)开始,此 API 将变得稳定。然后,从那时起几年后,任何希望使用此 API 的开发人员都可以在没有任何任何支持库的情况下执行此操作。问题是为什么不在某个时候向 SDK 添加新的 API? -
Romain Guy 似乎证实了@MeetTitan 建议的保持 SDK 最小化的基本原理:cyrilmottier.com/2012/07/06/api-16-jelly-bean-review/…。也就是说,我认为将
ViewPager限制在支持库中是一个错误。这个小部件太普遍了,无法标准化。它也是少数支持在移动 UI 上使用基于片段的设计的真正论据之一,如果片段在框架中,那么它也应该如此。同样,如果RecyclerView确实被设计为最终有效替代ListView,那么它也应该在框架中。 -
@corsair992,感谢链接。虽然很老,但该线程提供了对该问题的更多见解。似乎许多开发人员都要求提供库,无论是谷歌的还是第三方的。他们希望现有的运行良好的库(如
ActionBarSherlock)要么由谷歌“推广”,要么由谷歌维护。虽然他们的愿望是完全合法的,并且@RomainGuy 关于保持 SDK 小而不添加可能“过时”的组件的推理,但这仍然不能解释你将它们添加到 Support Libs ......为什么不拥有单独的库对于DrawerLayout和ViewPager?
标签: android compatibility android-support-library