背景
在做的一个APP项目,原来是在Android 7(N版本)上运行,一直没有问题
近期,设备升级到Android 10版本,在进行新设备适配时,出现了一系列问题。
其中一个问题,如下:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;
at com.baidu.tts.e.a.c(StatHelper.java:192)
at com.baidu.tts.e.a.a(StatHelper.java:154)
at com.baidu.tts.e.a.b(StatHelper.java:130)
at com.baidu.tts.e.a.a(StatHelper.java:88)
at com.baidu.tts.e.b.run(StatThread.java:19)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.message.BasicNameValuePair" on path: DexPathList[[zip file "/data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/lib/arm, /data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/base.apk!/lib/armeabi-v7a, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 5 more
java.lang.ClassNotFoundException: Didn't find class "org.apache.http.message.BasicNameValuePair" on path: DexPathList[[zip file "/data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/lib/arm, /data/app/com.xxx.xxx-NsL2k6wjYuweN22e0DY_oQ==/base.apk!/lib/armeabi-v7a, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.baidu.tts.e.a.c(StatHelper.java:192)
at com.baidu.tts.e.a.a(StatHelper.java:154)
at com.baidu.tts.e.a.b(StatHelper.java:130)
at com.baidu.tts.e.a.a(StatHelper.java:88)
at com.baidu.tts.e.b.run(StatThread.java:19)
方法一
android {
defaultConfig {
// 1.加入这句话
useLibrary 'org.apache.http.legacy'
}
packagingOptions {
// 2.加入这句话
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
//3.加入这句话
api 'org.apache.httpcomponents:httpclient:4.4.1'
}
一开始,按照方法一修改,虽然解决了这个问题;
但是,引入了新的问题,项目中使用的百度语音合成播报功能失效了。
因为使用的是在线语音合成功能,所以每次语音合成播报时,都会发送网络请求进行合成,会出现如下错误:
(1) debug模式运行时,虽然不会崩溃,但报错如下:
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:146)
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.run(AsyncHttpRequest.java:107)
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.SyncHttpClient.sendRequest(SyncHttpClient.java:93)
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpClient.post(AsyncHttpClient.java:1043)
2021-05-21 14:59:11.903 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.a(OnlineSynthesizer.java:314)
2021-05-21 14:59:11.904 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.call(OnlineSynthesizer.java:255)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:146)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.run(AsyncHttpRequest.java:107)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.SyncHttpClient.sendRequest(SyncHttpClient.java:93)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpClient.post(AsyncHttpClient.java:1043)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.a(OnlineSynthesizer.java:314)
2021-05-21 14:59:11.908 23528-23797/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.call(OnlineSynthesizer.java:255)
2021-05-21 14:59:32.100 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:146)
2021-05-21 14:59:32.100 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)
2021-05-21 14:59:32.101 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.run(AsyncHttpRequest.java:107)
2021-05-21 14:59:32.101 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.SyncHttpClient.sendRequest(SyncHttpClient.java:93)
2021-05-21 14:59:32.101 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpClient.post(AsyncHttpClient.java:1043)
2021-05-21 14:59:32.101 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.a(OnlineSynthesizer.java:314)
2021-05-21 14:59:32.101 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.call(OnlineSynthesizer.java:255)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:146)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpRequest.run(AsyncHttpRequest.java:107)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.SyncHttpClient.sendRequest(SyncHttpClient.java:93)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.loopj.AsyncHttpClient.post(AsyncHttpClient.java:1043)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.a(OnlineSynthesizer.java:314)
2021-05-21 14:59:32.107 23528-23812/com.xxx.xxx W/System.err: at com.baidu.tts.b.a.b.f$a.call(OnlineSynthesizer.java:255)
(2) release模式运行时,直接崩溃,报错如下:
java.lang.NoClassDefFoundError: com.baidu.tts.loopj.MySSLSocketFactory
at com.baidu.tts.loopj.MySSLSocketFactory.getFixedSocketFactory(MySSLSocketFactory.java:169)
at com.baidu.tts.loopj.AsyncHttpClient.getDefaultSchemeRegistry(AsyncHttpClient.java:208)
at com.baidu.tts.loopj.AsyncHttpClient.<init>(AsyncHttpClient.java:179)
at com.baidu.tts.loopj.SyncHttpClient.<init>(SyncHttpClient.java:68)
at com.baidu.tts.e.a.a(StatHelper.java:160)
at com.baidu.tts.e.a.b(StatHelper.java:130)
at com.baidu.tts.e.a.a(StatHelper.java:88)
at com.baidu.tts.e.b.run(StatThread.java:19)
Caused by: java.lang.ExceptionInInitializerError
at org.apache.http.e.d.j.<clinit>(SSLSocketFactory.java:151)
at com.baidu.tts.loopj.MySSLSocketFactory.getFixedSocketFactory(MySSLSocketFactory.java:169)
at com.baidu.tts.loopj.AsyncHttpClient.getDefaultSchemeRegistry(AsyncHttpClient.java:208)
at com.baidu.tts.loopj.AsyncHttpClient.<init>(AsyncHttpClient.java:179)
at com.baidu.tts.loopj.SyncHttpClient.<init>(SyncHttpClient.java:68)
at com.baidu.tts.auth.c.d(OnlineAuth.java:132)
at com.baidu.tts.auth.c.call(OnlineAuth.java:32)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.baidu.tts.k.c.a(Memorizer.java:51)
at com.baidu.tts.auth.a$b.a(AuthClient.java:125)
at com.baidu.tts.auth.a$b.call(AuthClient.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:761)
Caused by: org.apache.a.b.b: The chosen LogFactory implementation does not extend LogFactory. Please check your configuration. (Caused by java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.)
at org.apache.a.b.c.a(LogFactory.java:1154)
at org.apache.a.b.e.run(LogFactory.java:960)
at java.security.AccessController.doPrivileged(AccessController.java:41)
at org.apache.a.b.c.a(LogFactory.java:957)
at org.apache.a.b.c.a(LogFactory.java:624)
at org.apache.a.b.c.b(LogFactory.java:655)
at org.apache.http.e.d.a.<init>(AbstractVerifier.java:60)
at org.apache.http.e.d.b.<init>(AllowAllHostnameVerifier.java:43)
at org.apache.http.e.d.b.<clinit>(AllowAllHostnameVerifier.java:45)
... 13 more
Caused by: java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.
at org.apache.a.b.c.a(LogFactory.java:1108)
... 21 more
java.lang.ExceptionInInitializerError
at org.apache.http.e.d.j.<clinit>(SSLSocketFactory.java:151)
at com.baidu.tts.loopj.MySSLSocketFactory.getFixedSocketFactory(MySSLSocketFactory.java:169)
at com.baidu.tts.loopj.AsyncHttpClient.getDefaultSchemeRegistry(AsyncHttpClient.java:208)
at com.baidu.tts.loopj.AsyncHttpClient.<init>(AsyncHttpClient.java:179)
at com.baidu.tts.loopj.SyncHttpClient.<init>(SyncHttpClient.java:68)
at com.baidu.tts.auth.c.d(OnlineAuth.java:132)
at com.baidu.tts.auth.c.call(OnlineAuth.java:32)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.baidu.tts.k.c.a(Memorizer.java:51)
at com.baidu.tts.auth.a$b.a(AuthClient.java:125)
at com.baidu.tts.auth.a$b.call(AuthClient.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:761)
Caused by: org.apache.a.b.b: The chosen LogFactory implementation does not extend LogFactory. Please check your configuration. (Caused by java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.)
at org.apache.a.b.c.a(LogFactory.java:1154)
at org.apache.a.b.e.run(LogFactory.java:960)
at java.security.AccessController.doPrivileged(AccessController.java:41)
at org.apache.a.b.c.a(LogFactory.java:957)
at org.apache.a.b.c.a(LogFactory.java:624)
at org.apache.a.b.c.b(LogFactory.java:655)
at org.apache.http.e.d.a.<init>(AbstractVerifier.java:60)
at org.apache.http.e.d.b.<init>(AllowAllHostnameVerifier.java:43)
at org.apache.http.e.d.b.<clinit>(AllowAllHostnameVerifier.java:45)
... 13 more
Caused by: java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.
at org.apache.a.b.c.a(LogFactory.java:1108)
... 21 more
org.apache.a.b.b: The chosen LogFactory implementation does not extend LogFactory. Please check your configuration. (Caused by java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.)
at org.apache.a.b.c.a(LogFactory.java:1154)
at org.apache.a.b.e.run(LogFactory.java:960)
at java.security.AccessController.doPrivileged(AccessController.java:41)
at org.apache.a.b.c.a(LogFactory.java:957)
at org.apache.a.b.c.a(LogFactory.java:624)
at org.apache.a.b.c.b(LogFactory.java:655)
at org.apache.http.e.d.a.<init>(AbstractVerifier.java:60)
at org.apache.http.e.d.b.<init>(AllowAllHostnameVerifier.java:43)
at org.apache.http.e.d.b.<clinit>(AllowAllHostnameVerifier.java:45)
at org.apache.http.e.d.j.<clinit>(SSLSocketFactory.java:151)
at com.baidu.tts.loopj.MySSLSocketFactory.getFixedSocketFactory(MySSLSocketFactory.java:169)
at com.baidu.tts.loopj.AsyncHttpClient.getDefaultSchemeRegistry(AsyncHttpClient.java:208)
at com.baidu.tts.loopj.AsyncHttpClient.<init>(AsyncHttpClient.java:179)
at com.baidu.tts.loopj.SyncHttpClient.<init>(SyncHttpClient.java:68)
at com.baidu.tts.auth.c.d(OnlineAuth.java:132)
at com.baidu.tts.auth.c.call(OnlineAuth.java:32)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.baidu.tts.k.c.a(Memorizer.java:51)
at com.baidu.tts.auth.a$b.a(AuthClient.java:125)
at com.baidu.tts.auth.a$b.call(AuthClient.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.
at org.apache.a.b.c.a(LogFactory.java:1108)
... 21 more
java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'org.apache.a.b.c'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.
at org.apache.a.b.c.a(LogFactory.java:1108)
at org.apache.a.b.e.run(LogFactory.java:960)
at java.security.AccessController.doPrivileged(AccessController.java:41)
at org.apache.a.b.c.a(LogFactory.java:957)
at org.apache.a.b.c.a(LogFactory.java:624)
at org.apache.a.b.c.b(LogFactory.java:655)
at org.apache.http.e.d.a.<init>(AbstractVerifier.java:60)
at org.apache.http.e.d.b.<init>(AllowAllHostnameVerifier.java:43)
at org.apache.http.e.d.b.<clinit>(AllowAllHostnameVerifier.java:45)
at org.apache.http.e.d.j.<clinit>(SSLSocketFactory.java:151)
at com.baidu.tts.loopj.MySSLSocketFactory.getFixedSocketFactory(MySSLSocketFactory.java:169)
at com.baidu.tts.loopj.AsyncHttpClient.getDefaultSchemeRegistry(AsyncHttpClient.java:208)
at com.baidu.tts.loopj.AsyncHttpClient.<init>(AsyncHttpClient.java:179)
at com.baidu.tts.loopj.SyncHttpClient.<init>(SyncHttpClient.java:68)
at com.baidu.tts.auth.c.d(OnlineAuth.java:132)
at com.baidu.tts.auth.c.call(OnlineAuth.java:32)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.baidu.tts.k.c.a(Memorizer.java:51)
at com.baidu.tts.auth.a$b.a(AuthClient.java:125)
at com.baidu.tts.auth.a$b.call(AuthClient.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:761)
方法二
<application
...
>
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
于是,按照方法二修改了清单文件,解决了这个问题。
参考链接: