Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案

1.Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
https://blog.csdn.net/WHB20081815/article/details/62888575
2.Android 滑动冲突的完美解决方案 listview和scroView
https://blog.csdn.net/WHB20081815/article/details/88617041
3.Android 深入理解 View 的绘制流程和机制
https://blog.csdn.net/WHB20081815/article/details/62236641
4.Android 5.0 6.0 以及7.0新特性 MD风格 敏感权限 文件访问
https://blog.csdn.net/WHB20081815/article/details/70244065
5.Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
https://blog.csdn.net/WHB20081815/article/details/76937801
6.Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案
https://blog.csdn.net/WHB20081815/article/details/75669925
7.Android快速理解Activity、View及Window&WindowManager之间关系
https://blog.csdn.net/WHB20081815/article/details/62419059
本文将从以下3个方面详细介绍Anroid 8.0完美适配
1).快速刷Anroid 8.0系统
2).应用API的主要修改,源代码详解,值得注意的地方
3).Anroid O新特性,行为变更
一).2分钟刷新Android 8.0的系统
1. Google O 版本的 O正式版已经发布, O-preview 的 SDK 下载地址: https://android.googlesource.com/platform/external/selinux/+/android-o-preview-1
4.Google 源码托管地址:https://android.googlesource.com/platform/packages 需要翻墙才能用
5.API差异:https://developer.android.google.cn/sdk/api_diff/26/changes.html
6. Google O 版本的 O-正式版 source code 下载方法: https://source.android.com/source/downloading.html
7. 目前 Nexus5X、Nexus6P、Nexus Player、Pixel C、Pixel、Pixel XL 可以升级 O 版本,
下载地址如下:https://developer.android.google.cn/preview/download.html#flashable-images
根据:opp4知道:是preview4,现在下载的最新版本是Android 8.0正式版本
最好采用的机器:Nexus6P:是谷歌系统,由华为代工
建议采购 Nexus6P手机做自验证,O 版本(不包括 O)以后,Nexus 设备将不会再支持 android 新系统。
Android 新系统都会 第一时间支持自家手机。 刷手机的方法:
刷机流程如下:刷机有风险,操作需谨慎
从下面地址下载对应的镜像压缩包和脚本。
https://developer.android.google.cn/preview/download.html#flashable-images
1.下载对应设备的压缩包并解压;
2.手机连上 USB 后,执行 adb reboot bootloader 命令;
3.等手机出现小机器人以后,并且显示‘unlock’字样时,执行压缩包中的 bat 脚本。
如果是‘lock‘字样:
1.连续点击设置-版本号 3 次,打开开发人员选项;
2.在开发人员选项中打开 OEM unlock;
3.连接手机到电脑,执行 adb reboot bootloader 命令到小机器人界面;
4.执行fastboot flashing unlock ,因为有些手机下面执行失败
5.执行 fastboot oem unlock,这样手机就解锁了,再使用上面的刷机方法即可。
刷机流程总结:解锁,下载镜像,执行脚本就OK了,只需要10分钟解决
没有 6P 等支持 O 版本的手机,怎么办?
A.可以使用华为终端开放实验室 OpenLab 云测试平台进行兼容性测试和远程调测。
平台介绍及使用说明:https://deveco.huawei.com/manualinstuction。
云测试平台: https://deveco.huawei.com,可以利用该平台选择 Nexus 6P 复现 O 版本的问题。
fastboot工具:Android studio里面自带了fastboot
刷机注意的问题:
1.机型和镜像系统要对应
变更的东西:
1. Google O 版本版本计划: https://developer.android.google.cn/preview/overview.html#timeline
2. Google O 版本主要行为变更: https://developer.android.google.cn/preview/behavior-changes.html#o-apps
需要重点关注 Background execution limits、Permissions 和 Security
二).Android 8.0系统的主要行为变更
分为俩部分,针对所有 API 级别的应用和针对 Android 8.0 的应用
针对所有 API 级别的应用,需要特别关注的如下几个重点
1)后台运行限制
Android 8.0 还对特定函数做出了以下变更:
如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的startForeground() 函数
3).安全相关的变化
此平台不再支持 SSLv3。在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection 不再尝试回退到之前的 TLS 协议版本并重试的权宜方法。Android 8.0 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。
现在,您的应用的 WebView 对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性。
3).隐私策略变化 AndroidID
对于在 OTA 之前安装到某个版本 Android 8.0(API 级别 26)的应用,除非在 OTA 后卸载并重新安装,否则 ANDROID_ID 的值将保持不变。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。对于安装在运行 Android 8.0 的设备上的应用,ANDROID_ID 的值现在将根据应用签署密钥和用户确定作用域。应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)。只要签署密钥相同(并且应用未在 OTA 之前安装到某个版本的 O),ANDROID_ID 的值在软件包卸载或重新安装时就不会发生变化。即使系统更新导致软件包签署密钥发生变化,ANDROID_ID 的值也不会变化。 要借助一个简单的标准系统实现应用获利,请使用广告 ID。广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。4
4).
4.记录未捕获的异常 如果某个应用安装的 Thread.UncaughtExceptionHandler 未移交给默认的 Thread.UncaughtExceptionHandler,则当出现未捕获的异常时,系统不会终止应用。从 Android 8.0 开始,在此情况下系统将记录异常堆栈跟踪情况;在之前的平台版本中,系统不会记录异常堆栈跟踪情况。
我们建议,自定义 Thread.UncaughtExceptionHandler 实现始终移交给默认处理程序处理;遵循此建议的应用不受 Android 8.0 此项变更的影响。
5.集合的处理 现在,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;之前,当集合为空时不会引发NullPointerException。此项变更使行为符合文档要求。 在 Android 8.0 中,Collections.sort() 是在 List.sort() 的基础上实现的。在 Android 7.x(API 级别 24 和 25)中,则恰恰相反。在过去,List.sort() 的默认实现会调用 Collections.sort()。
此项变更使 Collections.sort() 可以利用优化的 List.sort() 实现,但具有以下限制:
List.sort() 的实现不能调用 Collections.sort(),因为这会导致堆栈因无限递归而溢出。相反,如果您需要 List 实现的默认行为,应避免重写sort()。
如果父类以不适当的方法实现 sort() ,通常最好使用在 List.toArray()、Arrays.sort() 和 ListIterator.set() 的基础上构建的实现重写List.sort()。例如:
@Override
public void sort(Comparator super E> c) {
Object[] elements = toArray();
Arrays.sort(elements, c);
ListIterator
for (Object element : elements) {
iterator.next();
iterator.set((E) element);
}
}
public void sort(Comparator super E> c) {
Object[] elements = toArray();
Arrays.sort(elements, c);
ListIterator
for (Object element : elements) {
iterator.next();
iterator.set((E) element);
}
} 在大多数情况下,您也可以使用根据 API 级别委托给其他默认实现的实现重写 List.sort()。例如:
@Override
public void sort(Comparator super E> comparator) {
if (Build.VERSION.SDK_INT <= 25) {
Collections.sort(this);
} else {
super.sort(comparator);
}
}
public void sort(Comparator super E> comparator) {
if (Build.VERSION.SDK_INT <= 25) {
Collections.sort(this);
} else {
super.sort(comparator);
}
} 如果您选择后者只是因为您希望开发一种适用于所有 API 级别的 sort() 函数,可以考虑赋予其一个唯一的名称,例如 sortCompat(),而不是重写sort()。
现在,Collections.sort() 只是对调用 sort() 的 List 实现进行的一项结构性修改。例如,在 Android 8.0 之前的平台版本中,如果通过调用List.sort() 进行排序,则当迭代处理 ArrayList 以及在迭代过程中调用 sort() 时,会引发 ConcurrentModificationException。而Collections.sort() 则不会引发异常。
此项变更使平台行为更加一致:现在,两种方法都会引发 ConcurrentModificationException。
影响面向android O 8.0应用的:
1.后台限制 (1)startService() 将抛出 IllegalStateException (2)限制在AndroidManifest.xml中注册接收隐式广播,如ACTION_PACKAGE_REPLACED ,但也有些例外如ACTION_BOOT_COMPLETED,ACTION_LOCALE_CHANGED(所有例外参考文末连接)。(注意此部分限制都是只针对targetSdkVersion为android O,或者编译的SDK为android O及以上的的,低于的则不受影响)
2.隐私相关变化 (1)获取系统属性net.dns1、net.dns2、net.dns3 和 net.dns4不再可用 (2)不再支持 Build.SERIAL,而改为 Build.getSerial()
3.本地库变化 在Android O上强制要求Segment不能同时具备写和可执行,如数据段不可执行,代码段不可写。
4.ContentProvider的变更通知 调用 ContentResolver.notifyChange()和registerContentObserver(Uri, boolean, ContentObserver) 实现通知和监听某些Uri上的变化,在Android O上则要求uri对应的ContentProvider要正确定义,但是没有定义会有怎样的问题并没有提及
5.应用快捷方式变化
以com.android.launcher.action.INSTALL_SHORTCUT广播方式创建快捷方式不再有效,而要使用 ShortcutManager的 requestPinShortcut()方法。
3.网络连接及HTTPS相关:在connect失败之后,调用send(DatagramPacket)会抛出SocketException,以及其他一些细节的变化
6.其他 Alter Window的显示,集合排序方法的变化和获取用户帐号权限变化等。
三.Android 8.0新特性
Android O 新特性一 通知渠道 — Notification
创建通知渠道的步骤:
创建 NotificationChannel 对象,并设置应用内唯一的通知 ID。配置通知渠道的属性,比如提示声音等。在 NotificationManager 中注册通知渠道对象。
Android O 新特性二自适应图标 —Adaptive Icons
Android 的屏幕适配一直以来都折磨着不少的开发者。为了帮助开发者更好的与设备 UI 集成,Android O 支持创建自适应图标,
系统可以基于设备选择的蒙版将这些图标显示为不同形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们。
在以前的 Android 版本中,图标大小定义为 48 x 48 dp。现在你必须按照以下的规范定义你的图层大小:
两张图层大小都必须为 108 x 108 dp。图层中心 72 x 72 dp 范围为可视范围。系统会保留四周外的 36dp 范围用于生成有趣的视觉效果(如视差和跳动)。
Android O 新特性三画中画模式 — PIP
Android O 现已支持 Activity 的画中画模式。PIP 是一种多窗口显示模式,多用于视频播放,即你可以一边发微信一边看视频。
画中画模式图示
开发指南
1> 关于生命周期
PIP 模式不会改变 Activity 的生命周期。在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。当一个 Activity 处于 PIP 模式时,其实它是出在暂停状态,但其内容会继续展示。
2> API变更
在 Android O 中新增 PictureInPictureArgs 对象来指明你的 Activity 在 PIP 模式中的属性,比如长宽比等。
Android O 还新增了以下方法来支持 PIP。
Activity.enterPictureInPictureMode(PictureInPictureArgs args):将Activity置于 PIP 模式之下。Activity.setPictureInPictureArgs():用于更新 Activity 在 PIP 模式下的设置。如果 Activity 正处于 PIP 模式之下,那么更改的属性将立即生效。
参考链接
http://blog.csdn.net/w7849516230/article/details/68935953