Android 各版本演变特性整理

目录

官网:

Android 12(S)

Android 11(R)

Android 10(Q)

Android 9.0 (P)

Android 8.0 (O)

Android 5.0

Android 6.0

Android 7.0


官网:

版本介绍
Android Releases  |  Android Developers

SDK版本官网:

<uses-sdk>  |  Android 开发者  |  Android Developers

https://developer.android.com/guide/topics/manifest/uses-sdk-element

Android源码查看AOSP版本:

$ cat build/core/version_defaults.mk |  grep "PLATFORM_VERSION_LAST_STABLE := "
$ cat build/core/version_defaults.mk |  grep "PLATFORM_SDK_VERSION := "

Android 12(S)

新体验:
Android 12 中,
1. 微件可以实现圆角,为按钮、背景及其他组件使用设备主题颜色,提供更精细的大小属性和更灵活的布局。
2. 增加音频耦合触感反馈效果,可让您获得更身临其境的游戏和音频体验。
3. 引进新的应用启动画面 API,新的启动动画。
4. 允许按来电重要性排名的新通话通知,为通话增加新的通知样式,同时在状态栏显示带有通话时间的条状标签并且点击标签可跳转至通话界面,当然这种通知优先级最高排在最前。
5. 通知中提供动画图片来丰富应用的通知体验,可以点击通知栏回复消息。
6. 支持圆角屏幕不被截断的API
7. 画中画引入新功能,部分功能优化是功能更流畅,增加了隐藏窗口和双手缩合手势可以进行控制窗口大小。
8. 沉浸模式下的手势导航改进,其实没有什么新东西,就是优化了某些场景下的手势导航。
9. 富媒体内容插入,据官方描述新的统一API,通过实现回调API的方式,可以实现(剪贴板、键盘或拖放操作)接收富媒体内容(图片、音视频等)

下面的都是改进优化的功能:

1.摄像头
Quad Bayer 摄像头传感器支持,Android 12 引入了新的平台 API,可让第三方应用充分利用这些多功能传感器。

2.图形和图片
让应用能够直接访问 Tombstone 跟踪记录,以前,只有通过 Android 调试桥 (adb) 才能访问此信息。可以通过 ApplicationExitInfo.getTraceInputStream() 方法以协议缓冲区的形式访问应用的原生代码崩溃 Tombstone。
AVIF 图片支持,使用 AV1 编码的图片和图片序列的容器格式,相比JPEG,这种格式可显著提升相同文件大小下的图片质量。
更简单的模糊处理、颜色滤镜及其他效果
Android 12 添加了新的 RenderEffect,它可将常见的图片效果(如模糊处理、颜色滤镜、Android 着色器效果及更多效果)应用于 View 和渲染层次结构。
原生动画图片解码
在 Android 12 中,NDK ImageDecoder API 已进行了扩展,可以对使用以下文件格式的图片的所有帧和时间数据进行解码:动画 GIF 和动画 WebP 文件格式。在 Android 11 中引入该 API 时,该 API 仅从这些格式的动画中解码第一张图片。

3.媒体
兼容的媒体转码
Android 12 可以自动将设备上录制的 HEVC(H.265) 和 HDR(HDR10 和 HDR10+)视频转码为 AVC (H.264),AVC (H.264) 是与标准播放器广泛兼容的格式。
性能等级
推出了一种称为“性能等级”的标准,每个 Android 版本都有自己对应的性能等级,这在该版本的 Android 兼容性定义文档 (CDD) 中进行定义。Android 兼容性测试套件 (CTS) 会验证 CDD 要求。
 可通过Build.VERSION.MEDIA_PERFORMANCE_CLASS查询"性能等级"。
视频编码改进
Android 12 定义了一组标准键来控制视频编码的量化参数 (QP) 值,这样可让开发者避免供应商专用代码。
音频焦点
从 Android 12 开始,当一个应用在另一个应用具有焦点且正在播放音频的同时请求音频焦点时,框架会淡出正在播放音频的应用。
MediaDrm 更新
MediaDrm API 是否需要安全的解码器组件,必须按照官方文档步骤操作

4.安全和隐私设置
蓝牙权限
隐私信息中心
显示数据访问的理由
隐藏应用叠加窗口
已知签名者权限保护标志
设备属性认证
安全锁定屏幕通知操作

