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

性能优化
Android 性能优化(六) RelativeLayout和LinearLayout性能比较




原理和源码分析
1.Android Binder 作为 IPC 机制原理和面试回答   


异步任务源码分析



线程:



UI,view和动画框架




本文将从以下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       需要翻墙才能用


6. Google O 版本的 O-正式版  source code 下载方法: <a href=""https://source.android.com/source/downloading.html">https://source.android.com/source/downloading.html 

7. 目前 Nexus5X、Nexus6P、Nexus Player、Pixel C、Pixel、Pixel XL 可以升级 O 版本,

根据:opp4知道:是preview4,现在下载的最新版本是Android 8.0正式版本
  


最好采用的机器:Nexus6P:是谷歌系统,由华为代工

      建议采购 Nexus6P手机做自验证,O 版本(不包括 O)以后,Nexus 设备将不会再支持 android 新系统。
Android 新系统都会 第一时间支持自家手机。 刷手机的方法:

刷机流程如下:刷机有风险,操作需谨慎

从下面地址下载对应的镜像压缩包和脚本。



 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.机型和镜像系统要对应

变更的东西:
 需要重点关注 Background execution limits、Permissions 和 Security 

二).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<E> iterator = (ListIterator<Object>) 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);
      }
    }

    如果您选择后者只是因为您希望开发一种适用于所有 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



创建通知渠道的步骤:

  1. 创建 NotificationChannel 对象,并设置应用内唯一的通知 ID。
  2. 配置通知渠道的属性,比如提示声音等。
  3. 在 NotificationManager 中注册通知渠道对象。

Android O 新特性二自适应图标 —Adaptive Icons

Android 的屏幕适配一直以来都折磨着不少的开发者。为了帮助开发者更好的与设备 UI 集成,Android O 支持创建自适应图标,
系统可以基于设备选择的蒙版将这些图标显示为不同形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们。




在以前的 Android 版本中,图标大小定义为 48 x 48 dp。现在你必须按照以下的规范定义你的图层大小:

  1. 两张图层大小都必须为 108 x 108 dp。
  2. 图层中心 72 x 72 dp 范围为可视范围。
  3. 系统会保留四周外的 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。

  1. Activity.enterPictureInPictureMode(PictureInPictureArgs args):将Activity置于 PIP 模式之下。
  2. Activity.setPictureInPictureArgs():用于更新 Activity 在 PIP 模式下的设置。如果 Activity 正处于 PIP 模式之下,那么更改的属性将立即生效。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WHB20081815/article/details/75669925
个人分类: android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