Android支持库如何工作?

问题描述:

据我所知,支持库正在使用,因为旧设备没有新的API。例如,他们不知道片段是什么以及如何实现它。因此,这些行为在支持库中定义。Android支持库如何工作?

所以,我的主要问题是,什么是/是与它的孪生支持库片段库之间的差异(一个或多个),这是在API 11(安卓3.0,蜂窝)推出。

我的第二个问题是,如果有可能将每个新的API放在支持库中,为什么我们有两种类型的库?我的意思是Android可以在支持库下发布所有的API,而不是支持库和Android版本的X.xx库。

据我了解,支持库可以作为内置API的替代品,但它们不应该是,因为它们直接影响应用程序的大小。

例如,一个支持库为2MB,并且使用它的功能,它需要所有的类,资源等(2MB),所以现在classes.dex(我在应用程序中使用的所有类的Dalvik可执行文件)应用程序还包含支持库类,并且资源也相同。因此,如果没有支持库,我的应用程序大小为1MB,那么现在支持库的大小为2MB,这意味着总共需要3MB。

现在,假设这个支持库功能非常常见,以至于在单个设备上,如果我有10个应用程序,那么至少有9个使用这个支持库,所以我的设备上使用了9 * 2 = 18MB相同的支持库在每个应用程序中都会重复出现,因为现在18MB可能不会那么多,但是如果您有更多使用该支持库的应用程序,所需空间可能会增加。

因此,最好的选择是在您的操作系统中为任何数量的应用程序提供2MB的支持库,而不是为每个应用程序提供该库。因此,如果您真的想在应用中使用某些高效功能来支持旧版本,则需要使用支持库。

另一个问题出现在这里:

为什么不这样支持库添加到OS作为自己的更新,因此,如果没有大小问题每一个应用程序都可以访问该功能?

答案是可能有很多错误。假设某些用户没有安装该更新(支持库)...

还有一种机会是,作为更新,它可能无法像预期的那样有效,或者可能在与OS,因为我们已经看到每个操作系统(Windows,Linux,Mac)都带有新版本,而不是仅仅为所有新功能提供更新生命周期。

+3

如果开发人员不需要支持库提供的任何功能,那么请确保不要使用它。然而,在事情的宏伟计划中,2MB实际上并没有那么多,我更喜欢一个运行良好且向后兼容的应用程序,而不是仅仅因为开发它的人担心APK太大了。此外,您可能只需使用Proguard即可减少/压缩应用程序的APK文件大小。 – 2014-03-31 20:45:24

+5

这么长的句子......真的很难明白这一点。 – CDT 2015-03-11 07:42:11

+0

我不同意你的答案,没有支持库的用户可能会导致很多错误。清单文件已经允许您限制您的应用程序只能在具有特定OpenGL版本的设备上工作。他们可以为支持库做同样的事情,他们甚至可以扩展功能以允许对任何库进行动态依赖。这是目前在大多数基于Linux的操作系统上已经完成的方式。 – 2015-07-04 19:16:29

支持库事实上并不包含新API中的所有内容。它确实支持Fragment API的一部分,但它还不支持ActionBar。为此,你需要另一个库,如ActionBar Sherlock。

为什么有两个库?

因为问题的一部分是谷歌只向后移植了一些东西,但我的理解是,另外,一些新的功能不能被移植回由于核心操作系统架构的局限性和失踪的API深在Android UI框架的核心中。

支持库中的碎片相当于Honeycomb +的碎片。

要第二个任务,从文档:

V13是V4的超集,并包括额外的支持类与V13 API来工作

即,相同的功能性的,只是适用于V13 API。

我使用修改后的v4支持库 - 带有地图。

Android在最近的发行版中提出了很酷的碎片和操作栏功能。

现在,如果我们要使用这些功能,还支持Android的旧版本那么我们将不得不写高度混乱的版本相关的代码,这是不好的。

来拯救我们从所有这些混乱,Android的想出了支持库不提供全面支持的新功能,但不够好,允许开发人员编写它支持所有的设备整齐码。