5.连接性
带宽估测改进
使配套应用保持唤醒状态 
配套设备管理器配置文件 
Wi-Fi 感知 (NAN) 增强功能
并发点对点 + 互联网连接

6.存储
语音录音的新目录
媒体管理访问权限
应用存储访问权限
扩展的文件访问权限支持

7.核心功能
自动更新应用
设备芯片组信息

功能和 API 概览  |  Android 12 Beta 版  |  Android Developers了解 Android 12 中面向开发者的新功能和 API。https://developer.android.google.cn/about/versions/12/features#core

Android 11(R)

强制执行分区存储机制、单次授权、自动重置权限、后台位置信息访问权限、软件包可见性、前台服务
支持Bubbles

Android 10(Q)

(1)优化权限管理,增强隐私保护
   隐私增强(后台能否访问定位)、限制程序访问剪贴板、权限细分需兼容、后台定位单独权限需兼容
   设备唯一标示符需兼容、后台打开Activity 需兼容、非 SDK 接口限制 需兼容
(2)桌面体验和平板电脑支持
      桌面模式:提供类似于PC的体验,但是远远不能代替PC。
(3)全局夜间黑暗模式,更加省电
   应用黑盒包、括手机上的所有应用都可以为其设置暗黑模式。夜间模式:
(4)支持App回滚降级
其他:
屏幕录制:通过长按“电源”菜单中的"屏幕快照"来开启。
Bubbles 开发者模式

Android 9.0 (P)

网络连接变更
Android9_Solution.md · master · 第三女神程忆难 / Android开发总结 · CODE CHINA

1、全面屏支持,Android P加入了对刘海屏的支持,谷歌称之为凹口屏幕(display with a cutout)。借助最新的提供的DisplayCutout类,开发者可以找到非功能区域的位置和形状,而非功能区域是不应显示功能的;使用getDisplayCutout()就可以获取这个区域的详细信息,未来刘海屏手机很有可能成为主流趋势,在前摄像头没有比较好的隐藏方案出现之前,这可能是提高屏占比的好方法。

2、通知栏的多种通知,从牛轧糖开始,你就可以增加一个action以对消息或从通知直接进入文字的行为作出反应。而在Android P版本中,你还可以在消息中展示图像;新的Notification.Person类可以识别对话中的任务,包括他们的头像和URI;当用户关闭消息通知时,你的app可以获取由系统发出的EXTRAREMOTEINPUT_DRAFT。你可以使用这个extra值来在app中进行预填充……

3、多摄像头的更多画面,可以即时获取到两个或者更多的相机数据流,可以想象将有更多有趣的设计和实现出来

4、GPS定位之外的WiFi定位,Android P增加了平台级支持IEEE 802.11 mc Wi-Fi协议(即Wi-Fi Round-Trip-Time,RTT), 从而让开发者可在App中使用室内定位。使用有硬件支持的Android P设备上,你的应用可以使用最新的RTT API以测量附近具有RTT功能的Wi-Fi AP。当然,前提是你的设备必须有定位功能而且你的App已经获取了ACCESS_COARSE_LOCATION及其以上的权限,可以想象将来更加精准的定位所带来的丰富的应用场景。

5、网络还有神经网络,在Android P上,任务可以声明它们估算的数据大小,信号预读取并且指定详细的网络需求--任务载体则可以报告网络是否拥挤或是否不计量。JobScheduler便可按照网络状态管理任务。另一方面,神经网络API在Android 8.1引入,目的是加速Android设备上的机器学习。Android P扩展并改进了这些API, 为9个操作增加了支持,分别是Pad, BatchToSpaceND, SpaceToBatchND, Transpose, Strided Slice, Mean, Div, Sub和Squeeze。在Android P之后,设备将会对网络有更精细的调整:根据任务需求的数据大小和当前的网络环境。在收费网络里延迟一些网络要求,而在不计费的网络里可以通过消息预获取来得到更好的用户体验。神经网络API的更多操作则是让设备变得更智能、更聪明。智能的一种体现,节省流量和网络速度优化体验的一种好的改进。

6、Material Design迎来2.0时代,神经网络Android 9.0加入了大量的圆角设计,UI方面的优化,感觉有些鸡肋,在现在各种模仿的设计趋势和各种定制化UI下,许多功能只是看看而已,用不到多少。

