详解Android版本适配:9.0派

  

  

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

  

  

1。限制HTTP网络请求

  

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

        java.net.UnknownServiceException: xxx明文通信网络安全策略不允许的      

适配的方法如下:

  

第一种   

在资源目录中新建一个xml文件作为网络安全配置文件,例如xml/network_security_config.xml,然后在文件中填写以下内容:

        & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt; network-security-config>   & lt; base-config cleartextTrafficPermitted=" true "/比;   & lt;/network-security-config>      之前      

,在AndroidManifest.xml进行配置:

        & lt;应用程序   …   android: networkSecurityConfig=癅xml/network_security_config”比;   …   & lt;/application>      

第二种(感谢AllenChiang同学的提醒)

  

Android 6.0中引入了是否允许网络使用明文传输的配置:

        & lt;应用android: usesCleartextTraffic=[“true”|“false”)在      

原来默认为真实,但在Android 9.0中默认值改为了假,因此将配置手动设为true即可解决明文传输被限制的问题

  

  

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

        . lang。NoClassDefFoundError:失败的决议:Lorg/apache/http/康涅狄格州/计划/SchemeRegistry;      

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

  

在AndroidManifest。xml中添加以下内容:

        & lt; uses-library android: name=" org.apache.http。遗产”android:要求=" false "/祝辞      

或者在应用中直接将Apache HTTP客户机相关的类打包并进行引用

  

  

3.1简述   

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

  

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

  

详解Android版本适配:9.0派”> </p>
  <p>此外,为了开发者能够顺利过渡到Android 9.0,官方对非SDK接口进行了分类,共分为三类,light-greylist(浅灰名单),dark-greylist(深灰名单)以及黑名单(黑名单):</p>
  <ol>
  <李> light-greylist(浅灰名单):对于此名单中的非SDK接口,官方暂未找到可替代的SDK接口,因此开发者仍可继续访问(如果targetSdkVersion大于等于28日时会出现警告)。</李>
  <李> dark-greylist(深灰名单):targetSdkVersion小于28日时仍可继续使用此名单中的接口,但会出现警告提示;大于等于28日时,这些接口将会限制访问。</李>
  <李>黑名单(黑名单):无论targetSdkVersion为多少,只要应用运行在Android 9.0平台上,访问此名单中的接口都会受限</李>
  </ol>
  <p> 3.2如何测试应用是否使用非SDK接口</p>
  <p>可以通过以下方式进行测试(详情请至官方文档):</p>
  <ol>
  <李>使用Android 9.0或更高版本的设备调试应用李</>
  <李>使用StrictMode API进行测试李</>
  <李>使用veridex工具对应用进行扫描李</>
  </ol>
  <p>建议使用第三种方式,该工具的扫描结果会列出应用对于三个限制名单中的接口的调用细节。</p>
  <p> </p>
  <p>在Android 9.0中,应用在使用前台服务之前必须先申请FOREGROUND_SERVICE权限,否则就会抛出SecurityException异常。</p>
  <p>此外,由于FOREGROUND_SERVICE权限只是普通权限,因此开发者只需在AndroidManifest。xml中注册此权限即可,系统会自动对此权限进行授权:<h2 class=详解Android版本适配:9.0派