晚上好,朋友们。 我们为Android开发者的未来学生准备了有用的翻译。 高级课程 。 ” 我们很高兴与您分享这些材料。
如果您正在阅读本文,则意味着您可能对以下内容感兴趣:
- API级别是什么意思?
- 如何使用
compileSdkVersion
, minSdkVersion
或targetSdkVersion
? - 如何保证应用程序可以在具有不同版本OS的设备上正常运行?

所有这些概念都是相互关联的,在本文中,我将尝试以一种简单而有效的方式向您解释它们。
为此,您需要了解
SDK和
API之间的区别,并了解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的作用,那么应该很容易理解
向后和向前的兼容性 ,以及
compileSdkVersion
,
minSdkVersion
和
targetSdkVersion
。
编译器
该值仅用于
告诉Gradle用来编译应用程序的SDK版本。 这使开发人员可以访问所有为
compileSdkVersion
设置的API级别之前可用的API。
强烈建议使用最新的SDK进行编译:- 高级别的API使开发人员可以利用最新的API和新平台提供的机会。
- 要使用最新版本的
SupportLibrary
, compileSdkVersion
必须与SupportLibrary
的版本匹配。
例如,要使用
SupportLibrary-28.xx
,
compileSdkVersion
也必须为28。
Android应用程序与Android平台的新版本兼容,因为对API的更改通常是附加的,并且旧的API可能会过时,但不会删除。
这意味着
直接兼容性主要由平台来保证,并且当您在具有比
compileSdkVersion
指定的API更高的API级别的设备上运行应用程序时,在运行时没有问题,该应用程序将按预期运行较新版本的平台。
例如:
应用程序 +
compileSdkVersion =
26和
API级别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 。
资料来源