7、Android Dashboard:用户可以看清楚自己在受手机上都干了哪些事情,从而提醒自己是否过多的浪费了不必要的时间,比如后是否看电影看视频太多,是否玩游戏太多等等。并在必要的时候提醒你应当休息一下。对某一款应用进行时间限制,用户使用到一定时间之后就会提醒,甚至让图标变灰色,以提醒用户尽量少用这个APP

8、Wind Down:夜间模式;

9、Adaptive Battery:更智能的方式来适应电池和屏幕,从而整体改善续航能力。谷歌加入了Adaptive Battery功能,不过这个模式需要单独开启,在该模式下,程序不需要唤醒可以极大的降低资源占用,更关注用户最常用的服务和应用程序,也算是AI技术的应用之一。这样就可以最大限度的降低后台占用,从而提升电池续航能力。这是Android团队与Google DeepMiind团队合作开发的成果,不仅可以预测用户接下来几个小时内将使用的应用程序,而且还包括在当天用户何时会使用哪些应用程序。智能的一种应用。

10、Shush:屏幕朝下时进入完全勿扰状态;除了能够阻挡电话和通知的打扰,还有视觉免打扰的功能,屏幕不会点亮,直到用户主动打开手机。有趣的是在这个模式下,如果用户将手机屏幕朝下放置,那么手机会自动调整为震动或者静音模式,只保留闹钟的声音。

11、Actions和Slices:通过检测用户的行为,让系统作出对应的动作。如插入耳机孔自动播放音乐,搜索“打车”自动显示打车软件等。

总结:对更大屏幕显示的追求和视觉等体验的优化,智能的开始体现(用户行为的学习及正确化引导,网络环境的智能适应,电池电量的优化),更加人性化。期待更好的android,期待更好的智能体验,加油!                   

Android 8.0 (O)

而值得一提的是,相信 iPhone 和 iPad 用户应该会对 Android 8.0中的一些新功能感到熟悉。此前,苹果公司还经常被指责抄袭Android功能。但是在Android 8.0中,谷歌也直接从iOS中移植了几项功能。一起来看看吧~

通知功能

在Android 8.0“奥利奥”中,应用图标的右上角有一个小点,它代表未读通知。

Android 8.0二十大新特性,这些地方像极了iOS?

这是自第一代iPhone发布以来iOS中的一项主要功能。第三方Android系统定制厂商长期以来也一直在使用这项功能。

另外,用户长按带有通知标记的应用图标,系统就会弹出菜单,提供应用功能预览,就像iOS中的3D Touch功能。

但不管怎么样,对用户来说是有利的。这种通知功能之所以能够在多次iOS系统升级中得以保留,就是因为它好用。

新表情符号

Android 8.0和iOS 11都推出了新的表情符号,因为表情符号是人类未来的互动方式。谷歌为Android 8.0彻底重新设计了表情符号,弃用了Blobs表情包,重新使用传统圆形表情符号。

不过,根据苹果CEO蒂姆·库克(Tim Cook)预览的表情符号,iOS将会增加更为精细的表情符号。库克在推文中展示了十分精细的表情符号。苹果尚未披露这些新表情符号会在何时登陆iOS,但预计会在iOS 11和macOS High Sierra系统发布时出现。

智能复制和粘贴

从首版Android系统发布以来,Android就一直支持复制和粘贴功能,常常在用户互动功能部署上iOS。这是一项重要功能,但是由于手机屏幕较小,复制和粘贴并不方便。Android 8.0让文本的复制和粘贴变得更加容易。

这项功能名为“智能文本选择”。例如,当用户选择一个地址时,地图链接就会出现在复制、剪切、粘贴标准功能的旁边。如果用户选择的一组数字看起来很像电话号码,那么手机应用就会出现。

这有些像iOS中的数据探测器,但是谷歌的功能看起来更为全面,它使用的是谷歌智能识别人工智能技术。

画中画功能

苹果通过iOS 9在iPad中增加了画中画功能。现在,Android也具备了这项功能。而且,在Android 8.0中,手机也能实现画中画功能,这正是iPhone所缺少的。

Android 8.0的画中画模式与预期的一样。它能够允许用户把视频最小化,悬浮在屏幕上方。同时,其它任务在视频下方运行。用户可以调整视频窗口的位置。

目前,iOS的画中画功能只限于iPad,但未来可能会发生变化。

自动填充功能

