Android P模拟器运行应用崩溃:java.lang.NoClassDefFoundError问题求助
解决Android P模拟器上
java.lang.NoClassDefFoundError: org/apache/http/ProtocolVersion崩溃问题 Hey,这个问题我之前适配Android 9的时候碰到过,核心原因是Android 9.0(API 28)默认移除了对Apache HTTP客户端库的支持,虽然你已经加了useLibrary 'org.apache.http.legacy',但大概率是配置没到位或者漏了关键步骤,给你一步步拆解解决方案:
1. 确认useLibrary的配置位置是否正确
看你贴的build.gradle代码,useLibrary虽然加了,但要确保它放在android闭包的顶级位置,和compileSdkVersion、buildToolsVersion同级,不能嵌套在其他子闭包里。正确的结构应该是这样:
android { compileSdkVersion 'android-P' buildToolsVersion '28-rc1' // 必须放在这里,和其他顶级配置平级 useLibrary 'org.apache.http.legacy' compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' } defaultConfig { // 你的默认配置内容... } }
2. 给AndroidManifest.xml添加关键meta-data
光有Gradle配置还不够,得在AndroidManifest.xml的<application>标签里加一行meta-data,强制系统加载遗留的Apache HTTP库:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" ...> <!-- 新增这行配置 --> <meta-data android:name="org.apache.http.legacy" android:value="true" /> <!-- 其他activity、service等配置... --> </application>
3. 排查依赖冲突(如果前两步没解决)
要是上面两步做完还是崩溃,那可能是项目里的第三方依赖和Apache HTTP库有冲突。你可以执行以下命令查看项目的依赖树:
# Mac/Linux环境 ./gradlew app:dependencies # Windows环境 gradlew.bat app:dependencies
看看有没有重复引入的Apache HTTP相关依赖,如果有,要么升级对应的第三方库版本,要么用exclude语法把冲突的模块去掉,比如:
implementation('com.example.somelibrary:1.0.0') { exclude group: 'org.apache.httpcomponents' }
额外小建议
- 尽量把
compileSdkVersion换成正式的28,而不是预览版的android-P,预览版可能存在一些兼容性坑; - 长远来看,建议慢慢迁移到
OkHttp或者HttpURLConnection这些官方推荐的HTTP客户端,毕竟Apache HTTP库已经被弃用,后续版本的支持会越来越少。
内容的提问来源于stack exchange,提问作者dukeking
相关产品推荐
相关产品推荐

