专栏名称: Anlia
Android工程师
目录
相关文章推荐
开发者全社区  ·  兄弟的心真不是一般的大啊,还在拍呢,格局小了 ·  19 小时前  
开发者全社区  ·  爽子被by了? ·  21 小时前  
开发者全社区  ·  被三了 ·  昨天  
开发者全社区  ·  顶流男星大瓜? ·  2 天前  
开发者全社区  ·  没有大于40岁的P7了 ·  2 天前  
51好读  ›  专栏  ›  Anlia

Android 版本适配:9.0 Pie(API 级别 28)

Anlia  · 掘金  · android  · 2019-04-21 07:11

正文

阅读 11

Android 版本适配:9.0 Pie(API 级别 28)

版权声明:本文为博主原创文章,未经博主允许不得转载
文章分类:Android知识体系 - 版本适配
复制代码

一、前言

本文主要是从 官方文档 中筛选出一些常见的适配项,若有任何纰漏或需要补充的,欢迎大家在评论区指出。

二、版本适配

1. 限制 HTTP 网络请求

Android 9.0 中限制了 HTTP(明文传输)网络请求,若仍继续使用HTTP请求,则会在日志中提示以下异常(只是无法正常发出请求,不会导致应用崩溃):

java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network security policy
复制代码

适配的方法如下:

  • 在资源目录中新建一个 xml 文件,例如 xml/network_security_config.xml,然后在文件中填写以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    复制代码
  • 在AndroidManifest.xml进行配置:

    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
    复制代码

2. 弃用 Apache HTTP Client

由于官方在 Android 9.0 中移除了所有 Apache HTTP Client 相关的类,因此我们的应用或是一些第三方库如果使用了这些类,就会抛出找不到类的异常:

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;
复制代码

若需要继续使用 Apache HTTP Client ,可通过以下方法进行适配:

  • 在 AndroidManifest.xml 中添加以下内容:

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    复制代码
  • 或者在应用中直接将 Apache HTTP Client 相关的类打包并进行引用

3. 限制非 SDK 接口的调用

3.1 简述

一直以来,官方提供的接口分为了 SDK 接口和非 SDK 接口。SDK 接口即官方支持的接口,开发者可以直接调用不会有任何限制。一般而言,SDK 接口都记录在 官方的接口索引 中,没有记录的就视为非 SDK 接口,例如一些使用了 @hide 标注的方法。

以往开发者对于非 SDK 接口的调用通常是利用反射或者JNI间接调用的方式进行,但这样的调用方式如果处理不当会比较容易出现一些未知的错误。为了提升用户体验和降低应用发生崩溃的风险,Android 9.0 对应用能使用的非 SDK 接口实施了限制,具体的限制手段请见下表:

此外,为了开发者能够顺利过渡到 Android 9.0,官方对非 SDK 接口进行了分类,共分为三类, light-greylist (浅灰名单)、 dark-greylist (深灰名单)以及 blacklist (黑名单):

  • light-greylist (浅灰名单):对于此名单中的非 SDK 接口,官方暂未找到可替代的 SDK 接口,因此开发者仍可继续访问(如果 targetSdkVersion 大于等于28时会出现警告)。
  • dark-greylist (深灰名单):targetSdkVersion 小于28时仍可继续使用此名单中的接口,但会出现警告提示;大于等于28时,这些接口将会限制访问。
  • blacklist (黑名单):无论 targetSdkVersion 为多少,只要应用运行在 Android 9.0 平台上,访问此名单中的接口都会受限

3.2 如何测试应用是否使用非 SDK 接口

可以通过以下方式进行测试(详情请至 官方文档 ):







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  爽子被by了?
21 小时前
开发者全社区  ·  被三了
昨天
开发者全社区  ·  顶流男星大瓜?
2 天前
开发者全社区  ·  没有大于40岁的P7了
2 天前
美食菜谱大全  ·  你做爱吧,不用回我了
8 年前
电竞头条15W  ·  徐老师来巡山99:记者烬瞎跑拿五杀
8 年前
肌肉男训练营  ·  如何炸肩才能练得饱满宽阔?
7 年前
孤读先生  ·  每一对夫妻都是生死之交
7 年前