Android 8.0终于支持自动填充功能。Android应用现在可以自动填充用户姓名、密码和地址等用户信息。密码管理应用很早就已经支持了这项功能,但是需要通过复杂的方法来实现。现在,应用可以执行自动填充应用程序接口(API),因此可以实现更为流畅地整合。

iOS也有类似功能,但是主要局限在少量应用上,例如亚马逊公司应用,不像Safari上的自动填充功能一样无处不在。

虽然这次新版本很多地方跟 iOS 相似,但对于用户宝宝来说,是福利有木有,还是来一起看看

Android 8.0 带来的19个新变化汇总

1、Android 8.0 大幅提升了开机速度

对 Pixel 而言,开机速度提升了一倍,和旗舰机型三星 Galaxy S8 对比,嗯,看看开心就好。

Android 8.0二十大新特性,这些地方像极了iOS?

2、锁屏界面变化很小,字号缩小了一圈,为锁屏壁纸和通知等内容留出更多视觉空间

不过,在动辄 0.1、0.2 秒解锁的指纹识别普及后,锁屏界面已不那么重要了。

Android 8.0二十大新特性,这些地方像极了iOS?

3、桌面更新体现在「可自定义图标的形状」上

在 Pixel 桌面,你可以为图标选择圆形、方形或者圆角矩形等样式。另一个细节是,以前在 Google Play 市场设置的「将新应用图标添加到桌面」选项,如今需要在 Pixel 桌面中设置。

Android 8.0二十大新特性,这些地方像极了iOS?

五种桌面图标形状

4、引入了「通知圆点」功能,但不会显示具体通知数量,只会在图标右上角显示一个圆点

这儿有个细节,这个出现在右上角的圆点,会从图标左下角提取颜色,所以每个 APP 的圆点都是不一样的颜色。

Android 8.0二十大新特性,这些地方像极了iOS?

5、长按图标,能看到图标菜单和通知概览

长按即可。目前最实用的,是支付宝的快捷付款功能。

6、全新的状态栏

底色从之前的黑色,到第一个开发者预览版时的黑白任选,再到正式版的只剩下白色,看起来清爽不少,动画也更优雅。

Android 8.0二十大新特性,这些地方像极了iOS?

7、通知栏变得更加可爱

系统只默认完整显示最顶部的通知,其余通知被压缩,可以用手势下拉查看全部内容。还有就是, Google Play Music 和 YouTuBe 的通知,会根据内容或专辑封面增添通知色彩。

Android 8.0二十大新特性,这些地方像极了iOS?

8、在展开或缩起所有通知时,最左边的小图标会有可爱的动画出现

Android 8.0二十大新特性,这些地方像极了iOS?

↑留意通知栏左下角↑

9、设置界面相对与 Android 7.1.2 引入了层级概念

将不常用设置项归纳到一起,保持整体的简洁,但也增加了寻找的难度。

Android 8.0二十大新特性,这些地方像极了iOS?

设置界面

10、系统应用的默认图标统一更新为绿色圆形

这个图标除了系统应用外,一些懒得画图标的第三方应用也可以直接用上,呵呵,这些开发者是有多懒。

Android 8.0二十大新特性,这些地方像极了iOS?

11、安全性选项中,Android 8.0 引入了「Google Play 保护机制」

它会定期检查手机所安装的应用是否存在有害行为,如果发现安全风险,系统会通知用户。

12、每个 APP 的「安装未知应用」功能将默认被限制

比如在 Chrome 浏览器上下载一个 apk 安装包,如果未经允许,这个安装包是无法安装的。安装应用的过程中有明确进度条可以查看。

13、终于可以直接在铃声设置界面添加第三方手机铃声

不用将喜欢的铃声放进 ringtones 文件夹了。

接下来要说的两个功能,几乎是到了最后的第四个开发者预览版才能够正常使用。

14、画中画模式

使用 Chrome 全屏播放视频或者在 YouTuBe 观看视频时,按下 Home 键就可以进入画中画模式。

15、Autofill 功能

能够通过你存储在谷歌帐号上的帐号密码,自动在登录应用时填充。

16、在 Android 8.0 的开发者选项中,还出现了蓝牙音频解码器加

入了由索尼提供的 LDAC 无线音效技术,索尼蓝牙耳机用户有福了。另外,像 aptX 和 aptX HD等无线技术也有提供。

