2012-12-12 60 views
4

這是例外的核心:使用的HttpClient 4.2.2的Android

12-12 10:37:50.090: E/AndroidRuntime(8277): Caused by: java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init> 

我使用Apache的HttpClient 4.2.2。但是,Android已經決定使用捆綁過時的Apache httpclient庫是一個更好的選擇。

如何避免此異常?

以防萬一:更改org.apache命名空間不是一個選項,因爲此異常正在由閉源庫引發。

回答

3

但是,Android已經決定使用捆綁過時的Apache httpclient庫是一個更好的選擇。

谷歌關心向後兼容性。 正如您所發現的,HttpClient具有不同版本的API,因此如果Google升級了HttpClient,所有現有的應用程序都會中斷。 Google需要維護一個一致的公共API,以便爲Android 1.x編寫的應用程序可以在Android 4.x上運行等。不幸的是,谷歌選擇了一個版本的HttpClient,導致與新版HttpClient版本的公共API快速分手。

如何避免此異常?

使用jarjar或等效於將您的HttpClient庫的副本重構爲不同的包名稱,然後使用它。

更改org.apache命名空間不是一個選項,因爲此異常是由閉源庫引發的。

然後用別的東西替換閉源庫。顯然,如果閉源庫需要HttpClient 4.2.2,那麼該閉源庫不能在Android上工作,並且不受其Android開發人員的支持。即使您要過關HttpClient問題(例如,通過ROM模塊 - 請參閱下文),該庫在與Android的兼容性方面可能還存在其他問題。

或者,下載Android源代碼,用您自己的版本替換HttpClient版本,構建修改後的Android源代碼,將結果倒入ROM模塊,然後在您需要的設備上安裝ROM模塊。一路上,一定要測試任何現有的應用程序,以確保它們不會因爲您的更改而中斷(最可能使用HttpUrlConnection,但它們可能不會)。

+0

>的HttpClient有不同的不同的API版本,所以如果Google升級了HttpClient,所有現有的應用程序都會中斷。這是不正確的。 HttpClient 4.x GA版本完全向後兼容。 Google將Android 1.0推向市場時,Google採取了任意的HttpClient ALPHA快照,並希望Apache HttpClient保持與其完全二進制兼容。 – oleg

+0

@oleg:「Google採取了HttpClient的任意ALPHA快照」 - 是的,這絕對是不幸的。 「然後希望Apache HttpClient保留完整的二進制兼容性」 - 谷歌並沒有「期待」Apache做任何事情。如果Google採納了GA版本,Google可能會暫時升級HttpClient,直到Apache決定改變公共API(請參閱:3.x-> 4.x)。但是,我所引用的陳述仍然是正確的,因爲我並未將「不同版本」限制爲僅限GA或僅限於次要版本。話雖如此,我會努力在我的答案中改進語言。 – CommonsWare

+0

除非您在該時間點訂閱了HC開發人員名單,否則您可能不知道Google會提供一份非正式協議,以表明Google會在可用時選擇HC 4.0 GA。基於這一點,慧聰開發團隊同意過早凍結未完成的API,然後逐步改進,逐漸棄用舊代碼。 – oleg