从 2018 年 8 月起,全部向 Google Play 提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发。2018 年 11 月起,全部 Google Play 的现有应用更新一样必须针对 Android 8.0。html
Android 每次版本更新都会做出变动,显著提高应用安全性以及性能并改善总体用户体验。其中部分变动仅适用于那些经过 manifest 文件中的 targetSdkVersion 属性 (即目标 API 等级) 明确指出支持新版 API 行为的应用。android
请将您的应用目标 API 等级设置为最新版本并确保用户可以享用这些改进项目,同时容许应用在低版本 Android 仍旧能够运行。适配新目标等级后,应用能够利用 Android 平台最新功能 (latest features) 给用户创造更美好的体验。安全
本文重点说明了开发者在更新目标 API 中应该注意的几个事项,从而知足 Google Play 的要求。在进行下一步前,请根据您的 app 现有 API 等级阅览:网络
早于 Android 5.0 (API 等级 21)app
早于 Android 6.0 (API 等级 23)ide
早于 Android 7.0 (API 等级 24)函数
早于 Android 8.0 (API 等级 26)性能
注意:若是您的 gradle 文件包含 manifest 条目,您可确认或者更改文件中 targetSdkVersion 的当下值,详情请阅览《如何配置您的构建》(Configure Your Build)。或者说,您也能够使用 manifest 文件中的 android:targetSdkVersion 配置项,具体操做请阅览 <uses-sdk> manifest 属性的相关文档。测试
早于 Android 5.0 (API 等级 21)gradle
请根据 API 版本阅览相应的《行为变动》页面,确保您的应用可以顺利应对各个版本发布:
Android 5.0 (API 等级 21)
Android 4.4 (API 等级 19)
Android 4.1 x (API 等级 16)
早于 Android 6.0 (API 等级 23)
下文列举内容适用于针对 Android 6.0 或更高版本平台开发的应用:
在运行时请求权限
- 危险权限只能够在运行时被授予。应用的 UI 流必须提供相应可供性向用户请求这些权限;
- 但凡可能,您的应用要准备好应对权限请求被拒的状况。譬如说,若是某个用户拒绝您的应用访问设备 GPS,应用须经过其它方法继续运行。
要了解 Android 6.0 (API 等级 23) 的详细变动,请阅览该版本的《行为变动》(Behavior Changes) 文档。
早于Android 7.0 (API 等级 24)
下文列举内容适用于针对 Android 7.0 或更高版本平台开发的应用:
Doze 以及应用待机模式:
请根据《Doze 以及应用待机模式优化》一文中的相关描述设计您的 app,文章涵盖适用几个 Android 版本的逐步变动。
当设备进入 Doze 或者待机模式时,会产生下述系统行为:
- 网络访问限制;
- 推迟应用的 alarms、syncs 和 jobs;
- GPS 以及 Wi-Fi 扫描限制;
- 普通优先级 Firebase Cloud Messaging 消息限制;
权限变动
- 系统将限制访问应用私有目录;
- 在应用外公开 file://URI会致使 FileUriExposedException。开发者能够使用 FileProvider 在应用间进行文件共享;
系统阻止应用连接非 NDK 库。
要了解 Android 7.0 (API 等级 24) 的详细变动,请阅览该版本的《行为变动》(Behavior Changes) 文档。
早于 Android 8.0 (API 等级 26)
下文列举内容适用于针对 Android 8.0 或更高版本平台开发的应用:
后台执行限制 (Background Execution Limits)
- 若您的应用不运行在前台,系统将会限制服务:
·· 当应用试图调用 startService() 而 startService 又被禁止时,startService() 会抛出异常;
·· startForegroundService() 应用必须使用 startForeground()和 startForegroundService() 函数启动前台服务;
·· 请前往 Android 8.0 (API 等级 26) 《行为变动》页面,仔细阅读关于 JobScheduler API 的变动;
·· Firebase Cloud Messaging 要求 10.2.1 或更高版本的 Google Play 服务 SDK;
·· Firebase Cloud Messaging documentation 在使用 Firebase Cloud Messaging 时,消息投递受限于后台执行限制。若消息接收须要必要后台工做,如后台数据同步,您的应用需要经过 Firebase Job Dispatcher 或者 JobIntentService 调度任务。详情请阅览《Firebase Cloud Messaging 文档》。
- 隐式广播限制:
·· 系统会限制隐式广播。有关处理后台事件详情,请阅读JobSechduler API 文档;
·· 后台位置限制;
·· 后台运行的应用访问位置数据受限;
支持 Google Play 服务的设备能够经过 fused location provider 按期获取位置更新。
通知渠道
- 您应该为每一个渠道分别定义通知中断设特性:
·· 您必须将通知分配到某一渠道 (channel),以便通知显示;
·· 该版本 Android 平台支持 NotificationCompat.Builder;
隐私
- ANDROID_ID 会根据每一个应用签署密钥肯定做用域。
要了解 Android 8.0 (API 等级 26) 的详细变动,请阅览该版本的《行为变动》(Behavior Changes) 文档。
当您在更新应用目标 API 等级时,请考虑应用平台近期发布的新功能,让您的应用更为现代化并为用户带去更好的体验。
请将您的 app 从 Google Cloud Messaging (GCM) 迁移至 Firebase Cloud Messaging 最新版本;
使用高级窗口管理:
- Declare Restricted Screen Support 支持更大宽屏比率 (大于 16:9),让应用可以利用最新的硬件技术。确保您的应用调整大小后能填充可用的屏幕空间。万不得已状况下,能够声明最大屏幕宽高比。更多有关最大屏幕宽高比信息,请阅览《声明受限屏幕支持》;
- multiple displays 添加多窗口支持,提高 app 效率并管理多屏幕适配;
- 若是最小化应用可以帮助您改善用户体验,您可添加画中画支持;
- 针对凹口屏幕设备的优化:
·· 不要假定状态栏高度,而是使用 WindowInsets 以及View.OnApplyWindowInsetsListener;
·· 不要假定应用是全屏显示的,而是经过调用View.getLocationInWindow() (注意:不是View.getLocationOnScreen()) 来肯定应用屏幕位置;
·· 在处理 MotionEvent 时,调用 MotionEvent.getX() 和MotionEvent.getY();而非 MotionEvent.getRawX() 或MotionEvent.getRawY();
使用现代摄像头支持:
- 使用 Camera2 API 最大化摄像头利用率;
- Pixel 2 devices 在 Pixel 2 设备上启用 Pixel Visual Core 加速 HDR+ 处理。
请确保您使用的三方 SDK 依赖项支持 API 26:部分 ADK 供应商会在发布说明中写明是否支持;其它供应商则需要进一步调查。若是您使用的 SDK 不支持 API 26,请尽快与 SDK 供应商合做解决该问题。
此外,请注意您的应用或者游戏中的 targetSdkVersion 可能会限制访问私有 Android 平台库,请阅览《将 NDK 应用连接至平台库》获取进一步信息。
您还需要验证您正在使用的 Android 支持库可能存在的任何限制。和以往同样,您必须确保应用中的 compileSdkVersion 与 Android 支持库主要版本可以顺利兼容。
咱们推荐您选择小于或等于 Support Library 主要版本的 targetSdkVersion ,并建议您升级到近期发布的兼容 Support Library,从而可以使用到最新版本的兼容性特性和错误修正功能。
在更新完应用的 API 等级和功能后,您需要测试一些核心用例。下文列举的几条建议并无涵盖全部状况,但但愿能给您提供指导做用。咱们建议进行如下几个方面的测试:
测试应用兼容 API 26, 不产生错误和警告;
您的应用应该有相应策略来妥善应对用户拒绝访问权限的状况,并提示用户授予权限。为了达到该效果,您需要:
- 前往应用的信息页面,而后拒绝每一个权限;
- 开启应用,确保没有崩溃;
- 进行核心用例测试,并确保全部必须权限请求再被显示;
妥善应对 Doze 模式,达到预期效果且不致使错误:
- 在应用运行时,使用 adb 让您的测试设备进入 Doze 模式:
·· 测试任何触发 Firebase Cloud Messaging 消息的用例;
·· 测试任何须要使用闹钟或者任务用例;
·· 消除全部后台服务依赖;
- 设置您的应用进入待机模式:
·· 测试任何触发 Firebase Cloud Messaging 消息的用例;
·· 测试任何须要使用闹钟的用例;
处理新拍摄的照片以及视频:
- 检查您的应用是否妥善处理 ACTION_NEW_PICTURE 以及 ACTION_NEW_VIDEO 广播限制 (即移动至 JobScheduler 任务);
- 确保任何依赖此类事件的重要用例都能顺利运行;
应用间分享文件:
- 请测试全部涉及到应用间分享文件数据的案例 (即便是同一开发者开发的应用);
- 请测试其它应用是否可以成功显示内容,并且不引起崩溃。