java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactory 錯誤解決方案


環境: Android Studio 4.1.2

記錄一次簡單的出包過程遇到的問題。接入小米的sdk的時候,遇到crash,查看日志發現

    --------- beginning of crash
2021-01-29 15:18:06.435 28062-29203/? E/AndroidRuntime: FATAL EXCEPTION: Thread-18
    Process: cn.xxxxxx.xxx.mi, PID: 28062
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactory;
        at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.<init>(ThreadSafeClientConnManager.java:155)
        at com.xxxxxx.sdk.tools.HttpTools.getNewHttpClient(HttpTools.java:1918)
        at com.xxxxxx.sdk.tools.HttpTools.access$100(HttpTools.java:154)
        at com.xxxxxx.sdk.tools.HttpTools$11.run(HttpTools.java:1651)
        at java.lang.Thread.run(Thread.java:929)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.commons.logging.LogFactory" on path: DexPathList[[zip file "/data/app/cn.xxxxxx.xxx.mi-nkXbCPUYbnY7-dXsVuKWBw==/base.apk"],nativeLibraryDirectories=[/data/app/cn.xxxxxx.xxx.mi-nkXbCPUYbnY7-dXsVuKWBw==/lib/arm, /data/app/cn.xxxxxx.xxx.mi-nkXbCPUYbnY7-dXsVuKWBw==/base.apk!/lib/armeabi, /system/lib, /hw_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 org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.<init>(ThreadSafeClientConnManager.java:155) 
        at com.xxxxxx.sdk.tools.HttpTools.getNewHttpClient(HttpTools.java:1918) 
        at com.xxxxxx.sdk.tools.HttpTools.access$100(HttpTools.java:154) 
        at com.xxxxxx.sdk.tools.HttpTools$11.run(HttpTools.java:1651) 
        at java.lang.Thread.run(Thread.java:929) 

我的代碼:

private static HttpClient getNewHttpClient() {
    try { KeyStore trustStore = KeyStore.getInstance(KeyStore .getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager( params, registry); return new DefaultHttpClient(ccm, params); } catch (Exception e) { return new DefaultHttpClient(); } }

 

看上去好像是沒有 Lorg/apache/commons/logging/LogFactory 這個包, 於是我就把它下載下來給導進去

這里下載: http://commons.apache.org/proper/commons-logging/download_logging.cgi 

導進去又報了這樣一個莫名其妙的錯誤

Dex file with version '39' cannot be used with min sdk level '29'

通篇沒有找到 這個版本號在哪里設置的,這個問題找到一個方案。 我沒有嘗試  

因為我意識到可能是 由於導入的這個包引起的。

我把它重新刪掉,不報這個錯了!但是還是會引發上面的 crash。 所以我覺得是方向錯了。

后面找到這個解決方案 解決了我的問題  androidmanifest.xml 文件中添加以下庫的引用

<uses-library android:name ="org.apache.http.legacy" android:required ="false"/>

或者

build.gradle中添加下面的代碼
android {
  useLibrary 'org.apache.http.legacy'
}

 

那么問題來了,為什么會報這個問題呢?

org.apache.http.legacy.jar 是如何解決這個問題的?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM