两个官方链接:
1. 官方推荐的兼容测试方式
2. Android8.0行为变更说明
Android 8.0 行为变更包括两个部分:针对所有 API 级别的应用和针对 Android 8.0 的应用(8.0专属部分大部分用不到,所以没专门列出),当然,全局API级改变在项目中的使用场景也很少。
针对所有 API 级别的应用
api修改 | 相应的说明 | 是否需要适配 |
---|---|---|
后台执行限制 | 项目注册了一个开机启动的广播接收者,用来启动推送服务(将在8.0上无效) | 不需要 |
后台位置限制 | 未涉及 | 不需要 |
语言区域和国际化 | 未涉及 | 不需要 |
提醒窗口 | 未涉及 | 不需要 |
输入和导航 | Android8.0会默认给view加上焦点获取的涟漪效果,对业务没影响 | 不需要 |
网页表单自动填充 | Android8.0会默认支持,原Api失效 | 不需要 |
无障碍功能 | 按照UI切图开发就可以,无障碍功能不用考虑 | 不需要 |
网络连接和 HTTP(S) 连接 | Android8.0上在网络连接各接口中添加部分参数或者废除部分接口,对项目没有影响 | 不需要 |
蓝牙 | 应用中未直接使用,使用的三方的蓝牙key,如果有更新替换即可。 | 不需要 |
无缝连接 | 在编码上没有体现,只是在系统层有网络的优化 | 不需要 |
安全性 | APK 驻留路径已修改,需要改为api获取,但项目未用到 | 不需要 |
隐私性 | 项目如果使用了Android_Id的话,需要修改兼容,其他无需处理。 | 需要排查 |
记录未捕获的异常 | 产品中是默认将异常转交给默认处理程序处理,该改动没有影响。 | 不需要 |
联系人提供程序使用情况统计方法的变更 | 这个改变只会影响到获取联系人的详细信息的情况,只是值并不精确了,还是能返回数据。没用到的话就忽略~ | 不需要 |
集合的处理 | 查看项目中是否使用了AbstractCollection.removeAll() 和 AbstractCollection.retainAll()了,需要做容错,判空处理。 | 需要排查 |
企业版 | 使用不到企业版,忽略咯。 | 不需要 |
一、后台执行限制
- 解释说明
- 为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:
现在,在后台运行的应用对后台服务的访问受到限制。
应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。 - 如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
- 新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
- 为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:
查看应用中可能的潜在问题及解决方案
看一下manifest清单里面有没有注册系统的广播接收者,用来监听系统广播处理业务的场景?
- 官方说明里,这些广播android O上失效了,如果有,需要重新规划业务处理。
项目代码中使用了如下代码:开启启动推送的服务
<receiver android:name="com.gieseckedevrient.android.cpclientdemoapp.PushBroadCastReceiver" android:process=":push" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
这一块,系统改了没有别的办法,看看我们接入的推送是否支持各厂商系统级的推送(如果支持,改为这种方式,不支持,不用改动)
- 8.0中不允许执行startService会报异常,保险起见,加try-catch(没理解,哪里不能调用startService)
- 8.0中Context.startForegroundService(),在创建5s内必须执行startForeground() 函数,否则无效。
二、Android 后台位置限制
解释说明
现在一般都是用百度或者高德地图定位,不会手动写这些定位的逻辑,保持jar包更新就行,有没有后台定位的场景,如果有,测试是否符合预期结果,不符合的话更新lib包,再测试。(前台定位不算:进应用定位、进业务定位)
查看应用中可能的潜在问题及解决方案
见上一条
三、应用快捷键
解释说明
应用中未用到,pass,用到再研究
查看应用中可能的潜在问题及解决方案
应用中未用到,pass,用到再研究
四、语言区域和国际化
解释说明
- 在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault()
不过不用担心,官方有做兼容处理:当为 Locale 参数指定的 displayScript 值不可用时,Locale.getDisplayScript(Locale) 同样回退到 Locale.getDefault()。
- 在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault()
- 另外的几个api可能会异常或者数据与之前版本不一致,请按照官方文档来做8.0的适配。
查看应用中可能的潜在问题及解决方案
未用到。
五、提醒窗口
- 解释说明
如果应用使用 SYSTEM_ALERT_WINDOW 权限并且尝试使用以下窗口类型之一来在其他应用和系统窗口上方显示提醒窗口:
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
…那么,这些窗口将始终显示在使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口下方。如果应用针对的是 Android 8.0,则应用会使用 TYPE_APPLICATION_OVERLAY 窗口类型来显示提醒窗口。 查看应用中可能的潜在问题及解决方案
显示方式改变,项目未用到,pass,用到再研究
六、输入和导航
解释说明
- 元素焦点行为做出以下变更:
- 现在,如果您没有为 View 对象(前景或背景图片)定义任何焦点状态颜色,框架会为 View 设置默认的焦点突出显示颜色。此焦点突出显示标志是基于操作组件主题背景的涟漪图片。
- 如果您不希望 View 对象在接收焦点时使用此默认突出显示标志,请在包含 View 的布局 XML 文件中将 android:defaultFocusHighlightEnabled 属性设置为 false,或者将 false 传递至应用界面逻辑中的 setDefaultFocusHighlightEnabled()。
- 要测试键盘输入对界面元素焦点有何影响,您可以启用 Drawing > Show layout bounds 开发者选项。在 Android 8.0 中,此选项在当前具有焦点的元素上显示一个“X”图标。
添加键盘导航键区
具体例子(焦点切换顺序:button1->button2->editText1):
<RelativeLayout ...> <Button android:id="@+id/button1" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:nextFocusForward="@+id/editText1" ... /> <Button android:id="@+id/button2" android:layout_below="@id/button1" android:nextFocusForward="@+id/button1" ... /> <EditText android:id="@id/editText1" android:layout_alignBottom="@+id/button2" android:layout_toLeftOf="@id/button2" android:nextFocusForward="@+id/button2" ... /> ...
- 元素焦点行为做出以下变更:
查看应用中可能的潜在问题及解决方案
项目中未用到,用到参考官方说明。
七、网页表单自动填充
解释说明
Android8.0内置支持网页表单自动填充,以前的部分api失效。
- WebSettings
getSaveFormData() 函数现在返回 false。之前,此函数返回 true。
调用 setSaveFormData() 不再有任何效果。 - WebViewDatabase
调用 clearFormData() 不再有任何效果。
hasFormData() 函数现在返回 false。之前,当表单包含数据时,此函数返回 true。
- WebSettings
查看应用中可能的潜在问题及解决方案
未用到,如果用到也没关系(删除与否自动填充功能都可以正常使用)
八、无障碍功能
解释说明
在Android8.0中,能识别应用的 TextView 对象内部的所有 ClickableSpan 实例。(更智能了?)
查看应用中可能的潜在问题及解决方案
我们参考需求,按照UI切图开发就可以,无障碍功能提示这类东西也许我们用不着的。
九、网络连接和 HTTP(S) 连接
解释说明
- 无正文的 OPTIONS 请求具有 Content-Length: 0 标头。之前,这些请求没有 Content-Length 标头。
- HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,使包含空路径的网址规范化。例如,它将 http://example.com 转化为 http://example.com/。(早都不用他了)
- 通过 ProxySelector.setDefault() 设置的自定义代理选择器仅针对所请求的网址(架构、主机和端口)。因此,仅可根据这些值选择代理。传递至自定义代理选择器的网址不包含所请求的网址的路径、查询参数或片段。
- URI 不能包含空白标签。
- Android 8.0 在实现 HttpsURLConnection 时不会执行不安全的 TLS/SSL 协议版本回退。
等等。。
主要是一些api的参数等变更,携带参数修改,对于现有应用没有多大影响
查看应用中可能的潜在问题及解决方案
目前的项目中无需修改
十、蓝牙
解释说明
Android 8.0 对 ScanRecord.getBytes() 函数检索的数据长度做出以下变更- getBytes() 函数对于所接收的字节数不作任何假定。因此,应用不应受所返回的任何最小或最大字节数的影响。相反,应用应当计算所返回数组的长度。(api改了)
- 兼容蓝牙 5 的设备返回的数据长度可能会超出之前最大约 60 个字节的限制。
- 如果远程设备未提供扫描响应,则也可能返回少于 60 个字节的数据。
查看应用中可能的潜在问题及解决方案
应用中未直接使用,使用的三方的蓝牙key,如果有更新替换即可。
十一、无缝连接
解释说明
Android 8.0 对 WLAN 设置进行了多项改进,这样可以更轻松地选择能够提供最佳用户体验的 WLAN 网络。具体变更包括:- 稳定性和可靠性改进。
- 更加直观的界面。
- 一个合并的 WLAN 首选项菜单。
- 当附近存在优质的已保存网络时在兼容设备上自动激活 WLAN。
查看应用中可能的潜在问题及解决方案
在编码上没有体现,只是在系统层有网络的优化
十二、安全性
解释说明
- 不再支持 SSLv3(历史悠久,而且漏洞多)
- 应用的 WebView 对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性。
- 无法再假定 APK 驻留在名称以 -1 或 -2 结尾的目录中。应用应使用 sourceDir 获取此目录,而不能直接使用目录格式。
- Android 8.0 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。
- 在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection 不再尝试回退到之前的 TLS 协议版本并重试的权宜方法。
查看应用中可能的潜在问题及解决方案
目前来说,如果有上面第三点的话,需要修改,其他无需处理。
十三、隐私性
解释说明
安卓改变了标识符的处理方式:- 对于在 OTA 之前安装到某个版本 Android 8.0(API 级别 26)的应用,除非在 OTA 后卸载并重新安装,否则 ANDROID_ID 的值将保持不变。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。(也就是说,Android8.0中Android_Id算法和之前不一样,需要兼容处理)
- 对于安装在运行 Android 8.0 的设备上的应用,ANDROID_ID 的值现在将根据应用签署密钥和用户确定作用域。应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)。 (每个手机获取的Android_Id都不会一样了)
- 只要签署密钥相同(并且应用未在 OTA 之前安装到某个版本的 O),ANDROID_ID 的值在软件包卸载或重新安装时就不会发生变化。(安卓8.0以后才安卓的应用,只要应用的签名秘钥不变不会影响Android_Id,下次获取的值还是一样的)
- 即使系统更新导致软件包签署密钥发生变化,ANDROID_ID 的值也不会变化。
- 要借助一个简单的标准系统实现应用获利,请使用广告 ID。广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。
查看应用中可能的潜在问题及解决方案
跟应用可能有关系的就是Android_Id,8.0之前的Android_Id和和8.0之后的Android_Id不一致了,需要做兼容处理。
十四、记录未捕获的异常
解释说明
如果某个应用安装的 Thread.UncaughtExceptionHandler 未移交给默认的 Thread.UncaughtExceptionHandler,则当出现未捕获的异常时,系统不会终止应用。从 Android 8.0 开始,在此情况下系统将记录异常堆栈跟踪情况;在之前的平台版本中,系统不会记录异常堆栈跟踪情况。
我们建议,自定义 Thread.UncaughtExceptionHandler 实现始终移交给默认处理程序处理;遵循此建议的应用不受 Android 8.0 此项变更的影响。查看应用中可能的潜在问题及解决方案
产品中是默认将异常转交给默认处理程序处理,该改动没有影响。
十五、联系人提供程序使用情况统计方法的变更
解释说明
在之前版本的 Android 中,联系人提供程序组件允许开发者获取每个联系人的使用情况数据。此使用情况数据揭示了与某个联系人相关联的每个电子邮件地址和每个电话号码的信息,包括与该联系人联系的次数以及上次联系该联系人的时间。请求 READ_CONTACTS 权限的应用可以读取此数据。
如果应用请求 READ_CONTACTS 权限,它们仍可以读取此数据。从 Android 8.0 开始,使用情况数据查询会返回近似值,而不是精确值。不过,Android 系统内部仍然会保留精确值,因此,此变更不会影响 auto-complete API。
此行为变更会影响以下查询参数:
TIMES_CONTACTED
TIMES_USED
LAST_TIME_CONTACTED
LAST_TIME_USED查看应用中可能的潜在问题及解决方案
这个改变只会影响到获取联系人的详细信息的情况,只是值并不精确了,还是能返回数据。没用到的话就忽略~
十六、集合的处理
- 解释说明
现在,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;之前,当集合为空时不会引发 NullPointerException。此项变更使行为符合文档要求。 查看应用中可能的潜在问题及解决方案
查看项目中是否使用了AbstractCollection.removeAll() 和 AbstractCollection.retainAll()了,需要做容错,判空处理。
十七、企业版
解释说明
Android 8.0 更改了企业应用(包括设备规范控制器 (DPC))的某些 API 和功能的行为。这些变更包括:- 新增多种行为,帮助应用支持完全托管设备中的工作资料。
- 变更系统更新处理、应用验证和身份验证方式,以提高设备和系统的完整性。
- 改进用户在配置、通知、“最近使用的应用”屏幕和 Always on VPN 方面的体验。
查看应用中可能的潜在问题及解决方案
使用不到企业版,忽略咯。