在没有开启开发者选项的情况下,系统会自动帮你做出选择,比如在连接索尼蓝牙耳机后,会自动切换到 LDAC 模式,而连接三星蓝牙耳机时,会切换回 aptX。

17、智能文本选择

举个例子,在邮件中选择一个带地址的文本,系统除了弹出复制和全选之外,还会直接提供谷歌地图的快捷方式,让用户直接在地图中查看这个地址。

18、Pixel 自带相机中增加了双击放大功能

这功能可能是为双摄两倍变焦做准备的。

19、Emoji 表情也从之前的果冻变成了圆形

个人感觉是没之前的可爱。

Android5.0,6.0,7.0新特性整理

Android 5.0

API级别:21

1. Android Runtime(ART)

大多数 Android 应用无需任何更改就可以在 ART 下工作。不过,部分适合 Dalvik 的技术并不适用于 ART。如需了解有关最重要问题的信息,请参阅在 Android Runtime (ART) 上验证应用行为。如存在以下情况,应特别注意:

您的应用使用 Java 原生接口 (JNI) 运行 C/C++ 代码。

您使用生成非标准代码的开发工具(例如,一些代码混淆工具)。

您使用与压缩垃圾回收不兼容的技术

2. 声音和振动

如果您当前使用 Ringtone、MediaPlayer 或 Vibrator 类向通知中添加声音和振动,则移除此代码,以便系统可以在“优先”模式中正确显示通知。取而代之的是,使用 Notification.Builder 方法添加声音和振动。

将设备设为 RINGER_MODE_SILENT 可使设备进入新的优先模式。如果您将设备设为 RINGER_MODE_NORMAL 或 RINGER_MODE_VIBRATE,则设备将退出优先模式。

以前,Android 使用 STREAM_MUSIC 作为主流式传输来控制平板电脑设备上的音量。在 Android 5.0 中,手机和平板电脑设备的主音量流式传输现已合并,由 STREAM_RING 或 STREAM_NOTIFICATION 进行控制。

3. 锁定屏幕可见性

默认情况下,在 Android 5.0 中,通知现在显示在用户的锁定屏幕上。用户可以选择保护敏感信息不被公开,在此情况下,系统会自动删减通知显示的文本。要自定义此删减的通知,请使用 setPublicVersion()。

如果通知不包含个人信息,或者您想允许媒体播放控件显示在通知上,则调用 setVisibility() 方法并将通知的可见性级别设为 VISIBILITY_PUBLIC。

4. 浮动通知

现在,当设备处于活动状态时(即,设备未锁定且其屏幕已打开),通知可以显示在小型浮动窗口中(也称为“浮动通知”)。这些通知看上去类似于精简版的通知,只是浮动通知还显示操作按钮。用户可以在不离开当前应用的情况下处理或清除浮动通知。

可能触发浮动通知的条件示例包括:

用户的 Activity 处于全屏模式中(应用使用 fullScreenIntent)

通知具有较高的优先级并使用铃声或振动

如果您的应用在以上任何情形下实现通知,请确保系统正确显示浮动通知。

5. getRecentTasks()

为提升用户隐私的安全性,现已弃用 ActivityManager.getRecentTasks() 方法。对于向后兼容性,此方法仍会返回它的一小部分数据,包括调用应用自己的任务和可能的一些其他非敏感任务(如首页)。如果您的应用使用此方法检索它自己的任务,则改用 getAppTasks() 检索该信息。

6. 绑定到服务

Context.bindService() 方法现在需要显式 Intent,如果提供隐式 intent,将引发异常。为确保应用的安全性,请使用显式 intent 启动或绑定 Service,且不要为服务声明 intent 过滤器。

7. webview

Android 5.0 更改了应用的默认行为。

如果您的应用是面向 API 级别 21 或更高级别:

默认情况下,系统会阻止混合内容和第三方 Cookie。要允许混合内容和第三方 Cookie,请分别使用 setMixedContentMode() 和 setAcceptThirdPartyCookies() 方法。

系统现在可以智能地选择要绘制的 HTML 文档部分。这个新的默认行为有助于减少内存占用和提升性能。如果您要一次渲染整个文档,可通过调用 enableSlowWholeDocumentDraw() 停用此优化。

如果您的应用是面向低于 21 的 API 级别:系统允许混合内容和第三方 Cookie,并始终一次渲染整个文档。

Android 6.0

API级别:23

1. 运行时权限

对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的 requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

