前几天 Google 官方发布文章解析 compileSdkVersion、minSdkVersion 以及 targetSdkVersion 的含义,以及合理设置各个值的意义,原文 Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion(后面简称 “原文”),还有翻译版。

其中,compileSdkVersion 和 minSdkVersion 都非常好理解,前者表示编译的 SDK 版本,后者表示应用兼容的最低 SDK 版本。但是对于 targetSdkVersion 其实很难一句话解析清楚,原文用了“万能”的词 ―― interesting 来描述。以前我也有一些迷糊,看到有些人和我有同样的困惑,本文试图彻底解决这个问题。

原文是这么说的:

targetSdkVersion is the main way Android provides forward compatibility

targetSdkVersion 是 Android 系统提供前向兼容的主要手段。这是什么意思呢?随着 Android 系统的升级,某个系统的 API 或者模块的行为可能会发生改变,但是为了保证老 APK 的行为还是和以前兼容。只要 APK 的 targetSdkVersion 不变,即使这个 APK 安装在新 Android 系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的前向兼容性。

这里还是用原文的例子,在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和setRepeat() 这两个 API 的行为发生了变化。在 Android 4.4 以前,这两个 API 设置的都是精确的时间,系统能保证在 API 设置的时间点上唤醒 Alarm。因为省电原因 Android 4.4 系统实现了 AlarmManager 的对齐唤醒,这两个 API 设置唤醒的时间,系统都对待成不精确的时间,系统只能保证在你设置的时间点之后某个时间唤醒。

这时,虽然 API 没有任何变化,但是实际上 API 的行为却发生了变化,如果老的 APK 中使用了此 API,并且在应用中的行为非常依赖 AlarmManager 在精确的时间唤醒,例如闹钟应用。如果 Android 系统不能保证兼容,老的 APK 安装在新的系统上,就会出现问题。

Android 系统是怎么保证这种兼容性的呢?这时候 targetSdkVersion 就起作用了。APK 在调用系统 AlarmManager 的 set() 或者 setRepeat() 的时候,系统首先会查一下调用的 APK 的 targetSdkVersion 信息,如果小于 19,就还是按照老的行为,即精确设置唤醒时间,否者执行新的行为。

我们来看一下 Android 4.4 上 AlarmManger 的一部分源代码:

private final boolean mAlwaysExact;

AlarmManager(IAlarmManager service, Context ctx) {

mService = service;

final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;

mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT);

}

看到这里,首选获取应用的 targetSdkVersion,判断是否是小于 Build.VERSION_CODES.KITKAT (即 API Level 19),来设置 mAlwaysExact 变量,表示是否使用精确时间模式。

public static final long WINDOW_EXACT = 0;

public static final long WINDOW_HEURISTIC = -1;

private long legacyExactLength() {

return (mAlwaysExact ? WINDOW_EXACT : WINDOW_HEURISTIC);

}

public void set(int type, long triggerAtMillis, PendingIntent operation) {

setImpl(type, triggerAtMillis, legacyExactLength(), 0, operation, null);

}

这里看到,直接影响到 set() 方法给 setImpl() 传入不同的参数,从而影响到了 set() 的执行行为。具体的实现在 AlarmManagerService.java,这里就不往下深究了。

看到这里,发现其实 Android 的 targetSdkVersion 并没有什么特别的,系统使用它也非常直接,甚至很“粗糙”。仅仅是用过下面的 API 来获取 targetSdkVersion,来判断是否执行哪种行为:

getApplicationInfo().targetSdkVersion;

所以,我们可以猜测到,如果 Android 系统升级,发生这种兼容行为的变化时,一般都会在原来的保存新旧两种逻辑,并通过 if-else 方法来判断执行哪种逻辑。果然,在源码中搜索,我们会发现不少类似 getApplicationInfo().targetSdkVersion < Buid.XXXX 这样的代码,相对于浩瀚的 Android 源码量来说,这些还是相对较少了。其实原则上,这种会导致兼容性问题的修改还是越少越好,所以每次发布新的 Android 版本的时候,Android 开发者网站都会列出做了哪些改变,在这里,开发者需要特别注意。

