compileSdkVersion、targetSdkVersion以及minSdkVersion三者关系

minSdkVersion: app运行要求的手机最低安卓版本。比如安卓手机版本是19(安卓4.4),minSdkVersion是21(安卓5.0)。那么编译出来的apk将无法安装到该手机上

compileSdkVersion :参与编译的sdk版本。比如想要使用安卓10的5g,需要将compileSdkVersion改为>=29(安卓10),否则无法在代码当中找到相关api

targetSdkVersion:目标版本,兼容旧版本的api。虽然由compileSdkVersion编译通过了,但是最终运行到手机上的运行效果(表现形式)由targetSdkVersion决定

targetSdkVersion详解

  • 何时生效?

targetSdkVersion>=xx(安卓手机系统版本)

比如新系统要用andriod6.0的动态权限,要想该部分api生效,那么目标版本targetSdkVersion也需要大于6.0。

  • 为何要引入targetSdkVersion?

    如果goole在高版本中修改了api,同一方法有了新的代码逻辑,执行该方法依照原来的条件会报错,那么如何避免呢?

    如果有个参数targetSdkVersion,大于执行新代码逻辑否则执行旧代码逻辑。可以想象下andirod里面sdk的伪代码:

if( getApplicationInfo().targetSdkVersion>26){//26为安卓版本号
    //新的API逻辑
}else {
    //旧的API逻辑
}

如果开发者要用新版本里的方法(需要对新版本api做适配),则更新targetSdkVerison,这样运行时就走新版本api的逻辑,如不需要则可用原targetSdkVerison。

  • 举例:

    app使用了透明的activity且固定了方向,在Android 8.0版本以下运行正常,当运行在Android 8.0/8.1系统上,直接crash。(Android 8.0/8.1 系统规定了透明的ativity 不能固定方向,否则抛出异常)。

    如果使用者,更新了手机系统,使用了8.0/8.1以上的,如何避免更新手机系统后app报错呢?

    通过引入目标版本targetSdkVersion来区分同一api在不同系统上的行为,如果目标版本大于8.0那么走新的逻辑,小于走原来逻辑。开发者要使用8.0/8.1该版本的新特性,就需要修改targetSdkVersion,并且做适配避免报错。

三者联系

  • compileSdkVersion>=targetSdkVersion>minSdkVersion
  • 最佳compileSdkVersion=targetSdkVersion>minSdkVersion

参考

https://www.jianshu.com/p/12e42558378a

apply plugin: 'com.android.application' android { compileSdkVersion 34 defaultConfig { applicationId "com.hik.netsdk.SimpleDemo" minSdkVersion 21 targetSdkVersion 34 versionCode 11 versionName "3.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true multiDexEnabled true ndk { abiFilters "armeabi-v7a","arm64-v8a" } configurations.all { resolutionStrategy { // 强制使用统一版本的 OkHttp force 'com.squareup.okhttp3:okhttp:4.9.1' // 解决可能的冲突 eachDependency { details -> if (details.requested.group == 'com.squareup.okhttp3') { details.useVersion '4.9.1' } } } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { res.srcDirs = [ 'src/main/res', 'src/main/res/layout/DevMgtUI', 'src/main/res/layout/BusinessUI' ] jniLibs.srcDirs = ['libs'] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } buildToolsVersion = '28.0.3' } dependencies { implementation files('libs/HCNetSDK.jar') // implementation files('libs/PlayerSDK_hcnetsdk.jar') implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' // 替代 design implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' // 替代 support-v4 testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'io.github.ezviz-open:ezviz-sdk:5.20' // implementation 'com.ezviz:sdk:4.19.5' implementation 'com.ezviz.sdk:ezuikit:2.2.1' // implementation files('libs/PlayerSDK.jar') implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation files('libs/ERTC_Android_SDK_1.5.0.1.aar') // 添加必要支持库 implementation 'com.google.code.gson:gson:2.8.5' // 海康SDK - 确保已添加 // implementation files('libs/hikvision-sdk.jar') implementation 'com.squareup.okhttp3:okhttp:4.9.1' implementation "androidx.media3:media3-exoplayer:1.3.1" implementation "androidx.media3:media3-exoplayer-hls:1.3.1" implementation "androidx.media3:media3-ui:1.3.1" implementation "androidx.media3:media3-datasource-okhttp:1.3.1" // 确保添加了基础库 implementation "androidx.media3:media3-common:1.3.1" }检查 build.gradle 文件,确认所有依赖项 移除不必要的 SDK 依赖(特别是旧版 Ezviz SDK)
06-23
要适配 Android 29 SDK(即 Android Q 或 Android 10),需要选择与之兼容的 Gradle 版本和 Android Gradle 插件(AGP)版本。通常,Android SDK 版本与 Gradle 及 AGP 的兼容性依赖于三者之间的版本匹配关系Android Gradle 插件(AGP)8.0.x 及以上版本开始支持 Android 13(SDK 33),而 Android 29(SDK 29)则在 AGP 3.5.x 到 5.0.x 范围内得到良好支持。对应的 Gradle 版本应为 5.4.1 到 6.7 之间,以确保兼容性和稳定性 [^1]。 具体推荐如下: - **Android Gradle 插件版本**:`5.0.1` 或 `3.5.4` - **Gradle 版本**:`5.6.4` 或 `6.1.1` - **SDK 版本**:`29` 在 `build.gradle` 项目的根级文件中,指定 AGP 插件版本: ```gradle buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:5.0.1' } } ``` 在 `gradle-wrapper.properties` 文件中指定 Gradle 版本: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip ``` 此外,在模块级 `build.gradle` 文件中设置 SDK 版本: ```gradle android { compileSdkVersion 29 defaultConfig { minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" } } ``` 如果使用的是较新版本的 Android Studio,可能需要通过设置中的 Gradle 配置选择本地已安装的低版本 Gradle 分发包,以避免版本不兼容问题 [^2]。 ### 相关问题 1. 如何配置 Gradle 以支持 Android 11(SDK 30)? 2. Android Gradle 插件版本与 Gradle 版本之间的兼容性如何确定? 3. 使用旧版 SDK 开发时为何会出现 Gradle 版本不兼容错误? 4. 如何手动下载并配置特定版本的 Gradle? 5. Android SDK 版本升级后,Gradle 和 AGP 应该如何调整?
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值