SDK 便是 Software Development Kit 的缩写,中文意思便是“软件开发东西包”。即辅助开发某一类软件的相关文档、典范和东西的调集都能够叫做“SDK”。
apk
APK(全称:Android application package,Android运用程序包)是Android操作体系运用的一种运用程序包文件格局,用于分发和装置移动运用及中间件。一个Android运用程序的代码想要在Android设备上运转,必须先进行编译,然后被打包成为一个被Android体系所能识别的文件才能够被运转,而这种能被Android体系识别并运转的文件格局便是“APK”。
APP开发更偏向于用户层面,从UI展示到业务逻辑处理,全程处理用户的行为。
SDK开发偏向于功能方面,注重功能的开发实现。
SDK与App即独立,又共生,SDK是软件工具包,App是应用软件,App调用封装好的软件工具包,实现App的某项功能,App与SDK也是整体与局部的关系。
对 Android 项目来说,MinSdkVersion、CompileSdkVersion、TargetSdkVersion 这三个属性是必不可少的,贯穿于应用开发的始终,它们的作用也非常重要,只有搞清楚它们三者的内在含义和逻辑关系才能「正确」地设定或修改它们的数值,以确保应用在不同版本的 Android 系统上正常的运行。
新建项目(开发环境:Android Studio Dolphin | 2021.3.1 Patch 1 MacOS)的配置,其中 minSdk 需要创建新项目过程中在 SDK 版本列表里自己选择,compileSdk 和 targetSdk 都是系统默认分配的,它自动和最新的SDK版本保持一致。
MinSdkVersion、CompileSdkVersion、TargetSdkVersion 设置的整数值都唯一对应一个API 级别
API 级别是对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值。Android 平台提供了一套框架 API ,应用可利用它与底层 Android 系统进行交互。该框架 API 由以下部分组成:
一组核心软件包和类
一组用于声明清单文件的 XML 元素和属性
一组用于声明和访问资源的 XML 元素和属性
一组 intent
一组应用可请求的权限,以及系统中包括的权限强制执行
Android 平台提供的框架 API 由被称作“API 级别”的整数标识符指定。每个 Android 平台版本恰好支持一个 API 级别,但隐含对所有早期 API 级别(低至 API 级别 1)的支持。Android 平台初始版本提供的是 API 级别 1,后续版本的 API 级别则依次增加。
API LEVEL 的数值不断增加,展示了一个“持续优化”并保持“前向兼容”的过程,MinSdkVersion、CompileSdkVersion、TargetSdkVersion 三者可以协助我们在项目开发过程中更好的平衡“更新”与“兼容”。
1. MinSdkVersion
用于定义应用程序支持的最低 API 版本,或者说应用运行所需最低 API 级别的整数。如果系统的 API 级别低于该属性中指定的值,Android 系统将阻止用户安装应用。
注意:如果不声明该属性,系统将假定默认值为“1”,这表示该应用兼容所有 Android 版本。如果应用不能兼容所有版本(例如,程序里使用了API 级别 3 中才引入的 API),但并未声明正确的 minSdkVersion,则当应用安装在 API 级别小于 3 的系统上时,应用在运行时尝试访问不可用的 API 时会发生崩溃。举个具体的例子:checkSelfPermission(检查权限方法)是 API 23才加入的,在Android 6.0(API 23)系统的手机会正常运行,假如 minSdkVersion 设为22,程序可以正常安装到 Android 5.0系统的手机上时,但在运行时调用上面不可用的 API 就会崩溃报错:Method NotFound。
在开发时 minSdkVersion 也可以帮助你:如果你调用的 API(由 CompileSdkVersion 值决定),在 minSdkVersion 指代的 SDK 里并不存在的话,IDE 会提示错误,举个例子:
假如我们项目里,compileSdkVersion 大于或等于23(Android 6.0 需动态申请特殊权限),minSdkVersion等于21,如果如果在代码里调用 minSdkVersion 中并不存在的 API 方法:checkSelfPermission(""), 就会出现代码错误提示,把光标停留在这个方法上面,就会提示如下错误:
Call requires API level 23 (current min is 21): android.content.ContextWrapper#checkSelfPermission
当你决定使用什么 minSdkVersion 时候,你应该参考当前的 Android 分布统计,它显示了最近 7 天所有访问 Google Play 的设备信息,他们就是你把应用发布到 Google Play 时的潜在用户。所以这是一个「商业决策」问题,取决于为了支持额外 3% 的设备并确保最佳体验而付出的开发和测试成本是否值得,你需要在潜在的「市场份额」和「维护成本」之间做出权衡。不管怎么说,minSdkVersion 越低,就需要花费越多时间来解决旧的 BUG,并且可能需要 APP 里添加替代方法(高版本 SDK 已经实现的 API 在低版本还没有实现)
2. CompileSdkVersion
CompileSdkVersion 指定 Gradle 编译你的 APP 时使用的 Android API 版本,你的 App 可以使用该版本或者更低版本的 API 特性。简单来说,如果你的 APP 在开发中需要用到一些比较新的 API 特性,那么你的 compileSdkVersion 的数值就应该大于或等于相应的 API 级别。
3. TargetSdkVersion
TargetSdkVersion 按照字面意思理解就是目标 SdkVersion。如果没有设置,则默认值为minSdkVersion。TargetSdkVersion 是 Android 系统实现「前向兼容」的主要手段,当你设置了targetSdkVersion的时候,表示你已经充分测试过了你的App在该目标版本的运行情况(准确的说应该是从 minSdkVersion 到 targetSdkVersion 区间所有的系统版本),除非更新 targetSdkVersion,否则不改变应用的行为。这句话不太好理解,看完后面对其“作用”的分析就会明白了。
我们现在新建一个 Android 项目,targetSdkVersion 与 compileSdkVersion 都使用当前最新的 SDK API LEVEL,比如32,但是过了一段时间后,官方新的API升级到了35,通常的做法是经过评估后(看看新的API LEVEL有哪些亮点,对现有的项目会产生什么影响),然后在项目开发周期的某个时间,将 compileSdkVersion 和 targetSdkVersion 数值修改到和最新的 API LEVEL 一样大,经过严格测试并保证 APP 对 API 的逻辑变化做了相应的适配后才会正式发布 APP 的新版本。
也就是说:用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 targetSdkVersion 和 compileVersion 来获得最好的外观和行为。
回到开头,我们新建项目时,compileSdkVersion 和 targetSdkVersion 默认值是 Google 推荐的最新 API Level,但是 minSdkVersion 由我们自己选择,综合分析,它们通常满足下面的关系:
minSdkVersion(lowest possible) <= targetSdkVersion <= compileSdkVersion(latest SDK)
compileSdkVersion:编译时的环境,与运行时无关。把这个设置成最高,可以避免使用被弃用的API。
minSdkVersion:app软件运行时支持的最低的Android版本。
targetSdkVersion:创建Android项目使用的API版本。使用低版本API就能实现的功能就不要用更高的API版本,因为高版本API可能导致程序的不兼容,影响app在不同安卓版本手机中的显示效果。但也要注意,高版本API会修复和完善低版本中出现的问题,提供更多更好的类和接口给开发者使用。同时高版本API也会新增一些方法和属性,以前多行代码才能搞定的事,现在可能只要一行代码就能搞定。