最后,我们也可以理解原文中说的那句话的含义,明白了为什么修改了 APK 的 targetSdkVersion 行为会发生变化,也明白了为什么修改 targetSdkVersion 需要做完整的测试了。

出处:http://www.open-open.com/lib/view/open1453252891870.html

转载于:https://blog.51cto.com/xuguohongai/1852347

targetSdkVersion相关推荐

  1. 如何设置minSdkVersion和targetSdkVersion

    转http://www.07net01.com/2015/07/878098.html minSdkversion和targetSdkVersion相信很多人都不太理解,我在网上也看了许多关于这两者区 ...

  2. compileSdkVersion,minSdkVersion,targetSdkVersion还有buildToolsVersion的区别

    compileSdkVersion指的是你当前android sdk的版本 minSdkVersion指的是应用最低兼容的android sdk版本 targetSdkVersion指的是应用向前兼容 ...

  3. Android targetSdkVersion 原理

    前几天 Google 官方发布文章解析 compileSdkVersion.minSdkVersion 以及 targetSdkVersion 的含义,以及合理设置各个值的意义,原文 Picking ...

  4. Android targetSdkVersion详解

    Android targetSdkVersion 原理 17 January 2016 前几天 Google 官方发布文章解析 compileSdkVersion.minSdkVersion 以及 t ...

  5. Android中minSdkVersion、targetSdkVersion、maxSdkVersion的作用

    转载自:Android中minSdkVersion.targetSdkVersion.maxSdkVersion的作用 - 谁与争锋的专栏 - 博客频道 - CSDN.NET  http://blog ...

  6. Android 面试 - compileSdkVersion、minSdkVersion、targetSdkVersion、buildToolsVersion

    在Android的module级build.gradle里,有着为数不少的Version,其中最重要的有以下几个:compileSdkVersion.buildToolsVersion.minSdkV ...

  7. Android --- build.gradle(Module:app)中各版本号讲解,例如targetSdkVersion

    文章目录 一.minSdkVersion 二.compileSdkVersion 三.targetSdkVersion 四.Gradle和SDK版本 先抛出一个问题: 我们的应用开发的时候androi ...

  8. minSdkVersion = targetSdkVersion = compileSdkVersion

    minSdkVersion <= targetSdkVersion <= compileSdkVersion 理想情况 minSdkVersion (lowest possible) &l ...

  9. Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

    Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 本文参考了谷歌开发者文档:http://developer. ...

最新文章

  1. 7 个小仙女花3年时间写了一本1200页的机器学习算法手册(限时开放下载)
  2. 订单表的分库分表方案设计(大数据)
  3. MFC List Control 控件添加单元格编辑,实现可编辑重写
  4. World Final 2012
  5. boost::mpl模块实现count相关的测试程序
  6. 遥感技术在水利行业中的应用
  7. CentOS7.9下实战安装MySQL5.7
  8. python循环嵌套例题_python练习题:循环打印嵌套列表
  9. 提供计算机网络通信功能,在计算机网络中,通信子网的主要作用是___ 答案:提供计算机网络的通信功能...
  10. python编程简易计算器_Python编程练习049:简单计算器实现
  11. Java 两个中文字符串异或问题
  12. 在外部凋用Class中的private函数
  13. K11718 My Cow Ate My Homework[USACO-2017-Dec-S]
  14. matlab中abs()函数
  15. mysql强化练习_MySQL数据库 - 50道SQL强化练习题
  16. 如何关闭苹果笔记本win8系统下的触摸板
  17. 【破解利器】调试工具篇(Debuggers)
  18. office__让word记录并显示修改标记及接受(去除)修改标记
  19. 我的电磁学讲义13:电磁感应定律
  20. 80后看了会哭的组图

热门文章

  1. CSDN中Markdown编辑器的数学公式编写(非常详细!)
  2. 导入python自带的一系列数据集等操作
  3. 数据库设计范式1NF-5NF白话总结
  4. Vue 中 computed ,watch,methods 的异同
  5. Python中’__main__’模块的作用
  6. 开源播放器 ijkplayer (四) :Ijkplayer切换网络时停止播放的问题处理
  7. 洛谷模拟赛 部落冲突
  8. 暴雪战斗公式——除法公式的精髓
  9. C语言中的sizeof中的数组和指针
  10. 在main()之前,IAR都做了啥?