2. 取消支持Apache HTTP客户端

Android 6.0 版移除了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 HttpURLConnection 类。此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:

android {

useLibrary 'org.apache.http.legacy'

}

3. BoringSSL

Android 正在从使用 OpenSSL 库转向使用 BoringSSL 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 libcrypto.so 和 libssl.so。这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。

4. 通知

此版本移除了Notification.setLatestEventInfo()方法。请改用 Notification.Builder 类来构建通知。要重复更新通知,请重复使用 Notification.Builder 实例。调用 build() 方法可获取更新后的 Notification 实例。

adb shell dumpsys notification命令不再打印输出您的通知文本。请改用adb shell dumpsys notification --noredact命令打印输出 notification 对象中的文本。

5. 音频管理器变更

不再支持通过 AudioManager 类直接设置音量或将特定音频流静音。setStreamSolo() 方法已弃用,您应该改为调用 requestAudioFocus() 方法。类似地,setStreamMute() 方法也已弃用,请改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE。

6. 相机服务变更

在此版本中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。对服务行为的变更包括:

根据客户端应用进程的“优先级”授予对相机子系统资源的访问权,包括打开和配置相机设备。带有对用户可见 Activity 或前台Activity 的应用进程一般会被授予较高的优先级,从而使相机资源的获取和使用更加可靠;

当高优先级的应用尝试使用相机时,系统可能会“驱逐”正在使用相机客户端的低优先级应用。在已弃用的 Camera API 中,这会导致系统为被驱逐的客户端调用 onError()。在 Camera2 API 中,这会导致系统为被驱逐的客户端调用onDisconnected();

在配备相应相机硬件的设备上,不同的应用进程可同时独立打开和使用不同的相机设备。但现在,如果在多进程用例中同时访问相机会造成任何打开的相机设备的性能或能力严重下降,相机服务会检测到这种情况并禁止同时访问。即使并没有其他应用直接尝试访问同一相机设备,此变更也可能导致低优先级客户端被“驱逐”。

更改当前用户会导致之前用户帐户拥有的应用内活动相机客户端被驱逐。对相机的访问仅限于访问当前设备用户拥有的用户个人资料。举例来说,这意味着,当用户切换到其他帐户后,“来宾”帐户实际上无法让使用相机子系统的进程保持运行状态

Android 7.0

API级别:24

1. 电池和内存

Android 7.0 包括旨在延长设备电池寿命和减少 RAM 使用的系统行为变更。这些变更可能会影响您的应用访问系统资源,以及您的应用通过特定隐式 intent 与其他应用交互的方式。

2. Project Svelte:后台优化

Android 7.0 移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。

移动设备会经历频繁的连接变更,例如在 WLAN 和移动数据之间切换时。目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。

同理,在之前版本的 Android 中,应用可以注册接收来自其他应用(例如相机)的隐式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。

为缓解这些问题,Android 7.0 应用了以下优化措施:

面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。

应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。

如果您的应用使用任何 intent,您仍需要尽快移除它们的依赖关系,以正确适配 Android 7.0 设备。Android 框架提供多个解决方案来缓解对这些隐式广播的需求。例如,JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。您甚至可以使用 JobScheduler 来适应内容提供程序变化。

3. 系统权限更改

