向后兼容和向前兼容的概念
向后兼容(Backwards compatibility):较高版本的程序能够处理较低版本程序产生的数据。
- 比如word2007版本的word软件可以打开word2003创建的文件。
- windows也是一个系统软件,在这个平台上开发的程序,就相当于是程序产生的数据,比如说window7上可以正常运行在window xp上开发的大部分程序。
向前兼容(Forwards Compatibility):比较老、比较低的版本的程序可以处理较高版本程序产生的数据。
- 例如 word 2003版本可以在转换器的帮助下打开word2007版本创建的doc文档。
相对性的关系
- backward和forward,可以大致理解成新和旧。而新旧是相对的,一个旧软件不能跑在新硬件上,既可以说是这个软件不向前兼容硬件,也可以说是这个硬件不向后兼容软件。
- 再如软件和协议的兼容,新软件不兼容旧协议,既可说是软件不向后兼容协议,也可以说协议不向前兼容软件。 所以搞清楚是什么对什么的兼容性,谁在前面,谁在后面,就能区分向前向后了。
- 所以碰到兼容性的概念的问题时,是可以从新旧两个方向去考虑。
Android 中的兼容性
Android的系统版本(比如 8.0、7.0、6.0、5.0、4.x等)与运行在其上的App就存在相对的关系。下面是针对App而言的兼容性
- 向后兼容:
比如很多app是支持到比较低的版本:2.3,4.x等,可以运行在低于targetSdk的系统上。这个是通过在开发中设置minSdk ,supportlibray,运行时版本的判断等来实现的。app具有了向后兼容的性质,也可以说Android系统具有了向前兼容性。
android 向后兼容很多情况是通过支持库(support library)来实现的。比如appcompat-v4、appcompat-v7使得低版本手机可以支持Material Design。
支持库的原理是这样的,如果应用调用其中一个支持类的方法,则支持库的行为将取决于运行应用的 Android 版本。如果框架提供必要的功能,则支持库将通过调用框架执行任务。如果应用在旧版本的 Android 上运行,且框架未显示所需的功能,则支持库自身可能会尝试提供功能或什么都不做。无论是哪一种情形,应用通常都不需要检查其在哪一版本的 Android 上运行,而是通过支持库执行检查并选择适当的行为。通常情况下,名称以 …Compat(如 ActivityCompat)结束的类即是如此。
- 对app 的向前兼容
比如说应用商店的很多app,targetSdk是低于android7.0,但是还是可以正常安装到android 7.0的设备上,似乎是app自动具有了向前兼容性,而系统具有向后兼容性。
那这就要说targetSdk这个参数的作用了,如果实际运行的android版本号高于targetSdkVersion,那么手机会按照targetSdkVersion设置的版本号来运行。当实际android版本号不高于targetSdkVersion时按照实际的手机版本号运行apk。
比如说在新版上android N删除了一些方法或者更改了一些方法的签名,App的targetSdkVersion 是android M,那么在运行到android N上也不会报出错误,因为是采用targetSdkversion的版本来跑的,这样调用的方法也是没有变化的,还是采用的Android M中的代码。那这个就带来一个问题,是Android系统需要做更多的兼容性代码,系统会越来越膨胀。
这个作用机制还有一层含义是: 如果targetversion 低于android N,那么也不可以采用android N新的方法和特性。
个人的总结,如果有错误或者补充,欢迎指出。
参考资料
http://blog.csdn.net/Yoryky/article/details/78016970
https://baike.baidu.com/item/%E5%90%91%E5%89%8D%E5%85%BC%E5%AE%B9
https://baike.baidu.com/item/%E5%90%91%E5%90%8E%E5%85%BC%E5%AE%B9
https://www.zhihu.com/question/47239021
https://blog.csdn.net/qq_23062979/article/details/81294550
https://bxbxbai.github.io/2016/05/27/android-runtime-permission/