minSdkVersion、compileSdkVersion、targetSdkVersion

2024-05-12 09:08

本文主要是介绍minSdkVersion、compileSdkVersion、targetSdkVersion,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • minSdkVersion
  • compileSdkVersion
  • targetSdkVersion

我们在创建App的时候经常会设置这几个参数

android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "com.szy.yishopcustomer"minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}
}

平时这些参数都是自动设置的,我们只需设置 minSdkVersion,即最低SDK版本,然后 compileSdkVersion 和 targetSdkVersion 可能是一致的,具体这几个值是什么意思?下面分别来说一下

minSdkVersion

最好理解的就是 minSdkVersion 了,就是我们的 app 能够运行的最小版本,如果选择16,那么就是 Android 4.1 以及以上的设备才能运行我们app,如果小于这个版本,那么抱歉运行不了,我们不支持。这是应用程序支持 api 的下限。这也是应用商店判断这个应用是否能运行在设备上的一个依据之一

在开发中也会根据这个下限去判断,是否可以用某个 api 方法,如果是下限之下的那么就会有警告,避免调用一些在新的版本已经改变或者过时的方法

当我们引用了第三方的库,如果某几个库的 minSdkVersion 分别是 API5,API10,API16 的方法,那么我们的minSdkVersion最少就是16

对于 minSdkVersion 的选择,我们应该看各个api的占比,不过因为基数太大了(十几亿)所以就算是 0.7% 也是个天文数字,所以我们需要根据自己应用的受众,以及是否需要适配低版本的需要,一般说来我们适配 4.1 以上,即 minSdkVersion=16,不过还要根据自己的实际情况,去选择相应的版本号

compileSdkVersion

compileSdkVersion 是我们告诉 Gradle,我们是用哪一版本的 Android Sdk 去编译程序的,可以使用这个版本的 API,比如我们使用的是 7.0 的版本,compileSdkVersion = 24,那么我们对于拍照裁剪图片等功能的操作,就可以使用FileProvider了

我们需要注意的是:我们改变 compileSdkVersion 的版本号,本质上改变不了我们程序的运行,虽然可能会报错误❌或者警告⚠️,但 compileSdkVersion 只会在编译期间起作用,因为环境是 compileSdkVersion 这个版本的SDK,所以你可以用一些这个版本的API,但是只是 IDE 给你的便利性帮助而已,帮助你检测代码,避免使用一些弃用的API。就算你用个低版本的 compileSdkVersion,你依然可以那么写,但是可能会报错,报警告,但是你强制打包,其实也是没有问题的。IDE 只是个工具,他的环境也只是工具的环境,不代表你应用运行时的表现

所以希望大家用最新的 sdk 版本作为开发环境,compileSdkVersion 设置成最新的,这样我们可以使用到最新 SDK 的 API 方法和机制

如果我们使用了比如V4,V7包,有没有发现必须和 compileSdkVersion 的版本相匹配,比如我们 compileSdkVersion = 26,那么V4,v7的版本也要相应的是26.xx.xx,首位的 26 必须一致,后两位没有要求,就是说明编译所依赖的 SDK 和依赖包必须是统一版本,不然两个不兼容,编译会通不过。同时也是为了使用该版本的新特性

targetSdkVersion

看到 targetSdkVersion 我们满满的疑问

  • 什么是目标设备SDK版本?
  • 是和minSdkVersion相对应的上限吗?
  • 如果我运行在比targetSdkVersion高的设备上,会出现什么?
  • 如果是比targetSdkVersion低的设备呢?

首先 targetSdkVersion 是 android 向前兼容的主要方式,怎么说呢?官方是这样说的:

除非更新 targetSdkVersion,否则不改变应用的行为。 这允许您在处理行为更改之前使用新的API(如您更新过的compileSdkVersion)

简单的说就是你的应用已经针对这个版本的手机,做了充分的兼容性处理和测试性处理,比如

if(Build.VERSION.SDK_INT >= 23) { ... } 

这样针对不同的SDK版本做不同的处理,这就说明我们不能随便的改变 targetSdkVersion 的值,我们必须做好充足的兼容性处理和测试处理才行

第一个问题:

在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和 setRepeat() 这两个 API 的行为发生了变化。在 Android 4.4 以前,这两个 API 设置的都是精确的时间,系统能保证在 API 设置的时间点上唤醒 Alarm。因为省电原因 Android 4.4 系统实现了 AlarmManager 的对齐唤醒,这两个 API 设置唤醒的时间,系统都对待成不精确的时间,系统只能保证在你设置的时间点之后某个时间唤醒。虽然api的名字没有改变,但是功能结果已经发生改变,我们设置 targetSdkVersion 为16,Android4.4之前。那么我们在Android4.4之后运行会出现什么呢?难道就不能用了吗?不准确了吗?
当然不是,系统通过 targetSdkVersion 来保证 Android 的向前兼容性,在 Android4.4 之后的设备上,系统会判断你的 targetSdkVersion 是否小于19,如果小于的话,那就按照 19 之前的api 方法,如果大于等于19,那么就按照之后的 api 方法来走,保证了程序运行的一致性。也就是向前兼容性

targetSdkVersion 的大部分更新变化都会记录在VERSION_CODES,所有的细节也会在每个版本的平台亮点写明

