AndroidVersionAdapter: 安卓版本适配全套指南
Android 版本适配全套指南
- 项目地址:Github、码云
- 当我在做 Android 版本适配工作的时候很痛苦,那个时候我在想有没有一个文档,将所有的关于 Android 版本适配资料全部收集起来,这样就不需要在网上东找西找了,这样就能把时间和精力投入适配工作中,每当一个新的 Android 版本发布的时候,这个想法越加强烈,终于在 Android 11 刚发布的时候筹划了这件事情,最终赶在 Android 12 刚发布的时候完成了,整个过程耗时非常漫长,因为我正在不断收集优质的资料,同时我也在不断思考,什么样的适配文档才是大家所需要的,我将适配文档简单划分成了以下几部分:
- 官方文档
- 新特性
- 行为变更
- 相关资源
- 适配文章链接
- 适配框架链接
- 为什么要把这个做成开源项目?因为我会不断更新,同时欢迎大家如果有好的文章也可以通过 issue 推荐给我,我审核通过之后会放上去,做好一个开源项目需要大家的添砖加瓦,开源是一个互帮互助的过程,没有大家的支持我很难做好它。
适配流程
- 这里以适配
Android 12
为例子,第一步将主模块中的build.gradle
文件中修改targetSdkVersion
和compileSdkVersion
这两个的值
android {
compileSdkVersion 31
defaultConfig {
targetSdkVersion 31
}
}
- 接下来在代码中做一些版本的判断,并且做好新版本的适配和旧版本的兼容
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
......
} else {
......
}
- 到这里,大家可能有一个疑问,targetSdkVersion 和 compileSdkVersion 有啥区别?
- targetSdkVersion:目标适配版本,告知系统 App 适配的情况,如果应用的 targetSdkVersion 比系统版本要低,那么在一些新特性上新系统会做向下兼容性处理,如果我们想要适配某个 Android 版本,必须要将 targetSdkVersion 调整到这个版本等级之上,否则在某些机型上面可能会出现一些适配异常的情况。如果我们只是简单调高了 targetSdkVersion 等级而没有适配新版本的特性,那么应用在新系统上可能会出现功能异常的情况,一般情况表现为应用崩溃或者获取不到数据。
- compileSdkVersion:编译源码版本,我们可以通过修改这个版本等级来改变我们在代码中所看到的 Android SDK 源码的版本,同时也决定了编译器在进行代码检查时所用的版本。
- 最后附上一张 Android 版本信息对应表
Android 版本 | API 等级 | 版本代号 | 发布时间 |
Android 12L | 32 | S_V2 | 预计 2022 年 3 月 |
Android 12 | 31 | S | 2021 年 10 月 4 日 |
Android 11 | 30 | R | 2020 年 9 月 9 日 |
Android 10 | 29 | Q | 2019 年 9 月 3 日 |
Android 9.0 | 28 | P | 2018 年 8 月 7 日 |
Android 8.1 | 27 | O_MR1 | 2017 年 12 月 5 日 |
Android 8.0 | 26 | O | 2017 年 8 月 22 日 |
Android 7.1 | 25 | N_MR1 | 2016 年 12 月 5 日 |
Android 7.0 | 24 | N | 2016 年 8 月 22 日 |
Android 6.0 | 23 | M | 2015 年 9 月 29 日 |
Android 5.1 | 22 | LOLLIPOP_MR1 | 2015 年 3 月 10 日 |
Android 5.0 | 21 | LOLLIPOP | 2014 年 10 月 15 日 |
Android 4.4 | 19 | KITKAT | 2013 年 10 月 31 日 |
文档目录
- Android 12.0 / 12L
- Android 11.0
- Android 10.0
- Android 9.0
- Android 8.0 / 8.1
- Android 7.0 / 7.1.1
- Android 6.0
- Android 5.0 / 5.1
- Android 4.4
Android 12.0 / 12L
新特性
- Material You
- 微件改进
- 富媒体内容插入
- 应用启动画面 API
- 圆角 API
- 富触感反馈体验
- AppSearch
- 游戏模式
- 画中画 (PiP) 改进
- 允许按来电重要性排名的新通话通知
- 通知的丰富图片支持
- 沉浸模式下的手势导航改进
- 近期网址共享(仅限 Pixel)
- 隐私信息中心
- 蓝牙权限
- 权限组查找
- 隐藏应用叠加窗口
- 已知签名者权限保护标志
- 设备属性认证
- 安全锁定屏幕通知操作
- BiometricPrompt 的可本地化字符串
- 即时通讯应用中的钓鱼式攻击检测功能(仅限 Pixel)
行为变更
相关资源
- Android 12 正式发布 | 开发者们的全新舞台
- Android 12 适配简介
- OPPO 开放平台 - Android 12 应用兼容性适配指导
- Android 12 快速适配要点
- 更新您的 widget 以适配 Android 12
- Android 12 上全新的应用启动画面,还不适配一下?
- SplashScreen:为全新的应用启动效果赋能
- Android 12 SplashScreen API 快速入门
- Jetpack SplashScreen API 在所有 Android 系统上使用总结,内含原理分析
- 深度探讨如何使用 Jetpack SplashScreen 重塑应用启动画面
- Android 12 启动画面-SplashScreen
- Android 12 上焕然一新的小组件:美观、便捷和实用
- 别羡慕苹果的小部件了,安卓也有!
- Android 12 蓝牙权限适配方案
- Android 12 新特性 android:exported 属性
- The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
- 详解 Android 12L|更好地适配大屏幕设备
- 正式版 API 确定 | Android 12L Beta 1 发布
Android 11.0
概览
隐私权变更 | 受影响的应用 | 缓解策略 |
强制执行分区存储机制 以 Android 11 或更高版本为目标平台的应用始终会受分区存储行为的影响 | 以 Android 11 或更高版本为目标平台的应用,以及以 Android 10 为目标平台且未将 | 更新您的应用以使用分区存储 详细了解分区存储变更 |
单次授权 使用单次授权功能,用户可以授予对位置信息、麦克风和摄像头的临时访问权限 | 在 Android 11 或更高版本上运行且请求位置信息、麦克风或摄像头权限的应用 | 在尝试访问受某项权限保护的数据之前,检查您的应用是否具有该权限 遵循请求权限方面的最佳做法 |
自动重置权限 如果用户在 Android 11 或更高版本上几个月未与应用互动,系统会自动重置应用的敏感权限 | 以 Android 11 或更高版本为目标平台且在后台执行大部分工作的应用 | 要求用户阻止系统重置应用的权限 详细了解自动重置权限 |
后台位置信息访问权限 Android 11 更改了用户向应用授予后台位置信息权限的方式 | 以 Android 11 或更高版本为目标平台且需要在后台访问位置信息的应用 | 通过对权限请求方法的多次单独调用,逐步请求在前台(粗略或精确)和后台访问位置信息的权限。必要时,说明用户授予该权限所能得到的益处 详细了解 Android 11 中的在后台访问位置信息的权限 |
软件包可见性 Android 11 更改了应用查询同一设备上的其他已安装应用及与之互动的方式 | 以 Android 11 或更高版本为目标平台且与设备上的其他已安装应用交互的应用 | 将 |
前台服务 Android 11 更改了前台服务访问位置信息、摄像头和麦克风相关数据的方式 | 在 Android 11 或更高版本上运行且在前台服务中访问位置信息、摄像头或麦克风的应用 | 分别针对需要访问摄像头和麦克风的前台服务,声明 |
新特性
行为更变
相关资源
- Android 11 开发者手册
- 拖不得了,Android11真的要来了,最全适配实践指南奉上
- Android 11 变更及适配攻略
- OPPO 开放平台 - Android 11 应用兼容性适配指导
- Android 11 外部存储权限适配指南及方案
- 微信开放平台 - Android 11 系统策略更新
- Android 11 绕过反射限制
- Android 11 软件包可见性适配
- Android 11 特性调整:安装外部来源应用需要重启APP
- Android 11 无法在后台显示自定义样式 Toast 的适配方案
- 知乎回答:如何评价在 Android11 中,/Android/data 文件夹无法读写?
- Android 11 无 Root 访问 data 目录实现、Android 11 访问 data 目录、Android 11 解除 data 目录限制、Android 11 data 空白解决
Android 10.0
概览
隐私权变更 | 受影响的应用 | 缓解策略 |
分区存储 针对外部存储的过滤视图,可提供对特定于应用的文件和媒体集合的访问权限 | 访问和共享外部存储中的文件的应用 | 使用特定于应用的目录和媒体集合目录 了解详情 |
增强了用户对位置权限的控制力 仅限前台权限,可让用户更好地控制应用对设备位置信息的访问权限 | 在后台时请求访问用户位置信息的应用 | 确保在没有后台位置信息更新的情况下优雅降级 使用 Android 10 中引入的权限在后台获取位置信息 了解详情 |
系统执行后台 Activity 针对从后台启动 Activity 实施了限制 | 不需要用户互动就启动 Activity 的应用 | 使用通知触发的 Activity 了解详情 |
不可重置的硬件标识符 针对访问设备序列号和 IMEI 实施了限制 | 访问设备序列号或 IMEI 的应用 | 使用用户可以重置的标识符 了解详情 |
无线扫描权限 访问某些 WLAN、WLAN 感知和蓝牙扫描方法需要获得精确位置权限 | 使用 WLAN API 和蓝牙 API 的应用 | 针对相关使用场景请求 |
新特性
行为更变
- WLAN 直连广播
- WLAN 感知功能
- Go 设备上的 SYSTEM_ALERT_WINDOW
- 关于以旧版 Android 系统为目标平台的应用的警告
- 移除了 SHA-2 CBC 加密套件
- 应用使用情况
- HTTPS 连接变更
- ZIP 文件实用程序库变更
- 有关限制非 SDK 接口的更新
- 共享内存
- 移除了应用主目录的执行权限
- Android 运行时只接受系统生成的 OAT 文件
- 在 ART 中强制要求 AOT 正确性
- 针对全屏 Intent 的权限变更
- 支持可折叠设备
- java.io.FileChannel.map() 更改
相关资源
- Android 10 适配攻略
- 暂时停用分区存储
- Android 存储用例和最佳做法
- Android 10(Q)/11(R) 分区存储适配
- Android 10 分区存储适配
- Android 10 适配要点,作用域存储
- Android MediaStore Api 使用
- Android 深色模式适配原理分析
- Android 10 适配要点,深色主题
- Android 深色模式的项目应用
- Android 折叠屏适配攻略
Android 9.0
新特性
- 利用 Wi-Fi RTT 进行室内定位
- 显示屏缺口支持
- 通知
- 多摄像头支持和摄像头更新
- 适用于可绘制对象和位图的 ImageDecoder
- 动画
- HDR VP9 视频、HEIF 图像压缩和 Media API
- JobScheduler 中的流量费用敏感度
- Neural Networks API 1.1
- 自动填充框架
- 安全增强功能
- Android 备份
- 无障碍功能
- 旋转
- 文本
- 设备端系统跟踪
行为更变
- ICU 库更新
- Android Test 变更
- Java UTF 解码器
- 使用证书的主机名验证
- 网络地址查询可能会导致网络违规
- 套接字标记
- 报告的套接字中可用字节数
- 应用不再能访问 xt_qtaguid 文件夹中的文件
- 现在强制执行 FLAG_ACTIVITY_NEW_TASK 要求
- 屏幕旋转变更
- Apache HTTP 客户端弃用影响采用非标准 ClassLoader 的应用
- 枚举相机
相关资源
- Android 9.0 适配指南
- Android 刘海屏适配全攻略
- Android 9.0 系统新特性,对刘海屏设备进行适配
- Android 9.0/P WebView 多进程使用的问题
- 反射黑名单(根据包名划分)
- 反射黑名单(根据类名划分)
- 另一种绕过 Android P以上非公开API限制的办法
Android 8.0 / 8.1
新特性
- 通知
- 自动填充框架
- 画中画模式
- 可下载字体
- XML 中的字体
- 自动调整 TextView 的大小
- 自适应图标
- 颜色管理
- WebView API
- 固定快捷方式和小部件
- 最大屏幕纵横比
- 多显示器支持
- 统一的布局外边距和内边距
- 指针捕获
- 应用类别
- Android TV 启动器
- AnimatorSet
- 输入和导航
- Android Oreo(Go 版本)
- Neural Networks API
- 自动填充框架更新
- 通知
- EditText 更新
- 程序化安全浏览操作
- 视频缩略图提取器
- Shared memory API
- WallpaperColors API
- 指纹更新
- 加密更新
行为变更
- 后台执行限制
- Android 后台位置限制
- 应用快捷键
- 语言区域和国际化
- 提醒窗口
- 输入和导航
- 网页表单自动填充
- 无障碍功能
- 网络连接和 HTTP(S) 连接
- 蓝牙
- 无缝连接
- 安全性
- 隐私性
- 记录未捕获的异常
- 联系人提供程序使用情况统计方法的变更
- 集合的处理
- Android 企业版
相关资源
- Android 8.0 适配指北
- Android 通知栏微技巧,8.0 系统中通知栏的适配
- 创建和管理通知渠道
- Android 应用图标微技巧,8.0 系统中应用图标的适配
- 适配 Anddroid 8.0 多语言的解决方案
- Android 8.0 踩坑记录 - Only fullscreen opaque activities can request orientation
- Only fullscreen opaque activities can request orientation问题及解决方案
- Only fullscreen activities can request orientation 终极解决方法
Android 7.0 / 7.1.1
新特性
- 多窗口支持
- 通知增强功能
- 配置文件指导的 JIT/AOT 编译
- 快速的应用安装路径
- 随时随地低电耗模式
- 后台优化
- SurfaceView
- 流量节省程序
- Vulkan API
- Quick Settings Tile API
- 号码屏蔽
- 来电过滤
- 多语言区域支持,更多语言
- 新增的表情符号
- Android 中的 ICU4J API
- WebView
- 无障碍增强功能
- 直接启动
- 密钥认证
- 网络安全性配置
- 默认受信任的证书颁发机构
- APK signature scheme v2
- 作用域目录访问
- 键盘快捷键辅助工具
- Custom Pointer API
- Sustained Performance API
- VR 支持
- 打印服务增强
- FrameMetricsListener API
- 虚拟文件
行为变更
相关资源
- Android 7.0 脱坑指南
- Android 7.0 适配教程,心得
- Android 一起来看看 7.0 的新特性 FileProvider
- 官方文档 - FileProvider 类
- Toast 在 Android 7.1 崩溃排查及修复
- PopupWindow 在 Android N(7.0) 的兼容性问题
- Android 7.0 WebView 部分机型打不开
Android 6.0
新特性
- 指纹身份验证
- 确认凭据
- 应用链接
- 自动备份应用
- 直接共享
- 语音交互
- Assist API
- 可采用的存储设备
- 通知
- 蓝牙触控笔支持
- 改进的蓝牙低功耗扫描
- Hotspot 2.0 第 1 版支持
- 4K 显示模式
- 主题化 ColorStateList
- 音频功能
- 视频功能
- 相机功能
行为变更
- 运行时权限
- 低电耗模式和应用待机模式
- 取消支持 Apache HTTP 客户端
- BoringSSL
- 硬件标识符访问权
- 通知
- 音频管理器变更
- 文本选择
- 浏览器书签变更
- Android 密钥库变更
- WLAN 和网络连接变更
- 相机服务变更
- 运行时
- APK 验证
- USB 连接
- Android for Work 变更
相关资源
Android 5.0 / 5.1
新特性
行为变更
Android 4.4
新特性
行为变更
作者其他开源项目
- 安卓技术中台:AndroidProject
- 安卓技术中台 Kt 版:AndroidProject-Kotlin
- 权限框架:XXPermissions
- 吐司框架:ToastUtils
- 网络框架:EasyHttp
- 标题栏框架:TitleBar
- 悬浮窗框架:XToast
- Shape 框架:ShapeView
- 语种切换框架:MultiLanguages
- Gson 解析容错:GsonFactory
- 日志查看框架:Logcat
- Android 代码规范:AndroidCodeStandard
- Studio 精品插件:StudioPlugins
- 表情包大集合:EmojiPackage
- 省市区 Json 数据:ProvinceJson