Android:minSdkVersion,targetSdkVersion,compileSdkVersion

minSdkVersion

指定运行App所需系统的最低API level。
例如指定其值为3,如果Android系统的API level小于3,Android系统会拒绝安装该应用。
Google Play Store把该值作为参考之一,决定用户的Android设备能安装哪些App。
lint运行项目时如果发现使用了高于minSdkVersion的API,会产生警告,提醒开发者,避免程序运行时因调用不存在的API而崩溃。
如果程序仅需要在新系统上使用某些API,可以通过在运行时检查系统版本来解决(Build.Version.SDK_INIT)。
该值必须指定,如果不指定,则默认为1,如果你的App使用了API level 3的API,运行在API level 低于3的系统上时会因调用不存在的API而崩溃。

怎样确定minSdkVersion的值?
理论上该值越小越好,越小代表App能够运行在更广泛的设备上。
实际上跟App需要使用的系统特性有关,例如某个版本的API是整个App的核心功能,那么minSdkVersion最小应指定为该版本。
如果你的App中用到了API level 3开始引入的API(包括第三方库),也用到了API level 5开始引入的API(包括第三方库),那么该值应该指定为所有使用的API中level最高的,此处应为5。
极少数情况下,你的App声明minSdkVersion为3,但却必须使用minSdkVersion为5的库,需要这样干:
1. 在主清单文件manifest节点声明xmlns:tools=”http://schemas.android.com/tools,然后添加节点<uses-sdk tools:overrideLibrary="库的全名"/>
2. 处理所有边界情况,确保仅在API Level >=5的系统上运行时才使用该库
3. 进行充分测试。


targetSdkVersion

讨论这个问题之前,先解释Android应用的兼容性:
(1)Android应用一般具有向前兼容性,即能够在更新的Android系统上正常运行。因为Android系统的更新主要是在旧系统的基础上增加和修改API,而不是删除API,这样就能保证Android系统升级后,App运行时调用的系统API仍然有效,能够正常运行。需要注意的是,新系统修改API,可能影响App的运行行为,因此开发者应该了解这些API的行为差异并且在各种版本的Android系统上测试App。
(2)Android应用一般不具有向后兼容性,即可能无法在更老的Android系统上正常运行。因为App使用的新系统的API在老系统上可能没有,运行时就可能出错。

其次,还需要了解Android系统的行为改变:
随着Android系统的版本更新,会引入一些行为上的改变,详情见https://developer.android.com/reference/android/os/Build.VERSION_CODES.html
每个新版本的平台亮点,详情见https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
例如,
Android 3.0(API Level 11)开始应用的默认主题是Holo。
Android 6.0(API Level 23)开始引入了运行时权限。

targetSdkVersion表示我已经针对这个系统版本充分测试了App,我希望App运行在该版本的Android系统上,这样系统不会启用兼容模式来改变App的行为,是我期望的结果。
App仍然能够运行在minSdkVersion和targetSdkVersion之间的系统上,但由于低版本系统的某些行为与高版本系统的不同,App运行时只能表现出低版本系统的行为,跟我们期望的结果可能有差异。
App也能够运行在高于targetSdkVersion的系统上,这种情况下系统会启用兼容模式,使App表现出我们期望的行为(跟在targetSdkVersion系统上运行行为一致)。

举个例子,minSdkVersion指定为10,targetSdkVersion指定为23(我期望App运行在23上系统上,表现出23的特性)
App如果运行在API Level 10的系统上,默认主题不是Holo,也不需要运行时权限;
App如果运行在API Level 11到22的系统上,默认主题是Holo,不需要运行时权限;
App如果运行在API Level 23的系统上,默认主题是Holo,需要运行时权限;(是我们期望的行为)
App如果运行在API Level 高于23的系统上,默认主题是Holo,需要运行时权限。(系统启用兼容模式,表现出我们期望的行为)

怎样确定targetSdkVersion的值?
如果不指定,其值默认为minSdkVersion。
推荐使用最新的API Level。因为随着Android最新版本的推出,陆陆续续会推出搭载了最新系统的Android设备。targetSdkVersion指定为最新的API Level,能够让使用最新Android系统的用户体验到新系统的新行为新特性,并且不会影响App在老版本系统的运行效果。但是,盲目地更新targetSdkVersion而不经过测试是不可取的,更新targetSdkVersion后,应该查询targetSdkVersion版本对应的行为变更,去核对App的代码,看每一条行为变更会对App造成什么样的影响,有的是影响了App的外观(例如默认主题),有的是影响App的逻辑(例如运行时权限),有的是影响App的功能(例如弃用了某个API,用某个新API代替)等等,只有把这些影响都考虑到并且修改到位了,并进行了全面的测试,才算是更新targetSdkVersion成功了!


compileSdkVersion

告诉Gradle你想用哪个版本的Android SDK来编译你的App。
你在IDE中编写的代码,调用的API都是基于该版本的Android SDK。
如果你想使用某个新版本的API,那么你就应该指定该值为这个新版本的API level。
该值只在编译期间有用,不会影响App运行时的行为。

怎样确定compileSdkVersion的值?
推荐使用最新版本的Android SDK来编译你的代码,好处是用最新的编译规则检测你的代码,避免使用最新弃用的API,为使用最新的API做准备。
注意,如果你使用了最新版本的Support Library,那么你也应该用最新版本的Android SDK来编译你的代码,这两者必须配套使用,例如使用了23.1.1 Support Library,那么compileSdkVersion 必须至少指定为23(与Support Library版本的第一个数字匹配),否则编译可能会出错。


三者之间的关系:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
理想情况下,
minSdkVersion(越低越好) <= targetSdkVersion = compileSdkVersion(最新版本)


三者之间还有个小不同:
minSdkVersion 和 targetSdkVersion 会被打包到APK,compileSdkVersion不会。


参考:
https://developer.android.com/guide/topics/manifest/uses-sdk-element.html
https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd

发布了6 篇原创文章 · 获赞 6 · 访问量 8769
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览