Android API级别,向后和向前兼容

晚上好,朋友们。 我们为Android开发者的未来学生准备了有用的翻译 高级课程 我们很高兴与您分享这些材料。




如果您正在阅读本文,则意味着您可能对以下内容感兴趣:

  • API级别是什么意思?
  • 如何使用compileSdkVersionminSdkVersiontargetSdkVersion
  • 如何保证应用程序可以在具有不同版本OS的设备上正常运行?



所有这些概念都是相互关联的,在本文中,我将尝试以一种简单而有效的方式向您解释它们。

为此,您需要了解SDKAPI之间的区别,并了解Android生态系统中的API级别

的确,在Android中,SDK和API之间存在1:1的关系,并且经常经常将这两个术语作为同义词使用,但请务必理解这不是同一回事。

正确地说,每个Android版本都有一个SDK和一个等效的API,以及此API的级别。

开发包


它代表软件开发套件 。 请注意“工具包”(kit)一词,它仅由一组各种工具,库,文档,示例组成,可帮助开发人员创建,调试和运行Android应用程序。 SDK随附了一个API。

如果您在Android Studio中打开SDK Manager ,则可以更清楚地看到Android SDK的组成。

Platform SDK的第一个标签列出了每个Android版本的SDK。

如下图所示,Android 9.0 SDK(也称为Pie)包含:

  • Android SDK Platform 28(这是框架API )。
  • Android 28的源代码(这是API的实现 ,如您所见,它是可选的...记住这一点)。
  • 以及其他很多东西,例如Android模拟器的各种系统映像。


Android Studio SDK管理器中的SDK概述。

SDK工具的第二个选项卡显示了其他工具,这些工具也是SDK的一部分,但与平台版本无关。 这意味着它们可以单独发布或更新。

API


它代表应用程序编程接口 。 它只是一个接口,是一个抽象层,提供了软件的两个不同“部分”之间的链接。 它的工作方式就像提供者(例如,图书馆)和使用者(例如,应用程序)之间的合同。

这是一组正式定义,例如类,方法,函数,模块,常量,其他开发人员可以使用这些定义来编写其代码。 但是,API不包含实现。

API级别


API级别是一个整数值,可唯一标识Android平台提供的框架API的版本。

通常,对平台框架API进行更新的目的是使新版本的API保持与早期版本的兼容性,因此对新API的大部分更改都是加性的,并且API的旧部分已过时但未被删除。

现在有人可能会怀疑...

如果Android API没有提供实现,并且SDK Manager提供了可选的可下载API源代码作为SDK的一部分,那么相应的实现在哪里?

答案很简单。 在设备上。

让我们弄清楚...

从源代码到APK文件


通常,一个Android项目由开发人员使用Android API(应用程序模块)编写的代码以及其他一些库/依赖项(.jar文件,AAR,模块等)和资源组成。

编译过程会将用Java或Kotlin编写的代码(包括依赖项(减少代码的原因之一!),DEX字节码)转换为DEX字节码,然后将所有内容连同资源压缩为APK文件。 在此阶段,API的实现未包含在最终的APK中!


构建过程-Android开发人员

DEX文件和Android运行时



Android体系结构-Android开发人员

Android Runtime是完成所有肮脏工作和执行DEX文件的地方。 它包含两个主要组件:

  • 虚拟机可利用代码的可移植性和平台独立性。 从Android 5.0(Lollipop)开始,旧的运行时Dalvik虚拟机已被新的Android RunTime(ART)完全取代。 Dalvik使用JIT编译器,而ART使用AOT(提前)编译和JIT来在运行时分析代码。
  • 基本库是标准的Java和Android库。 简而言之,这就是API实现所在的位置。

此级别上可用的API版本与运行该应用程序的Android平台的版本相对应。
例如,如果实际设备上安装了Android 9(Pie),则所有级别28以上的API均可用。

如果您了解Android Runtime的关键点以及API的作用,那么应该很容易理解向后和向前的兼容性 ,以及compileSdkVersionminSdkVersiontargetSdkVersion

编译器


该值仅用于告诉Gradle用来编译应用程序的SDK版本。 这使开发人员可以访问所有为compileSdkVersion设置的API级别之前可用的API。

