環境: 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 是如何解決這個問題的?