Android各版本适配指南

Android各版本适配指南

名称 版本号 发行日期 API等级 安全性更新状态
Android 1.0 1.0 2008年9月23日 1 不支持
Android Petit Four 1.1 2009年2月9日 2 不支持
Android Cupcake 1.5 2009年4月27日 3 不支持
Android Donut[3] 1.6 2009年9月15日 4 不支持
Android Eclair[4] 2.0 – 2.1 2009年10月26日 5 – 7 不支持
Android Froyo[5] 2.2 – 2.2.3 2010年5月20日 8 不支持
Android Gingerbread[6] 2.3 – 2.3.7 2010年12月6日 9 – 10 不支持
Android Honeycomb[7] 3.0 – 3.2.6 2011年2月22日 11 – 13 不支持
Android Ice Cream Sandwich[8] 4.0 – 4.0.4 2011年10月18日 14 – 15 不支持
Android Jelly Bean[9] 4.1 – 4.3.1 2012年7月9日 16 – 18 不支持
Android KitKat[10] 4.4 – 4.4.4 2013年10月31日 19 – 20 不支持[11]
Android Lollipop[12] 5.0 – 5.1.1 2014年11月12日 21 – 22 不支持[13]
Android Marshmallow[14] 6.0 – 6.0.1 2015年10月5日 23 支持
Android Nougat[15] 7.0 – 7.1.2 2016年8月22日 24 – 25 支持
Android Oreo[16] 8.0 – 8.1 2017年8月21日 26 – 27 支持
Android Pie 9.0.0 2018年8月6日 28 支持
Android Q 未知 2019年3月13日 29 测试中

关于适配基本概念

targetSdkVersion解读

targetSdkVersion的属性值表示创建的Android项目使用哪个API版本

targetSdkVersion 有什么用

每个Android版本都会对应一个API数字,例如Android 7.0对应的是API 24,当手机的Android系统版本升级的时候,会出现两种情况:

  • 提供了新的接口。如果开发者想要在APP中使用Android 7.0提供的新功能,除了需要使用Android 7.0手机,还需要保证targetSdkVersion升级到至少24,从这个角度来说,升级 targetSdkVersion 的目的是为了使用新版本的功能。

  • 旧接口的行为发生了变化。为了保证旧的APK的行为还是和以前兼容,在源码当中,有许多类似于ctx.getApplicationInfo().targetSdkVersion的判断。因此只要APK的targetSdkVersion不变,即使这个APK安装在新的Android系统上,其行为也不会发生变化,从这个角度来说,targetSdkVersion 保证了系统对旧应用的向前兼容性。

compileSDKVersion解读

compileSDKVersion定义应用程序编译选择哪个Android SDK版本,通常设置为最新的API版本,它的属性值不会影响Android系统运行行为,仅仅是Android编译项目时其中的一项配置,不会打包到APK中,其目的是为了 在编译的时候检查代码的错误的警告,提示开发者修改和优化。

minSdkVersion

minSdkVersion定义应用支持安装的最低Android版本,这个数值有两个作用:

  • 告诉Google Play Store哪些Android版本的手机可以安装该APK。
  • 默认情况下,lint会对代码中的API调用做出提示,假如你调用的API是在minSdkVersion之后才提供的,那么它会告诉你,虽然可以编译通过,但是会在运行的时候抛出异常。

如果调用的API是在minSdkVersion之后才提供的,解决的方案有两种:

  • 运行时判断API Level,仅在足够高,有此方法的API Level系统中调用此方法。
    1
    2
    3
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //处理逻辑。
    }
  • 保证功能完整性,通过低版本的API实现功能。

Android 6.0 适配

  • 运行时权限

Android 7.0 适配

  • 应用间共享文件限制FileProvider
  • 系统广播删除
  • APK V2签名

Android 8.0 适配

  • 通知栏
  • 自定义icon-launcher图标
  • 后台执行限制
  • 允许安装未知来源应用
  • 悬浮窗
  • 桌面图标适配
  • 隐式广播
  • 网络连接和 HTTP(S) 连接
  • 权限

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

  • 透明窗口不允许锁定屏幕旋转

Android 9.0 适配

  • 明文流量的网络请求