回答你的第二个问题是很简单的,片段V3.0的不可分割的一部分,如果你想你的应用程序只在V3.0运行+那么你真的不必包括外部库。

已经有人说过,这是真的。虽然缺少一些细节。实际上,我有机会参加最后一次Google IO的会议,他们专门讨论了这个问题。 对于我来说,实际上令人惊讶的是,支持库并没有为所有可用的API版本提供代码,而是改进了他们认为足够相关的新功能,以使它们可以在较老的平台上使用。所以,它的工作的方式通常是:

  • 比方说,我们需要使用全新的(可从API 16)ConnectivityManager来跟踪网络的变化
  • 我们包括支持库v4和我们使用类
  • 它的工作方式是系统将检查我们的API版本,并且将运行内置的本机代码,以防我们在API 16中,或者在任何其他情况下运行支持库的代码。

因此,它的行为就像某种路由网关。原因在于通常使用为上次操作系统和上次系统改进(即:硬件加速)优化的最后代码更高效(并且执行)。

尽管如此,还是有一些元素未被转换为compat库,因为它们在本地内置代码中。例如,片段并不是要重写,因为它们来自API13,因为它们是一个庞大的组件,需要在系统和设备中以较少的功能运行在各种不同的场景中。

最终因为这一切,建议使用这被称为一个很好的做法compats库,特别是如果你准备提供较旧版本的应用程序/代码(这应该是最理想的方式)

+0

请提供有关此会话的更多信息。网上有视频或脚本吗? – OneWorld 2014-01-16 13:09:43

+0

恐怕我不记得具体的会话,但这里是来自IO '12的所有视频。 https://developers.google.com/events/io/2012/希望它有帮助。 – 2014-01-17 15:13:37

Android 4.0.x(ICS)与Android 2.3.x(姜饼)相比,有很多附加功能。兼容性库可以弥补一些添加到ICS的变化,这些变化可以由Gingerbread支持。 “可能”是这里的关键词,因为对ICS做出了很多改变,这些改变对于姜饼来说是永远不会有用的,当然,这些改变也不会得到兼容性库。

例如,你提到的片段实际上在ICS上比在兼容库中略有不同,因为ICS有更多的功能可以使用。如果您查看Fragments类的ICS代码,则它们与兼容性库中的代码不同。它的第二套代码使像ICS中的碎片一样可以在像Gingerbread这样的老版本中使用,而程序员没有注意到很多不同。

这是兼容性库的一个重点,也是为什么它们没有被广泛使用来修补Gingerbread来使用ICS中所有的功能(他们不能)。兼容性库的意义在于接口在较新版本的安卓系统(如ICS)中提供的东西,通过GB方式将ICS方式完成到旧版本(如GB)。

至于为什么他们不只是保持支持库的增长和离开相同的基本操作系统 - 答案是兼容性问题。如果用户只有v4并且v12不在,那么会发生什么? Android现在使用操作系统的Android API版本作为应用程序兼容性的基础,并且开发人员拥有选项包括支持库(增加其应用程序的文件大小,但赋予它们更新的功能)。每个使用支持库的应用程序都独立包含它们(意味着包括4个应用程序= 4x)。

想法是,您只能下载当前API版本的操作系统支持的应用程序(就Google Play而言),您可以选择包含支持库以保持应用程序的外观和风格较旧的API,这些API尚未具有您选择在较新的API上为这些用户提供的功能。这其实是一种外观和感觉,而不是其他任何事情。

希望清除东西:)

+0

因此,操作系统中包含的支持库是否正确? – Clocker 2015-05-11 18:17:18

+1

不完全。较新版本的操作系统具有可以在没有支持库的情况下实现的功能,但是如果您希望旧手机能够正常工作,则必须手动添加支持库并在这些库中使用类(它们是您添加到您的文件夹中的简单.jar文件建立路径)。如果您的目标是较低的最低API,ADT现在会自动将支持库添加到您的项目中,因此无论如何您都可以获得这些高级功能,但它们会让您的项目占用更多空间。有时候定位一个更高的API会更好,所以你可以使用本地代码,但这取决于你自己,以及你没有什么兼容性。 – ComputerEngineer88 2015-05-13 01:54:48