targetSdkVersion、compileSdkVersion、minSdkVersion作用与区别

本文详细解释了Android Studio中build.gradle文件内的minSdkVersion、compileSdkVersion和targetSdkVersion的含义及作用。minSdkVersion定义了应用运行的最低设备SDK版本;compileSdkVersion关联编译时API,允许使用新特性;targetSdkVersion确保应用兼容新系统行为。

Android Studio 新建一个工程后,build.gradle里会有targetSdkVersion、compileSdkVerson、minSdkVersion这几个字段,这些配置有啥意义呢?

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.gui.gui.custom.view"
        minSdkVersion 26
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

minSdkVersion:

指定app运行的最低设备sdk版本,如minSdkVersion=19 表示该app最低支持Android 4.4(API 19)设备,低于此版本的设备将不能使用该app。随着Android系统版本的持续更新,之前旧的系统版本占有率越来越低,我们可以根据需要将minSdkVersion值往后调整。

compileSdkVersion:

和编译时有关。比如我们当前compileSdkVersion=28(Andorid 9.0),Android 10 新增了有关5G的api。我们的app想尽早使用5G相关的api,这时只需要将compileSdkVersion=29(Android 10),就能在编译阶段编译通过。此外,还需要注意的是,由于这个5G api是新增的,因此需要判断当前系统版本>=29才能使用新api。

targetSdkVersion

直观翻译是“目标版本”,它的作用是兼容旧的api,怎么理解呢?那就看看这个字段用在哪些地方。举个例子,Android 8.0/8.1 系统规定了透明的activity 不能固定方向,否则抛出异常。我们暂时不管google设计的目的何在,先想想假设我们的app使用了透明的activity,且固定了方向,在Android 8.0版本以下运行正常,当我们运行在Android 8.0/8.1系统上,结果如何会如何呢?很不幸,直接crash。对于我们来说,这结果当然不能接受了,我一个好端端的app,你升级个Android 系统直接让我的app挂掉,没有转圜的余地,不科学啊。因此,google想出了一个办法,那就是通过targerVersion字段来区分同一api在不同系统上的行为。我们来看看源码:

Android 8.0 Activity onCreate

从上图可以看出:getApplicationInfo().targetSdkVersion取的值即是在build.gradle里设置的targetSdkVersion值,这里判断targetSdkVersion是否大于Android 8.0(O),如果成立才执行后续逻辑(透明且固定方向),进而抛出异常。在此我们知道,想让这段逻辑不成立,那么我们将targetSdkVersion设置为26(Android 8.0 对应26)以下,即使我们app运行在Andorid 8.0以上的设备,都不会出现问题。这样,我们的app不更新,但是新的Android SDK 里Activity onCreate方法变更了部分逻辑行为,通过targetSdkVersion限制,我们的app依然能够以旧的逻辑运行新的设备上,达到了兼容老版本api的目的。
google建议:

    /**
     * The minimum SDK version this application targets.  It may run on earlier
     * versions, but it knows how to work with any new behavior added at this
     * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
     * if this is a development build and the app is targeting that.  You should
     * compare that this number is >= the SDK version number at which your
     * behavior was introduced.
     */
    public int targetSdkVersion;

大致意思就是:当我们更新targetSdkVersion时,比如从26(Android 8.0)变更到29(Android 9.0),意味着我们对26~29之间的系统兼容性进行了充分的测试,因此每当我们变更targerSdkVersion时,要充分测试其系统兼容性。
也许你会说,那我可以不更新targetSdkVersion值嘛,一劳永逸,理论上没啥问题。但是,如果你想在新的系统上使用api新的行为,那么就需要更新targetSdkVersion。再者,google会对targetSdkVersion进行一些强关联,比如app上传到google play,必须要求targetSdkVersion>=26。

到这,也许你还会说,为啥Andorid 6.0(包含)以上动态权限不根据targetSdkVersion来适配呢?我们说的targetSdkVersion是向前兼容,兼容之前的app使用的同一api旧的行为逻辑,而动态权限是google在Android 6.0(包含)以上强制要求的,人家就不想给你转圜的余地,有啥办法呢?还是乖乖判断当前系统是否是Android 6.0及其以上的,再决定是否动态申请权限了。。

三者联系

compileSdkVersion>=targetSdkVersion>minSdkVersion

 

 

