Android O 行为变更

来源:互联网 发布:手机淘宝能修改评价吗 编辑:程序博客网 时间:2024/04/29 08:58

最近项目要适配Android O,特地去官网上学习了下,得那个小本本记下来

针对所有的API级别的应用

这个就很好理解了,不管你项目中的应用是针对那个版本,都得要遵循现在O版本中的一些规则,没有特殊性,这样就要要求开发者着重注意了

 1. 网络连接和HTTPS连接

(1)无正文的OPTIONS请求具有Content-Length:0标头。(之前是没有的)请求这一块的需要注意

(2)HttpURLConnection在包含斜线的主机或颁发机构名称后面附加一条斜线,使包含空路径的网址规范化。这个比较简单了,举个例子,http://zkhero.com需要转换为http://zkhero.com/ 。就好像我高中数学证明题,不管你会不会,你都要写个解。

(3)通过ProxySelect.setDefault()设置自定义代理选择器仅针对你选择的网址(我从来没试过,也没法提供见解了)

(4)URL不能包含空白标签,估计也是谷歌的程序员对冗余代码厌恶达到了一个新的高度了把

(5)系统对格式错误的URI会直接返回null,关于这块URI的这一块转换的需要注意了

(6)Android O在实现HttpURLConnection时不会执行不安全的TLS/SSL协议版本回退,这个在App里的自带的H5页面打开失败很常见

(7)对隧道HTTPS连接处理

*****在通过连接建立隧道HTTPS连接时,系统会在host行中正确放置端口号443,并将此信息发送至中间服务器,因为在此之前,端口号仅仅出现在CONNECT中

        *****系统不再将隧道连接请求中的user-agent和proxy-authorization标头发送至代理服务器

*****https这用到的少,一般项目中都已经封装好了自己的一些请求逻辑,咱们一般不去考虑

(8)如果执行connect()函数失败,那么send函数就会引发SocketException,这个就得考虑了,不然一直挂

(9)在回退到TCP Echo协议之前,InetAddress.isReachable会尝试ICMP.。我不懂,因为之前没碰过,知道的能不能下方留言?



2.集合的处理

主要Java中的AbstractCollection.removeAll()和AbstractCollection.retainAll() 始终会引发空指针异常,因为之前集合为空时不会引发空指针。再说,项目中也对Collection用的少,知道就行



3.记录未捕获的异常

如果某个应用安装的Thread.UncaughtExceptionHandler没有移交给默认的handler,则当出现未捕获的异常时,不会终止应用。诶,该移交的移交,省的受此变更影响



4.输入和导航

就是你点击view的地方会出现一个指示点,提醒你触摸的地方,如果你讨厌这种效果,直接子啊xml布局中设置相对应的布局中的android:defaultFoucusHighlightEnable属相为false,剩下的是便于我们开发的,不知道还是比较好的



5.提高了安全性

不再支持SSLv3;

O版本将使用安全计算SECCOMP过滤器来过滤所有应用;

没有正确实现TLS协议时不会像以前那样迁就回退之前的协议,仿佛android增加了点小脾气,哈哈;

webView的对象操作将在多进程下运行,在一个独立的进程中处理逻辑,加大了隔离;

无法假定APK驻留在一以-1或-2结尾的目录中;



6.后台执行限制

提高电池续航,当应用进入已缓存的状态,没有其他活动组件,系统将解除应用具有的所有唤醒锁;

代码中,应用无法使用其清单注册的大部分隐式广播;

在后台运行的app对后台服务的访问收到限制;

O版本中的应用在尝试在不允许其创建后台服务的情况下使用startService函数,直接会引发一个IllegalStateException;

新的Context.startForegroundService函数将启动一个前台服务。不过,应用必须在创建服务后5s内调用该服务的startForeground函数;

7.隐私性

对于安装在运行 Android O 的设备上的应用,ANDROID_ID 的值现在将根据应用签署密钥和用户确定作用域。应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)

对于在 OTA 之前安装到某个版本 Android O(API 级别 26)的应用,除非在 OTA 后卸载并重新安装,否则 ANDROID_ID 的值将保持不变。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。

只要签署密钥相同(并且应用未在 OTA 之前安装到某个版本的 O),ANDROID_ID 的值在软件包卸载或重新安装时就不会发生变化。

要借助一个简单的标准系统实现应用获利,请使用广告 ID。广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。




注意点,以上都是对于版本的,现在针对上面的应用了,注意注意

针对Android O上的应用

这些行为变更专门应用于针对 O 平台或更高平台版本的应用。针对 Android O 或更高平台版本进行编译,或将 targetSdkVersion 设为 Android O 或更高版本的应用开发者必须修改其应用以正确支持这些行为(如果适用)。

内容变更通知
Android O 更改了 ContentResolver.notifyChange ( ) 和 registerContentObserver ( Uri, boolean, ContentObserver ) 在针对 Android O 的应用中的行为方式。
现在,这些 API 需要在所有 URI 中为颁发机构定义一个有效的 ContentProvider。使用相关权限定义一个有效的 ContentProvider 可帮助您的应用防范来自恶意应用的内容变更,并防止将可能的私密数据泄露给恶意应用。

