Как сделать org.apache.http.legacy работать с ProGuard (azure mobile services)?

Проблема:

Я использую мобильные службы Android, которые полагаются на androidhttpclient.

Ссылка на org.apache.http.legacy разрешает все проблемы, и приложение работает нормально. Однако, с proguard, я постоянно сталкиваюсь с проблемами.

Проблема разыгрывается в двух сценариях. Если я поставлю флажок экспорта (в пути построения jave), я получаю «Stub!». Исключение, как ожидалось (см. Обсуждение ниже) (см. Снимок экрана, для которого я использую флажок)

Введите описание изображения здесь

Сбой во время выполнения типа: «Stub!»:

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:

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

Кто-нибудь еще сталкивался с этим и понял это?

Solutions Collecting From Web of "Как сделать org.apache.http.legacy работать с ProGuard (azure mobile services)?"

Вот то, что я использую, позволяя ОС правильно заменить запущенные методы во время выполнения.

 -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 .

Вы правы, не экспортируете устаревшую Apache lib. Однако он должен быть расположен за пределами папки libs и добавлен в путь сборки (при использовании Eclipse). В противном случае он будет экспортироваться в любом случае с вашими Android Private Libraries .

Я использую GMS, Volley и AndroidHttpClient в своих классах общения. Вот что мне нужно было добавить к настройкам 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.** { *; }