版权声明:本文为博主原创文章,未经博主允许不得转载
文章分类: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 接口
可以通过以下方式进行测试(详情请至 官方文档 ):