为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问 (0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。此权限更改有多重副作用:

1.私有文件的文件权限不应再由所有者放宽,为使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而进行的此类尝试将触发 SecurityException。

注:迄今为止,这种限制尚不能完全执行。应用仍可能使用原生 API 或 File API 来修改它们的私有目录权限。但是,我们强烈反对放宽私有目录的权限。

2.传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。

3.DownloadManager 不再按文件名分享私人存储的文件。旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能出现无法访问的路径。面向 Android 7.0 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException。通过使用DownloadManager.Request.setDestinationInExternalFilesDir()或DownloadManager.Request.setDestinationInExternalPublicDir()将下载位置设置为公共位置的旧版应用仍可以访问 COLUMN_LOCAL_FILENAME 中的路径,但是我们强烈反对使用这种方法。对于由 DownloadManager 公开的文件,首选的访问方式是使用ContentResolver.openFileDescriptor()。

4. 在应用件共享文件

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。

5. 屏幕缩放

Android 7.0 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度 sw320dp,该宽度是 Nexus 4 的宽度,也是常规中等大小手机的宽度。

当设备密度发生更改时,系统会以如下方式通知正在运行的应用:

如果是面向 API 级别 23 或更低版本系统的应用,系统会自动终止其所有后台进程。这意味着如果用户切换离开此类应用,转而打开 Settings 屏幕并更改 Display size 设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时更改中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。

如果是面向 Android 7.0 的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时更改中所述。

大多数应用并不需要进行任何更改即可支持此功能,不过前提是这些应用遵循 Android 最佳做法。具体要检查的事项:

1.在屏幕宽度为 sw320dp 的设备上测试您的应用,并确保其充分运行。

2.当设备配置发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查配置变更。

注:如果您要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。保存这些元数据便于您在配置变更后决定是否需要刷新缓存数据。

3.避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素 (dp) 单位指定尺寸。

6. 检查你的应用是否使用私有库

为帮助您识别加载私有库的问题,logcat 可能会生成一个警告或运行时错误。例如,如果您的应用面向 API 级别 23 或更低级别,并在运行 Android 7.0 的设备上尝试访问私有库,您可能会看到一个类似于下面所示的警告:

03-21 17:07:51.502 31234 31234 W linker :

library "libandroid_runtime.so"("/system/lib/libandroid_runtime.so") needed or dlopened by "/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible for the namespace "classloader-namespace" - the access is temporarily granted as a workaround for https://b/26394120

这些 logcat 警告通知您哪个库正在尝试访问私有平台 API,但不会导致您的应用崩溃。但是,如果应用面向 API 级别 24 或更高级别,logcat 会生成以下运行时错误,您的应用可能会崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed:

library "libcutils.so"("/system/lib/libcutils.so") needed or dlopened by"/system/lib/libnativeloader.so" is not accessible for the namespace "classloader-namespace"

at java.lang.Runtime.loadLibrary0(Runtime.java:977)

at java.lang.System.loadLibrary(System.java:1602)

如果您的应用使用动态链接到私有平台 API 的第三方库,您可能也会看到上述 logcat 输出。利用 Android 7.0DK 中的 readelf 工具,您可以通过运行以下命令生成给定 .so 文件的所有动态链接的共享库列表:

aarch64-linux-android-readelf -dW libMyLibrary.so

7. 其他重要说明

⑴如果一个应用在 Android 7.0 上运行,但却是针对更低 API 级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。应用必须能够妥善处理此情景。否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。

您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。

在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。

⑵Android 7.0 上的应用应能够妥善处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (Setting >Display > Font size) 并随后从最近使用记录中恢复运行应用,来验证应用行为。

⑶由于之前的 Android 版本中的一项错误,系统未能将对主线程上的一个 TCP 套接字的写入操作举报为违反严格模式。Android 7.0 修复了此错误。呈现出这种行为的应用现在会引发android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常会出现可能导致 ANR 和卡顿的高尾延迟。

⑷Debug.startMethodTracing()方法系列现在默认在您的共享存储空间上的软件包特定目录中存储输出,而非 SD 卡根目录。这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE权限来使用这些 API 。

⑸许多平台 API 现在开始检查在 Binder 事务间发送的大负载,系统现在会将TransactionTooLargeExceptions作为 RuntimeExceptions 再次引发,而不再只是默默记录或抑制它们。一个常见例子是在Activity.onSaveInstanceState()上存储过多数据,导致ActivityThread.StopInfo在您的应用面向 Android 7.0 时引发 RuntimeException。

⑹如果应用向 View 发布 Runnable 任务,并且 View 未附加到窗口,系统会用 View 为 Runnable 任务排队;在 View 附加到窗口之前,不会执行 Runnable 任务。此行为会修复以下错误:

如果一项应用是从并非预期窗口 UI 线程的其他线程发布到 View,则 Runnable 可能会因此运行错误的线程。

如果 Runnable 任务是从并非环路线程的其他线程发布,则应用可能会曝光 Runnable 任务。

⑺如果 Android 7.0 上一项有 DELETE_PACKAGES 权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统需要用户进行确认。在这种情况下,应用在调用PackageInstaller.uninstall()时预计的返回状态应为STATUS_PENDING_USER_ACTION。

⑻名为 Crypto 的 JCA 提供程序已弃用,因为它仅有的 SHA1PRNG 算法为弱加密。应用无法再使用 SHA1PRNG(不安全地)派生密钥,因为不再提供此提供程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值