视图焦点
可点击的 View 对象现在默认也可以成为焦点。如果您希望 View 对象可点击但不可成为焦点,请在包含 View 的布局 XML 文件中将 android:focusable 属性设置为 false,或者将 false 传递至应用界面逻辑中的 setFocusable ( ) 。

权限
在 Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。

对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

例如:
假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 。应用请求 READ_EXTERNAL_STORAGE ,并且用户授予了该权限。

如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE ,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。
如果该应用针对的是 Android O,则系统此时仅会授予 READ_EXTERNAL_STORAGE ;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE ,则系统会立即授予该权限,而不会提示用户。


集合的处理

在 Android O 中,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);
}
}


现在,Collections.sort ( ) 只是对调用 sort ( ) 的 List 实现进行的一项结构性修改。例如,在 Android O 之前的平台版本中,如果通过调用 List.sort ( ) 进行排序,则当迭代处理 ArrayList 以及在迭代过程中调用 sort ( ) 时,会引发 ConcurrentModificationException。而 Collections.sort ( ) 则不会引发异常。

此项变更使平台行为更加一致:现在,两种方法都会引发 ConcurrentModificationException 。

媒体
框架会执行音频闪避。进行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 时,应用不会失去焦点。新的 API 适用于需要暂停而不是闪避的应用。请注意,此行为无法在 Android O Developer Preview 1 版本中实现。
当用户打电话时,活动的媒体流将在通话期间静音。
所有与音频相关的 API 都应使用 AudioAttributes 而不是音频流类型来说明音频播放用例。仅为音量控制继续使用音频流类型。流类型(例如,已弃用的 AudioTrack constructor)的其他用途仍然有效,但是系统会将其记录为错误。
使用 AudioTrack 时,如果应用请求了足够大的音频缓冲区,则框架将尝试使用深度缓冲区输出(如果可用)。
在 Android O 中,媒体按钮事件的处理有所不同:
在界面操作组件中处理媒体按钮未发生变化:前台操作组件在处理媒体按钮时仍然优先。
如果前台操作组件不处理媒体按钮,系统会将媒体按钮路由到最近在本地播放音频的应用。在确定哪些应用接收媒体按钮事件时,不再考虑活动状态、标志和媒体会话的播放状态。即使在应用调用 setActive( false ) 后,媒体会话仍然可以接收媒体按钮事件。
如果应用的媒体会话已经释放,系统会将媒体按钮事件发送到应用的 MediaButtonReceiver(如果有)。
对于任何其他情况,系统都会舍弃媒体按钮事件。与其开始播放错误的应用,不如不播放任何东西。


类加载行为

Android O 检查确保类加载器在加载新类时不会违反运行时假设条件。不论类引用自 Java(来自 forName ( ) )、Dalvik 字节码还是 JNI,都会执行这些检查。平台不会拦截 Java 对 loadClass ( ) 函数的直接调用,也不会检查此类调用的结果。此行为不应影响运行良好的类加载器的正常运行。

平台将检查类加载器返回的类描述符是否与预期的描述符一致。如果返回的描述符与预期不符,平台会引发 NoClassDefFoundError 错误,并在异常日志中存储一条注明不一致之处的详细错误消息。

平台还检查请求的类描述符是否有效。此检查捕获间接加载诸如 GetFieldID ( ) 等类的 JNI 调用,向这些类传递无效的描述符。例如,找不到包含 java/lang/String 签名的字段,是因为此签名无效;它应为 Ljava/lang/String; 。

这与 JNI 对 FindClass ( ) 的调用不同,其中 java/lang/String 是一个有效的完全限定名称。

Android O 不支持多个类加载器同时尝试使用相同的 DexFile 对象来定义类。尝试进行此操作,会导致 Android 运行时引发 InternalError 错误,同时显示消息 “Attempt to register dex file <filename> with multiple class loaders” 。

DexFile API 现已弃用,强烈建议您改为使用此平台的类加载器之一,包括 PathClassLoader 或 BaseDexClassLoader。

注: 您可以创建多个引用文件系统中同一个 APK 或 JAR 文件容器的类加载器。这样做通常不会占用大量内存:如果存储而不压缩容器中的 DEX 文件,平台可以对此类文件执行 mmap 操作,而不直接提取它们。但是,如果平台必须从容器中提取 DEX 文件,以这种方式引用 DEX 文件可能占用大量内存。

在 Android 中,所有类加载器都被视为支持并行运行。当多个线程争用同一个类加载器加载相同的类时,第一个完成此操作的线程胜出,而操作结果将用于其他线程。无论类加载器是返回同一个类、返回不同的类还是引发异常,都将发生此行为。该平台静默忽略此类异常。


诶,想的也累,看的也累,知道就好了,毕竟国内厂商有专门的人才去弄这个,我只是站在巨人的肩膀上远看风景,真叫我上还不行咧


原创粉丝点击