从 2018 年 8 月起,所有向 Google Play 提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发。2018 年 11 月起,所有 Google Play 的现有应用更新同样必须针对 Android 8.0。

Android 每次版本更新都会作出变更,显著提升应用安全性以及性能并改善整体用户体验。其中部分变更仅适用于那些通过 manifest 文件中的 targetSdkVersion 属性 (即目标 API 等级) 明确指出支持新版 API 行为的应用。

请将您的应用目标 API 等级设置为最新版本并确保用户能够享用这些改进项目,同时允许应用在低版本 Android 仍旧可以运行。适配新目标等级后,应用可以利用 Android 平台最新功能 (latest features) 给用户创造更美好的体验。

本文重点说明了开发者在更新目标 API 中应该注意的几个事项,从而满足 Google Play 的要求。在进行下一步前,请根据您的 app 现有 API 等级阅览:

  • 早于 Android 5.0 (API 等级 21)

  • 早于 Android 6.0 (API 等级 23)

  • 早于 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)

请根据 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 和库

请确保您使用的三方 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 任务);

- 确保任何依赖此类事件的重要用例都能顺利运行;

  • 应用间分享文件:

- 请测试所有涉及到应用间分享文件数据的案例 (即使是同一开发者开发的应用);

- 请测试其它应用是否能够成功显示内容,而且不引发崩溃。

满足 Google Play 目标 API 等级 (targetSdkLevel) 的要求相关推荐

  1. 【错误记录】Google Play 上架报错 ( APK 大小 | 目标 API 级别 | Google Play 帮助文档 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Google Play 中上架 APK 文件 , 报如下错误 ; 您需要将 APK 文件缩减到 一〇〇 MB,或使用 APK 扩展文件.您的应用目前 ...

  2. Android上架Google Play要求最低目标SDK的API为26,升级开发环境目标API

    最近突然发现之前上架Google Play的App被封禁了,邮件中回复原因有以下三点: 1.使用拍照.通讯录等隐私权限没有隐私政策声明(隐私文件生成参考博文上架Google Play流程). 2.使用 ...

  3. 掌握AJAX, 第 9部分: 运用Google Ajax搜索API

    掌握AJAX, 第 9部分: 运用Google Ajax搜索API 本系列英文链接:http://www-128.ibm.com/developerworks/views/web/libraryvie ...

  4. Google maps javascript api v3 叠加层(Overlays)介绍

    很多人尝试google maps api的开发,通常会涉及到在Google maps上进行标注功能的开发.Helloj2ee学习一项技术通常不在看书,而是多以帮助为主.当我看完之后,我将Overlay ...

  5. Google Maps JavaScript API V3 叠加层

    注意:以下网页中提到的 Google Maps JavaScript API 第 3 版现在是正式的 JavaScript API 版本.该 API 的第 2 版已根据我们的弃用政策正式弃用.欢迎您将 ...

  6. Google Maps JavaScript API V3的使用(四)

    Google Maps JavaScript API V3 叠加层 叠加层概述 叠加层是地图上与纬度/经度坐标绑定的对象,会随您拖动或缩放地图而移动.叠加层表示的是"添加"到地图中 ...

  7. 第 9 部分: 使用 Google Ajax Search API

    发出异步请求并不意味着只是与您自己的服务器端程序交互.其实也可以与一些公共 API,例如来自 Google 或 Amazon 的 API 进行通信,从而为 Web 应用程序增加您自己的脚本和服务器端程 ...

  8. Google Static Maps API

    Google Static Maps API概述 Google Maps提供了强大的地图调用函数.对于普通用户来说,须要了解一定的JavaScript语法,才可以完全使用Google Maps所提供的 ...

  9. 【Android 教程系列第 14 篇】Android 系统版本和 API 等级对应关系表(持续更新)

    这是[Android 教程系列第 14 篇],如果觉得有用的话,欢迎关注专栏. 很多人记不住 Android 系统版本和 API 等级对应的关系,这里我以 官网文档 和 安卓版本历史(维基百科) 为参 ...

最新文章

  1. Content-Type: application/vnd.ms-excel
  2. 「Mysql数据库」MySQL数据库开发的 36 条军规!
  3. 数据库高可用和分区解决方案-MySQL 篇
  4. mysql2003错误如何解决_如何安装最新版redis6错误解决以及配置开机启动等
  5. php 代码修改后 重新实例化_从匿名函数到PHP设计模式之容器模式
  6. Spring深入理解之ComponentScan___@ComponentScan 详解
  7. 如何在Mac上安装Node.js和NPM
  8. Hibernate征途(三)之CRUD
  9. ice通信原理_变频开关电源工作原理,开关电源自我检修
  10. NAT对数据业务的影响
  11. ms-sql数据转成脚本
  12. IFC最新标准 IFC4X3 RC2 和 IFC4X3 RC4 特点
  13. 天思 erp win7安装提示服务器上没有文件信息,关于天思ERP 9.2客户端无法安装的问题...
  14. matlab用ifft,ifft(matlab中ifft是什么意思)
  15. PAT乙级全题解存档
  16. Zabbix监控之监控项
  17. docker-compose 怎么只 recreate 指定的 service
  18. MT8516处理器简介—MT8516芯片技术资料解析
  19. apiserver报错:OpenAPI spec does not exists
  20. 经典进程同步问题——吸烟者问题

热门文章

  1. bgi::detail::is_valid用法的测试程序
  2. GDCM:gdcm::FileChangeTransferSyntax的测试程序
  3. boost::container模块实现节点句柄的测试程序
  4. DCMTK:测试dcmiod的颜色转换功能
  5. VTK:图片之ImageImport
  6. VTK:图片之ImageSobel2D
  7. VTK:几何对象之OpenVRSphere
  8. OpenCV非真实感渲染的实例(附完整代码)
  9. OpenCV创建校准图案calibration pattern
  10. QDoc建立连结creatinglinks