原因导向:项目在逐步适配targetSdkVersion,当Android P(9.0)手机问世后,出现了大面积的崩溃,后来定位到由于使用了org/apache/http/client/methods/HttpGet类,但是类缺失导致了crash。然后调研后发现Apache Http相关的类确实是在Android P版本的系统的rootclasspath去掉了,但是谷歌做了一个兼容:如果应用的targetSdkVersion<P,系统会把apache的类预加到应用自己的classpath中,所以应用自己的classloader还是能正常找到apache的类,但是如果应用指定使用系统的classpath加载apache的类就会有问题,会报这个异常(系统classpath获取的指的是ClassLoader.getSystemClassLoader()
,一般插件中代码的预加载使用的就是系统的classloader)。
调研分析结论:
关于apache的问题,这里分开来进行调研分析:
1、targetSdkVersion<28(P)时,Android28手机和小于28的手机
2、targetSdkVersion>=28(P)时,Android28手机和小于28的手机
针对应用(非插件化)targetSdkVersion和Android系统版本中是否包含Apache Http相关类结论:
targetSdkVersion / Android手机系统版本 | 应用ClassLoader是否包含Apache Http |
---|---|
targetSdkVersion<28 / >=Android P | 是 |
targetSdkVersion<28 / <Android P | 是 |
targetSdkVersion>28 / >=Android P | 否 |
targetSdkVersion>28 / <Android P | 是 |
Apache Http在Android 版本的变更:
1、Android API 23中已经开始不提供