一直对这几个版本的概念都不是特别清楚,前几天面试的时候还被问到过,发现有必要好好整理一下。
compileSdkVersion
它告诉 Gradle 使用哪个 Android SDK 版本来运行你的应用,要使用当然要先下载。
重点: 修改 compileSdkVersion 并不会改变运行的时候的行为,但是有可能会出现新的编译问题,例如 compileSdkVersion 版本改成很低之后,出现如下的编译问题:
1 | Error:(53, 30) 错误: -source 1.6 中不支持 diamond 运算符 |
虽然它纯粹只是在编译的时候使用,但是官方强烈建议我们使用最新的 SDK 进行编译,因为这样可以使用新的编译检查避免很多问题。
没有道理不用最新的啊?
buildeToolsVersion
前面我们说了 compileSdkVersion 是我们SDK的版本号,也就是 API Level,例如 API-19、API-20、API-21 等等。
buildeToolsVersion 是我们构建工具的版本,其中包括了打包工具 aapt、dx 等等。这个工具的目录位于..your_sdk_path/build-tools/XX.XX.XX。
minSdkVersion
这个概念相对非常好理解。就是该应用的最低要求。例如我们应用的 minSdkVersion 是 10 。 那么最高只支持 9 的手机是不能够安装这个应用的。
该设置的好处在开发也起到一个好处,在你使用了高于 minSdkVersion 的 API 时会警告你。
相对来说越低越好,但是许多时候,一些技术在低版本的设配上很难实现,这种时候是去做兼容还是舍弃就要好好决定了。
targetSdkVersion
相对来说,它是这几个概念中最难被理解的。
官方说它有点 interesting , “targetSdkVersion is the main way Android provides forward compatibility” 。( targetSdkVersion 是 Android 系统提供前向兼容的主要手段。)
这句话怎么理解呢?
举个例子,如果 API 10 中,有一个 A 方法是输出 “我喜欢你” ,而随着系统的升级,在 API 11 中,A 方法依然存在,但是源码却经过了改变,变成了输出“我喜欢你妈”。这种情况虽然非常少发生,但是还是有可能发生的。
那么这个时候设置 targetSdkVersion 的好处就来了。当设置 targetSdkVersion 为 10 时,系统运行时就会使用 API 10,输出“我喜欢你”;设置 targetSdkVersion 为 11 就会输出“我喜欢你妈”。
这么一解释,是不是就比较能够明白 targetSdkVersion 是 Android 系统提供前向兼容的主要手段 这句话了呢。
虽然 API 不会,但是 API 的行为却发生了变化。虽然一般情况下我们是将 targetSdkVersion 更新成最新的,但是要特别注意,最好是去查看新版 API 中,老的一些方法的变化,否则盲目的更新,可能就会出现 “我喜欢你” 就会变成 “我喜欢你妈” 这样的错误(虽然官方也是极力避免这种情况的发生)。
照上面所说,一般情况下,这三种 Sdk 的版本的关系是这样的
minSdkVersion <= targetSdkVersion <= compileSdkVersion
但是理想上,这三者的关系应该是这样的:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
参考链接:
buildtoolsVersion vs compileSdkVersion
Android关于buildToolVersion与CompileSdkVersion的区别