AndroidVersionAdapter: 安卓版本适配全套指南
项目地址: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 新特性
用户体验
Material You
微件改进
富媒体内容插入
应用启动画面 API
圆角 API
富触感反馈体验
AppSearch
游戏模式
画中画 (PiP) 改进
允许按来电重要性排名的新通话通知
通知的丰富图片支持
沉浸模式下的手势导航改进
近期网址共享(仅限 Pixel)
安全和隐私设置
隐私信息中心
蓝牙权限
权限组查找
隐藏应用叠加窗口
已知签名者权限保护标志
设备属性认证
安全锁定屏幕通知操作
BiometricPrompt 的可本地化字符串
即时通讯应用中的钓鱼式攻击检测功能(仅限 Pixel)
媒体
兼容的媒体转码
性能等级
视频编码改进
音频焦点
MediaDrm 更新
相机
Camera2 供应商扩展
Quad Bayer 摄像头传感器支持
图形和图片
让应用能够直接访问 Tombstone 跟踪记录
AVIF 图片支持
更简单的模糊处理、颜色滤镜及其他效果
原生动画图片解码
连接性
使配套应用保持唤醒状态
配套设备管理器配置文件
带宽估测改进
Wi-Fi 感知 (NAN) 增强功能
并发点对点 + 互联网连接
为 NFC 付款启用屏幕关闭
存储
核心功能
自动更新应用
设备芯片组信息
核心 Java API 的更新
微件改进
企业版的新变化
Android 12L 功能和变更
针对大屏设备优化了操作系统
面向开发者:媒体投影的变化
强大直观的多任务处理功能
面向开发者:在分屏模式下测试应用
改善了兼容性体验
面向开发者:在兼容模式下检查应用
针对大屏设备的更多更新和资源
大屏设备上 Google Play 的变化
使用 Jetpack WindowManager 嵌入 activity
设备屏幕方向请求
让您的应用做好准备
要测试的内容
行为变更
针对所有应用的行为变更
用户体验
滚动效果
前台服务通知用户体验延迟
沉浸模式下的手势导航改进
网络 intent 解析
限制性应用待机模式存储分区
Display#getRealSize 和 getRealMetrics:废弃和沙盒
图形和图片
改进了刷新率切换
安全和隐私设置
麦克风和摄像头切换开关
麦克风和摄像头指示标志
应用无法关闭系统对话框
不受信任的触摸事件被屏蔽
权限软件包可见性
移除了 Bouncy Castle 实现
剪贴板访问通知
连接性
Passpoint 更新
更新后的非 SDK 接口限制
针对 targetSdkVersion 31+ 应用的行为变更
用户体验
画中画行为改进
自定义通知
Android App Links 验证的变更
隐私设置
大致位置
应用休眠
移动传感器有采样率限制
数据访问审核
WebView 中的现代 SameSite Cookie
ADB 备份限制
安全
更安全的组件导出
尽可能创建不可变的待处理 intent
不安全的 intent 启动
性能
前台服务启动限制
精确的闹钟权限
通知 trampoline 限制
备份和恢复
连接性
并发点对点 + 互联网连接
为 NFC 付款启用屏幕关闭
供应商库
供应商提供的原生共享库
更新后的非 SDK 限制
相关资源
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 或更高版本为目标平台的应用始终会受分区存储行为的影响 | 以 Android 11 或更高版本为目标平台的应用,以及以 Android 10 为目标平台且未将 requestLegacyExternalStorage 设为 true 以停用分区存储的应用 |
更新您的应用以使用分区存储 详细了解分区存储变更 |
单次授权 使用单次授权功能,用户可以授予对位置信息、麦克风和摄像头的临时访问权限 | 在 Android 11 或更高版本上运行且请求位置信息、麦克风或摄像头权限的应用 | 在尝试访问受某项权限保护的数据之前,检查您的应用是否具有该权限 遵循请求权限方面的最佳做法 |
自动重置权限 如果用户在 Android 11 或更高版本上几个月未与应用互动,系统会自动重置应用的敏感权限 | 以 Android 11 或更高版本为目标平台且在后台执行大部分工作的应用 | 要求用户阻止系统重置应用的权限 详细了解自动重置权限 |
后台位置信息访问权限 Android 11 更改了用户向应用授予后台位置信息权限的方式 | 以 Android 11 或更高版本为目标平台且需要在后台访问位置信息的应用 | 通过对权限请求方法的多次单独调用,逐步请求在前台(粗略或精确)和后台访问位置信息的权限。必要时,说明用户授予该权限所能得到的益处 详细了解 Android 11 中的在后台访问位置信息的权限 |
软件包可见性 Android 11 更改了应用查询同一设备上的其他已安装应用及与之互动的方式 | 以 Android 11 或更高版本为目标平台且与设备上的其他已安装应用交互的应用 | 将 元素添加到应用的清单 详细了解软件包可见性 |
前台服务 Android 11 更改了前台服务访问位置信息、摄像头和麦克风相关数据的方式 | 在 Android 11 或更高版本上运行且在前台服务中访问位置信息、摄像头或麦克风的应用 | 分别针对需要访问摄像头和麦克风的前台服务,声明 camera 和 microphone 前台服务类型。但请注意,应用在后台运行时启动的前台服务通常无法访问位置信息、摄像头或麦克风。 详细了解前台服务的变更 |
新特性
向您的应用添加 5G 功能
强制门户 API 支持
安全共享大型数据集
联系人与对话
消息框
控制外部设备
将自动填充功能与键盘集成
行为更变
针对所有应用的行为变更
隐私权
单次授权
权限对话框的可见性
数据访问审核
系统提醒窗口权限
永久 SIM 卡标识符
接触史通知
安全性
SSL 套接字默认情况下使用 Conscrypt SSL 引擎
Scudo Hardened Allocator
应用使用情况统计信息
针对 5G 的模拟器支持
性能和调试
JobScheduler API 调用限制调试
文件描述符排错程序 (fdsan)
非 SDK 接口限制
V1 版 Google 地图共享库已移除
与其他应用交互
分享内容 URI
针对 targetSdkVersion 30+ 应用的行为变更
隐私权
强制执行分区存储
自动重置权限
在后台访问位置信息的权限
软件包可见性
安全
堆指针标记
消息框的更新
网络连接
限制对 APN 数据库的读取访问
无障碍服务
在清单文件中声明与 TTS 引擎的交互
在元数据文件中声明“无障碍”按钮使用情况
相机
媒体 intent 操作需要系统默认相机
应用打包和安装
压缩的资源文件
现在需要 APK 签名方案 v2
Firebase
Firebase JobDispatcher 和 GCMNetworkManager
设备到设备文件传输
OnSharedPreferenceChangeListener 的回调变更
非 SDK 接口限制
相关资源
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 中引入的权限在后台获取位置信息 了解详情 |
系统执行后台 Activity 针对从后台启动 Activity 实施了限制 | 不需要用户互动就启动 Activity 的应用 | 使用通知触发的 Activity 了解详情 |
不可重置的硬件标识符 针对访问设备序列号和 IMEI 实施了限制 | 访问设备序列号或 IMEI 的应用 | 使用用户可以重置的标识符 了解详情 |
无线扫描权限 访问某些 WLAN、WLAN 感知和蓝牙扫描方法需要获得精确位置权限 | 使用 WLAN API 和蓝牙 API 的应用 | 针对相关使用场景请求 ACCESS_FINE_LOCATION 权限 了解详情 |
新特性
折叠屏
5G 网络
通知栏消息回复
深色主题
手势导航
设置面板
共享快捷方式
行为更变
针对所有应用的行为变更
限制非 SDK 接口
手势导航
NDK
共享对象不得包含文本重定位
Bionic 库和动态链接器路径变更
系统二进制文件/库会映射到只执行内存
安全
TLS 1.3 默认处于启用状态
TLS 不信任使用 SHA-1 签名的证书
KeyChain 行为变更和改进
其他 TLS 和加密更改
WLAN 直连广播
WLAN 感知功能
Go 设备上的 SYSTEM_ALERT_WINDOW
关于以旧版 Android 系统为目标平台的应用的警告
移除了 SHA-2 CBC 加密套件
应用使用情况
HTTPS 连接变更
ZIP 文件实用程序库变更
Inflater
ZipFile
ZipOutputStream
摄像头变更
电池用量跟踪
Android Beam 已弃用
针对 targetSdkVersion 29+ 应用的行为变更
有关限制非 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 折叠屏适配攻略
新特性
利用 Wi-Fi RTT 进行室内定位
显示屏缺口支持
通知
多摄像头支持和摄像头更新
适用于可绘制对象和位图的 ImageDecoder
动画
HDR VP9 视频、HEIF 图像压缩和 Media API
JobScheduler 中的流量费用敏感度
Neural Networks API 1.1
自动填充框架
安全增强功能
Android 备份
无障碍功能
旋转
文本
设备端系统跟踪
行为更变
针对所有应用的行为变更
电源管理
隐私权变更
对使用非 SDK 接口的限制
安全行为变更
设备安全性变更
ICU 库更新
Android Test 变更
Java UTF 解码器
使用证书的主机名验证
网络地址查询可能会导致网络违规
套接字标记
报告的套接字中可用字节数
应用不再能访问 xt_qtaguid 文件夹中的文件
现在强制执行 FLAG_ACTIVITY_NEW_TASK 要求
屏幕旋转变更
Apache HTTP 客户端弃用影响采用非标准 ClassLoader 的应用
枚举相机
针对 targetSdkVersion 28+ 应用的行为变更
前台服务
隐私权变更
框架安全性变更
网络连接变更
网络连接数据计数和多路径
Apache HTTP 客户端弃用
界面变更
视图焦点
CSS RGBA 十六进制值处理
文件的 MIME 类型嗅探:URI
文档滚动元素
来自已暂停应用的通知
相关资源
Android 9.0 适配指南
Android 刘海屏适配全攻略
Android 9.0 系统新特性,对刘海屏设备进行适配
Android 9.0/P WebView 多进程使用的问题
反射黑名单(根据包名划分)
反射黑名单(根据类名划分)
另一种绕过 Android P以上非公开API限制的办法
新特性
Android 8.0 新特性
用户体验
通知
自动填充框架
画中画模式
可下载字体
XML 中的字体
自动调整 TextView 的大小
自适应图标
颜色管理
WebView API
固定快捷方式和小部件
最大屏幕纵横比
多显示器支持
统一的布局外边距和内边距
指针捕获
应用类别
Android TV 启动器
AnimatorSet
输入和导航
系统
视图默认焦点
新的 StrictMode 检测程序
缓存数据
内容提供程序分页
内容刷新请求
JobScheduler 改进
自定义数据存储
findViewById 签名变更
媒体增强功能
VolumeShaper
音频焦点增强功能
媒体指标
MediaPlayer
音频录制器
音频播放控制
增强的媒体文件访问功能
连接
WLAN 感知
蓝牙
配套设备配对
共享
智能共享
智能文本选择
无障碍功能
无障碍功能按钮
独立的音量调整
指纹手势
字词级突出显示
标准化单端范围值
提示文本
连续的手势分派
安全性与隐私
权限
新的帐号访问和 Discovery API
Google Safe Browsing API
测试
仪器测试
用于测试的模拟 Intent
运行时和工具
平台优化
更新的 Java 支持
更新的 ICU4J Android Framework API
Android 企业版
Android 8.1 新特性
Android Oreo(Go 版本)
Neural Networks API
自动填充框架更新
通知
EditText 更新
程序化安全浏览操作
视频缩略图提取器
Shared memory API
WallpaperColors API
指纹更新
加密更新
行为变更
针对所有应用的行为变更
后台执行限制
Android 后台位置限制
应用快捷键
语言区域和国际化
提醒窗口
输入和导航
网页表单自动填充
无障碍功能
网络连接和 HTTP(S) 连接
蓝牙
无缝连接
安全性
隐私性
记录未捕获的异常
联系人提供程序使用情况统计方法的变更
集合的处理
Android 企业版
针对 targetSdkVersion 26+ 应用的行为变更
提醒窗口
内容变更通知
视图焦点
安全性
帐号访问和可检测性
隐私性
权限
媒体
原生库
集合的处理
类加载行为
相关资源
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 新特性
多窗口支持
通知增强功能
配置文件指导的 JIT/AOT 编译
快速的应用安装路径
随时随地低电耗模式
后台优化
SurfaceView
流量节省程序
Vulkan API
Quick Settings Tile API
号码屏蔽
来电过滤
多语言区域支持,更多语言
新增的表情符号
Android 中的 ICU4J API
WebView
Chrome 和 WebView 配合使用
多进程
Javascript 在页面加载之前运行
不安全起点上的地理定位
测试 WebView 测试版
OpenGL™ ES 3.2 API
Android TV 录制
Android for Work
工作资料安全性挑战
关闭工作
Always on VPN
自定义配置
无障碍增强功能
直接启动
密钥认证
网络安全性配置
默认受信任的证书颁发机构
APK signature scheme v2
作用域目录访问
键盘快捷键辅助工具
Custom Pointer API
Sustained Performance API
VR 支持
打印服务增强
FrameMetricsListener API
虚拟文件
Android 7.1 新特性
应用快捷方式
键盘支持图像
新的专业表情符号
增强的动态壁纸元数据
圆形图标资源
存储管理器意图
改进的 VR 线程调度
演示用户提示
运营商和呼叫应用程序的 API
可穿戴设备的新屏幕密度
行为变更
电池和内存
低电耗模式
后台优化
系统权限更改
在应用间共享文件
无障碍改进
屏幕缩放
设置向导中的视觉设置
NDK 应用链接至平台库
检查您的应用是否使用私有库
更新您的应用
Android for Work
注解保留
其他重要说明
相关资源
Android 7.0 脱坑指南
Android 7.0 适配教程,心得
Android 一起来看看 7.0 的新特性 FileProvider
官方文档 - FileProvider 类
Toast 在 Android 7.1 崩溃排查及修复
PopupWindow 在 Android N(7.0) 的兼容性问题
Android 7.0 WebView 部分机型打不开
新特性
指纹身份验证
确认凭据
应用链接
自动备份应用
直接共享
语音交互
Assist API
可采用的存储设备
通知
蓝牙触控笔支持
改进的蓝牙低功耗扫描
Hotspot 2.0 第 1 版支持
4K 显示模式
主题化 ColorStateList
音频功能
视频功能
相机功能
Flashlight API
Reprocessing API
Android for Work 功能
行为变更
运行时权限
低电耗模式和应用待机模式
取消支持 Apache HTTP 客户端
BoringSSL
硬件标识符访问权
通知
音频管理器变更
文本选择
浏览器书签变更
Android 密钥库变更
WLAN 和网络连接变更
相机服务变更
运行时
APK 验证
USB 连接
Android for Work 变更
相关资源
Android 6.0 运行权限解析
官方文档 - 请求应用权限
所有的 Android 权限清单
新特性
Android 5.0 新特性
用户界面
Material Design 支持
最近使用的应用屏幕中的并发文档和 Activity
WebView 更新
屏幕采集和共享
通知
锁定屏幕通知
通知元数据
图形
对 OpenGL ES 3.1 的支持
Android 扩展包
媒体
用于高级相机功能的 Camera API
音频回放
媒体回放控制
媒体浏览
存储
目录选择
无线和连接
多个网络连接
蓝牙低功耗
NFC 增强功能
Volta 项目
计划排定作业
电池使用开发者工具
工作场所和教育领域中的 Android
托管配置
设备所有者
固定屏幕
打印框架
将 PDF 渲染成位图
系统
应用使用情况统计信息
测试与辅助工具
测试与辅助工具改进
IME
更方便的输入语言切换
清单声明
可声明的必备功能
用户权限
Android 5.1 新特性
多 SIM 卡支持
已弃用的 HTTP 类
运营商服务
行为变更
Android Runtime (ART)
通知
Material Design 样式
声音和振动
锁定屏幕可见性
媒体播放
浮动通知
媒体控件和 RemoteControlClient
getRecentTasks()
Android NDK 中的 64 位支持
绑定到服务
WebView
自定义权限唯一性要求
使用重复的自定义权限的应用
您的应用需要注意的事项
新安装和更新
使用 Android 5.0 系统更新的现有安装
建议
TLS/SSL 默认配置变更
服务器不支持任何已启用的加密套件
应用对用于连接服务器的加密套件做出错误的假设
服务器不支持 TLSv1.1、TLSv1.2 或新的 TLS 扩展
支持托管配置文件
处理 Intent
在各个配置文件中共享文件
已移除锁定屏幕小部件支持
新特性
打印框架
打印通用内容
打印图像
构建打印服务
短信提供程序
无线和连接
主机卡模拟
NFC 读取器模式
红外线发射器
多媒体
自适应播放
音频点播时间戳
Surface 图像读取器
峰值和有效值 (RMS) 测量
音量增强器
遥控器
从遥控器进行评分
隐藏式字幕
动画和图形
场景和转场
动画暂停
可重复使用的位图
用户内容
存储访问框架
外部存储空间访问
同步适配器
用户输入
新传感器类型
批处理传感器事件
控制器身份
用户界面
沉浸式全屏模式
透明系统状态栏
增强的通知侦听器
可绘制的 RTL 布局镜像
无障碍功能
应用权限
设备功能
行为变更
外部存储
WebView
AlarmManager
ContentResolver
作者其他开源项目
安卓技术中台:AndroidProject
安卓技术中台 Kt 版:AndroidProject-Kotlin
权限框架:XXPermissions
吐司框架:ToastUtils
网络框架:EasyHttp
标题栏框架:TitleBar
悬浮窗框架:XToast
Shape 框架:ShapeView
语种切换框架:MultiLanguages
Gson 解析容错:GsonFactory
日志查看框架:Logcat
Android 代码规范:AndroidCodeStandard
Studio 精品插件:StudioPlugins
表情包大集合:EmojiPackage
省市区 Json 数据:ProvinceJson