Android:minSdkVersion,targetSdkVersion,compileSdkVersion

本文详细介绍了minSdkVersion、targetSdkVersion和compileSdkVersion的概念及作用,帮助开发者正确配置Android应用,确保兼容性和新特性支持。

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

### 3.1 配置冲突原因分析 在 Unity 升级 Android Gradle 插件后,若出现 `minSdkVersion greater than targetSdkVersion` 的警告,通常是因为模块间的 SDK 版本配置不一致或与插件版本的默认行为不兼容。Android Gradle 插件 7.x 及 8.x 对 `minSdkVersion` 和 `targetSdkVersion` 的要求更为严格,若 `minSdkVersion` 大于 `targetSdkVersion`,构建系统会抛出警告甚至错误,影响构建流程的正常执行 [^1]。 ### 3.2 修复 `minSdkVersion` 和 `targetSdkVersion` 警告的配置方法 为了解决此问题,需确保 `minSdkVersion` 不大于 `targetSdkVersion`,并且所有模块(如主应用模块和 `unityLibrary` 模块)中的 SDK 版本配置保持一致。可在模块的 `build.gradle` 文件中统一设置: ```gradle android { compileSdkVersion 34 defaultConfig { minSdkVersion 21 targetSdkVersion 34 } } ``` 若项目中存在多个模块,应确保所有模块均采用相同的 `compileSdkVersion` 和 `targetSdkVersion`,否则会出现版本冲突。例如,在 Unity 导出的 Android 项目中,主模块和 `unityLibrary` 模块的 `build.gradle` 文件中均需配置一致的 SDK 版本 [^1]。 ### 3.3 插件版本与 SDK 版本兼容性建议 若使用 Android Gradle 插件 7.4.x,则推荐使用 `compileSdkVersion 31` 或更高版本,并确保 `minSdkVersion` 不超过 `targetSdkVersion`。例如: ```gradle android { compileSdkVersion 31 defaultConfig { minSdkVersion 16 targetSdkVersion 31 } } ``` 若升级至 Android Gradle 插件 8.x,则需使用 `compileSdkVersion 33` 或以上,并确保 `minSdkVersion` 小于或等于 `targetSdkVersion`。例如: ```gradle android { compileSdkVersion 34 defaultConfig { minSdkVersion 21 targetSdkVersion 34 } } ``` 此外,可在 `gradle.properties` 文件中添加以下配置,以抑制插件版本与 SDK 版本不兼容的警告: ```properties android.suppressUnsupportedCompileSdk=34 ``` 该配置适用于插件版本与 SDK 版本尚未完全匹配的情况,但最终仍需统一所有模块的 SDK 版本 。 ### 3.4 Unity 项目中 Firebase 的兼容性注意事项 若项目中使用 Firebase,需确保 `minSdkVersion` 不低于 21,以兼容 Firebase 的最低要求。同时,确保 `targetSdkVersion` 与插件版本支持的 SDK 版本一致,避免因版本冲突导致运行时崩溃或构建失败。例如: ```gradle defaultConfig { minSdkVersion 21 targetSdkVersion 34 } ``` Firebase 依赖项应使用最新版本,并确保其与当前 Android Gradle 插件版本兼容 。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值