强烈建议使用最新的SDK进行编译:

  • 高级别的API使开发人员可以利用最新的API和新平台提供的机会。
  • 要使用最新版本的SupportLibrarycompileSdkVersion必须与SupportLibrary的版本匹配。

例如,要使用SupportLibrary-28.xxcompileSdkVersion也必须为28。

  • 要切换到AndroidX或使用它,必须将compileSdkVersion设置为至少28。
  • 准备好满足Google Play中目标API级别要求 。 Google宣布,每年将为新应用程序和更新设置最低API目标级别,以将新的Android版本更快地传播到Google市场。 您可以在此处此处找到更多信息。

Android应用程序与Android平台的新版本兼容,因为对API的更改通常是附加的,并且旧的API可能会过时,但不会删除。

这意味着直接兼容性主要由平台来保证,并且当您在具有比compileSdkVersion指定的API更高的API级别的设备上运行应用程序时,在运行时没有问题,该应用程序将按预期运行较新版本的平台。

例如:

应用程序 + compileSdkVersion = 26API级别26中引入的API xyz()方法可以在具有Android 8 Oreo(API级别26)的设备上运行。

同一应用程序可以在具有Android 9 Pie(API级别28)的设备上运行,因为API xyz()方法在API级别28上仍然可用。

minSdkVersion


该值指示应用程序可以运行的最低API级别。 这是最低要求。 如果未指定,则默认值为1

开发人员需要设置正确的值,并确保在此API级别以下的应用程序正确运行。 这称为向后兼容

在开发期间,当开发人员尝试使用低于minSdkVersion中指定的任何API时, Lint警告开发人员。 重要的是不要忽略警告并进行纠正!

为了确保向后兼容 ,开发人员可以在运行时检查平台的版本,并在平台的较新版本中使用新的API,在较旧的版本中使用旧的API,或者根据情况使用某些提供向后兼容性的静态库。

同样重要的是要提及,Google Play商店使用此值通过将设备平台的版本与minSdkVersion应用程序进行比较来确定是否可以在特定设备上安装该应用程序。

选择该值时,开发人员应格外小心,因为平台无法保证向后兼容性。

为项目选择“正确的”价值也是一项业务决策,因为它会影响应用程序的受众人数。 看平台分布

例如:

应用程序 + compileSdkVersion = 26 + minSdkVersion = 22 ,API级别26中引入的API xyz()方法可以在具有Android 8 Oreo(API级别26)的设备上运行。

可以在具有Android 5.1 Lollipop(API级别22)的旧设备上安装并运行相同的应用程序,而该API方法xyz()不存在。 如果开发人员没有通过运行时检查或任何库提供向后兼容性,则该应用程序将在尝试访问xyz() API方法时崩溃。

targetSdkVersion


此值指示开发应用程序时使用的API级别。

不要将其与compileSdkVersion混淆。 后者仅在编译时使用,并使开发人员可以使用新的API。 相比之下,第一个是APK的一部分(以及minSdkVersion ),它会更改运行时的行为。 这是开发人员可以控制直接兼容性的方法

有时,在新的运行时环境中工作时,基本系统中可能会有一些API更改,这些更改可能影响应用程序的行为。

目标应用程序级别包括特定于平台版本的运行时行为。 如果应用程序尚未准备好支持运行时行为的这些更改,则可能会失败。

一个简单的示例是Runtime Permission ,它是Android 6棉花糖(API级别23)中引入的。

可以使用23级API编译应用程序,但如果尚未准备好支持新的运行时权限模型,则具有目标22级API。

因此,在不包括新的运行时行为的情况下,应用程序仍然可以兼容。

无论如何,正如已经提到的,Google要求应用程序满足目标API级别的新要求,因此您应该始终具有较高的优先级来更新此值。

现在放在一起,我们看到了明确的关系

minSdkVersion ≤ targetSdkVersion ≤ compileSdkVersion

请记住,强烈建议您使用最新的API级别进行编译,并尝试使用targetSdkVersion == compileSdkVersion

资料来源


Source: https://habr.com/ru/post/zh-CN466367/


All Articles