<think> 我们注意到用户的问题中提到了“compatibleSdkVersion”,但在标准的Android开发中,通常并没有这个术语。用户可能是将“minSdkVersion”误写为“compatibleSdkVersion”。因此,我们将按照标准的三个版本来解释:compileSdkVersionminSdkVersion(即用户所说的compatibleSdkVersion)targetSdkVersion。 下面我们将详细解释这三个概念: 1. **compileSdkVersion**(编译SDK版本): - 含义:指定Gradle编译应用时使用的Android SDK版本。它决定了你在编译时可以使用的API级别。 - 作用:它仅影响编译过程,不会改变应用在设备上的运行行为。使用较高的编译版本可以让你使用新版本的API,但你必须确保你的代码不会调用高于minSdkVersion的API(除非做运行时检查)。 - 建议:通常建议使用最新的Android SDK版本作为编译版本,以便使用最新的编译检查优化。 2. **minSdkVersion**(最低兼容SDK版本,即用户提到的compatibleSdkVersion): - 含义:指定应用可以运行的最低Android版本(API级别)。例如,minSdkVersion设置为19(对应Android 4.4)意味着应用不能在低于Android 4.4的设备上安装。 - 作用:它决定了应用可以兼容的最老设备。当你使用高于minSdkVersion的API时,需要做运行时检查(使用Build.VERSION.SDK_INT)或使用支持库(AndroidX)。 - 选择:需要根据目标用户群体使用的设备分布以及应用功能需求来权衡。设置过低可能无法使用新API,设置过高会丢失一部分用户。 3. **targetSdkVersion**(目标SDK版本): - 含义:指定应用设计时所针对的Android版本。它告诉系统,你的应用已经针对该版本进行了测试,系统不需要启用向前兼容的行为。 - 作用:每个新版本的Android都会引入一些行为变更(比如权限模式、后台限制等)。当应用运行在高于targetSdkVersion的系统上时,系统会启用这些行为变更;而运行在低于targetSdkVersion的系统上时,系统会保持旧版本的行为以保证兼容性。 - 建议:通常设置为最新的稳定版本(但不要超过compileSdkVersion),这样可以利用最新的系统优化。 关系不等式:$$ \text{minSdkVersion} \leq \text{targetSdkVersion} \leq \text{compileSdkVersion} $$ 下面是一个典型的build.gradle配置示例: ```groovy android { compileSdkVersion 34 // 使用Android 14 (UpsideDownCake)的SDK编译 defaultConfig { minSdkVersion 21 // 支持Android 5.0 (Lollipop)及以上 targetSdkVersion 34 // 针对Android 14进行适配 } } ``` 注意:在实际项目中,我们通常使用变量来定义这些版本号,以便统一管理。 引用说明:以上内容参考了Android官方文档[^1]。 --- §§相关问题§§ 1. 如何决定应用的最低兼容SDK版本(minSdkVersion)以达到市场覆盖设备能力的平衡? 2. 将targetSdkVersion升级到最新版本时,通常需要关注哪些重大行为变更? 3. 为什么建议将compileSdkVersion设置为最新版本? 4. 如果应用需要使用的某个API在minSdkVersion之上,应该如何处理? </think> 在 Android 开发中,`compileSdkVersion`、`minSdkVersion`(您提到的 `compatibleSdkVersion` 可能是笔误) `targetSdkVersion` 是构建配置文件中的核心参数,它们共同控制应用的编译、兼容性运行时行为: ### 1. `compileSdkVersion`(编译 SDK 版本) - **含义**:指定用于编译应用代码的 Android SDK 版本 - **作用**: - 决定编译时可用的 API 工具链(如 Java 11 特性) - 仅影响编译过程,不影响应用在设备上的运行行为 - 使用新版本可访问最新 API(如 Android 14 的预测返回手势) - **最佳实践**:始终使用最新稳定版(如 `34`),避免过时 API 警告[^1] ### 2. `minSdkVersion`(最低兼容 SDK 版本) - **含义**:应用支持的最低 Android 系统版本 - **作用**: - 低于此版本的设备无法安装应用(如设为 `21` 则排除 Android 4.4 以下设备) - 使用更高版本 API 时需添加 `@RequiresApi` 注解或运行时版本检查 - 直接影响应用的市场覆盖率 - **计算公式**:覆盖率比例 ≈ $ \frac{\text{活跃设备中 ≥ minSdkVersion 的设备数}}{\text{总活跃设备数}} \times 100\% $ ### 3. `targetSdkVersion`(目标 SDK 版本) - **含义**:应用设计所针对的 Android 操作系统版本 - **关键作用**: - 触发新版系统的行为变更(如 Android 13 的通知权限) - 控制向前兼容性(系统会模拟旧版行为) - 影响应用商店推荐算法系统优化策略 - **示例**:设 `targetSdkVersion 33` 时: - Android 13+ 设备:启用新后台限制 - Android 12 及以下:保持旧行为 ```groovy // 标准配置示例 (build.gradle) android { compileSdkVersion 34 // 使用最新 SDK 编译 defaultConfig { minSdkVersion 23 // 支持 Android 6.0+(占全球设备 95%+) targetSdkVersion 34 // 适配 Android 14 新特性 } } ``` ### 三者关系 必须满足版本链式约束: $$ \text{minSdkVersion} \leq \text{targetSdkVersion} \leq \text{compileSdkVersion} $$ | 参数 | 影响阶段 | 设备影响 | 开发影响 | |---------------------|------------|--------------------------|--------------------------| | `compileSdkVersion` | 编译时 | 无 | 决定 API 可用性语法检查 | | `minSdkVersion` | 安装时 | 过滤不兼容设备 | 需处理 API 版本兼容逻辑 | | `targetSdkVersion` | 运行时 | 控制系统行为变更 | 需测试新版系统适配性 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值