targetSdkVersion 保证的是 api 的一致性
所以一般 minSdkVersion < targetSdkVersion <= compileSdkVersion
不随意更改 targetSdkVersion,更改 targetSdkVersion 必须做好兼容。

够用到 targetSDK 中最新的 API 和最酷的新功能,但你又不得不向下兼容到 minSDK ,保证这个区间内的设备都能够正常的执行你的 app 。换句话说,你想使用 Android 刚刚推出的新特性。但这对于你的 app 又不是必须的。你就能够将 targetSDK 设置为你想使用新特性的 SDK 版本号,minSDK 设置成低版本号保证全部人都能够使用你的app

举个栗子:假如你想给你的 app 增加大量的手势操作(sdk 7才引入的),然而这些手势操作能够被 Button 或 menu 等取代,在这样的情况下,手势操作就是一个额外的加分功能,而不是一个必须的功能,因此你就须要把 targetSDK 设置为7,把minSDK设置为3(这是举个栗子,如今没人还在用这么老的设备了)这样即使是使用老设备的用户也能够用你的 app 了

然后你所要做的就是要在代码里推断版本号,假设是大于等于 7 的版本号中就使用手势操作,小于 7 的版本号中就使用 button 等取代,这样使用了新手机的用户就能够体验到你 app 中酷炫的新功能了

这篇关于minSdkVersion、compileSdkVersion、targetSdkVersion的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982197

相关文章

有关minSdkVersion和targetSdkVersion

只要手机当前版本满足minSdk都可以进行安装,假设4.4手机安装5.0targetSdk的apk,依然可以进行安装只是没有一些5.0效果,如果不做兼容性判断处理会导致报错,v4包就有部分向下兼容的控件。比如4.4和以上的侵入式状态栏写法不一样,就需要判断版本。 1举一个例子:假如你想给你的app加入大量的手势操作(sdk 7才引入的),然而这些手势操作可以被Button啊或menu等代替,

Android:compileSdkVersion、buildToolsVersion、minSdkVersion与targetSdkVersion

亲测可用,若有疑问请私信 Android开发常用的几种 Version compileSdkVersionbuildToolsVersionminSdkVersiontargetSdkVersion 下面一一详细介绍这些 Version 所代表的意义 compileSdkVersion 顾名思义,就是用来编译源代码所使用的 API 版本。也就是说在写代码的时候,所引入的 android.

Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 7

所有关于这个问题的解决中,依然是android论坛是比较完美的  http://code.google.com/p/android/issues/detail?id=39752 文中提及几种方案 1.   修改 add-application.mk, 注释掉报错的脚本,很黄很暴力 2.   修改 add-application.mk,强制设置    APP_PLATFORM := andr

关于APP_PLATFORM android:minSdkVersion android:targetSdkVersion

https://stackoverflow.com/questions/21888052/what-is-the-relation-between-app-platform-androidminsdkversion-and-androidtar/41079462#41079462 简而言之,APP_PLATFORM 跟android:minSdkVersion 一致就好,google在ndk层不

Android TargetSdkVersion 30 安装失败 resources.arsc 需要对齐且不压缩。

公司项目,之前targetSDKVersion一直是29,近期小米平台上架强制要求升到30,但是这个版本在android12上安装失败,我用adb命令安装,报错如下图 adb: failed to install c: Program Files (x86)(0A_knight\MorkSpace \HomeStead_Codinglappapp_def\release\app-ap_def

targetSdkVersion=29权限问题

targetSdkVersion=28,29时产生的权限问题 现象处理方案 现象 升级as版本后,没注意build文件里面targetSdkVersion的变化(29),当时在测试机测试一切正常,但正式上线后发现在部分机型(华为荣耀20、华为mate30pro)上,会出现读写sd卡授权弹窗正常且授权后,读写sd卡时依旧会 Permission denied的问题。 处理方案

targetSdkVersion > 30 如何将下载的网络视频 保存到手机相册里更新

在 targetSdkVersion 31 中,将下载的网络视频保存到手机相册中涉及几个关键步骤。由于 Android 12(API 级别 31)引入了更多的隐私和安全限制,特别是作用域存储(Scoped Storage),因此你需要遵循这些限制来保存文件。 以下是将下载的网络视频保存到手机相册的步骤: 请求必要的权限: 对于网络下载,你可能需要 INTERNET 权限。对于保存到外部存储,你

Android compileSdkVersion 23 导致apache网络库HttpClient过期问题

博主最近在升级项目compileSdkVersion的时候遇到了一个尴尬的问题: 当compileSdkVersion设置为23后,即就是android6.0版本更新以后,Android就不再提供org.apache.http.*包了,而是改为使用HttpUrlConnection了 然后博主所在的项目比较旧,并不能轻易从apache网络库(即HttpClient)切换至HttpUrlConn

Android Studio | 修改CompileSDKVersion | 修改targetSdkVersion

方法一 路径:File/Project Structure 修改为目标版本即可 方法二 在build.gradle中修改

关于 targetSdkVersion=23 底层动态库报错: has text relocations

从 API 23 开始,共享对象将不得包含文本重定位。也就是说,代码必须按原样加载,不得对其进行修改。 问题就是:当android studio的targetSdkVersion = 23时,之前能用的动态库在代用的时候会报错,错误信息包含has text relocations .... 官方给出的解决方案:wiki.gentoo.org/wiki/Hardened/Textrels_Gui