9

समस्या:ProGuard (Azure मोबाइल सेवाओं) के साथ org.apache.http.legacy कैसे काम करें?

मैं एंड्रॉइड मोबाइल सेवाओं का उपयोग कर रहा हूं, जो एंड्रॉइडhttpclient पर निर्भर करता है।

संदर्भ org.apache.http.legacy सभी समस्याओं का समाधान करता है और ऐप ठीक ठीक चलता है। हालांकि, प्रोजेक्ट के साथ, मैं मुद्दों में भाग लेता रहता हूं।

समस्या दो परिदृश्यों में निभाती है। अगर मैं निर्यात चेकबॉक्स चेक करता हूं (जेव बिल्ड पथ में), मुझे 'स्टब!' मिलता है अपवाद के रूप में उम्मीद (नीचे चर्चा को देखें) (स्क्रीनशॉट देखें जिसके लिए मैं के बारे में बात कर रहा हूँ चेकबॉक्स)

enter image description here

प्रकार के क्रम दुर्घटना: "स्टब":

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stuffd/com.stuffd.MainActivity}: java.lang.RuntimeException: Stub! 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2345) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405) 
     at android.app.ActivityThread.access$800(ActivityThread.java:149) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:211) 
     at android.app.ActivityThread.main(ActivityThread.java:5317) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
Caused by: java.lang.RuntimeException: Stub! 
    at org.apache.http.message.AbstractHttpMessage.(AbstractHttpMessage.java:7) 
    at org.apache.http.client.methods.HttpRequestBase.(HttpRequestBase.java:7) 
    at org.apache.http.client.methods.HttpGet.(HttpGet.java:8) 
    at com.microsoft.windowsazure.mobileservices.table.MobileServiceJsonTable.executeGetRecords(MobileServiceJsonTable.java:952) 
    at com.microsoft.windowsazure.mobileservices.table.MobileServiceJsonTable.executeUrlQuery(MobileServiceJsonTable.java:183) 
    at com.microsoft.windowsazure.mobileservices.table.MobileServiceJsonTable.execute(MobileServiceJsonTable.java:160) 
    at com.microsoft.windowsazure.mobileservices.table.MobileServiceTable.execute(MobileServiceTable.java:158) 
    at com.microsoft.windowsazure.mobileservices.table.MobileServiceTable.execute(MobileServiceTable.java:249) 
    at com.microsoft.windowsazure.mobileservices.table.query.ExecutableQuery.execute(ExecutableQuery.java:101) 

यदि फिर भी, मैं चेकबॉक्स को अनचेक करता हूं (जैसा कि सुझाया गया है - नीचे चर्चा देखें), मुझे मिलता है और AbstractMethodError अपवाद।

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:300) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:811) 
Caused by: java.lang.AbstractMethodError: abstract method "java.lang.String org.apache.http.client.methods.HttpRequestBase.getMethod()" 
     at android.net.http.AndroidHttpClient.getMethod(AndroidHttpClient.java:283) 
     at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:301) 

ProGuard config इस्तेमाल किया:

-dontwarn org.apache.http.** 
-dontwarn android.net.http.** 
-dontwarn com.microsoft.windowsazure.mobileservices.** 

किसी और को इस में चलाने की है और यह पता लगा लिया गया है?

+0

सुनिश्चित नहीं हैं कि उपकरणों का उपयोग कर रहे बनाते हैं लेकिन सामान्य शब्दों में, अपने प्रोजेक्ट में ठूंठ पुस्तकालय लिंक न करें। एक प्रदत्त निर्भरता के रूप में बस इसके खिलाफ निर्माण करें। –

+0

@ केविन क्रुमविइड यह एक चीज है, org.apache.http.legacy को स्टब लाइब्रेरी नहीं माना जाता है ... एक और लिंक मिला है जो यह क्लासपाथ ऑर्डरिंग समस्या है (https://groups.google.com/forum/#!topic/robolectric/guRK1b8aEIQ), लेकिन चीजों को चारों ओर ले जाने में मदद नहीं लगती है। – rothschild86

+2

हां, यह एक स्टब लाइब्रेरी माना जाता है। संपूर्ण एंड्रॉइड एसडीके एक स्टब लाइब्रेरी है। अपाचे HTTP अभी भी एपीआई 23 उपकरणों पर मौजूद है। इसके उपयोग को और हतोत्साहित करने के लिए इसे मुख्य स्टब लाइब्रेरी से बाहर ले जाया गया था। –

उत्तर

12

यहां मैं जो उपयोग कर रहा हूं, ओएस को रनटाइम पर स्टब किए गए तरीकों को सही ढंग से बदलने की अनुमति देता है।

-keep class org.apache.http.** { *; } 
-keep class org.apache.commons.codec.** { *; } 
-keep class org.apache.commons.logging.** { *; } 
-keep class android.net.compatibility.** { *; } 
-keep class android.net.http.** { *; } 
-dontwarn org.apache.http.** 
-dontwarn android.webkit.** 

यह org.apache.http.legacy.jar द्वारा प्रदान किए गए सभी स्टब किए गए पैकेज हैं।

+0

योगदान के लिए धन्यवाद। अभी भी मेरे मामले में एक स्टब/अमूर्त रनटाइम अपवाद ... – rothschild86

+0

इस उत्तर को अधिक ध्यान देने की आवश्यकता है - यह एकमात्र समाधान था जिसने मुझे प्रोजेवार्ड के साथ एक्लिप्स का उपयोग करके एसडीके 23 संकलित करने की अनुमति दी। – mike47

+1

@ माइकजिप यह अब तक का एकमात्र उत्तर है :) बीटीडब्ल्यू, भले ही मेरा संकलन हुआ, मुझे रनटाइम त्रुटियां मिलना शुरू हो गया ... – rothschild86

0

आप विरासत अपाचे lib का निर्यात नहीं कर रहे हैं। हालांकि इसे libs फ़ोल्डर के बाहर स्थित होना है और बिल्ड पथ में जोड़ा गया है (ग्रहण का उपयोग करते समय)। अन्यथा यह आपके Android Private Libraries के साथ वैसे भी निर्यात किया जाता है।

मैं अपने स्वयं के संचार कक्षाओं में जीएमएस, वॉली और एंड्रॉइडहट्प क्लाइंट का उपयोग कर रहा हूं। यहाँ मैं क्या ProGuard सेटिंग्स में जोड़ने के लिए किया था है:

-dontwarn org.apache.http.** 
-dontwarn com.google.android.gms.** 
-dontwarn com.android.volley.toolbox.** 
-dontwarn com.myapp.communication.** 
-keep class com.google.android.gms.** { *; } 
संबंधित मुद्दे