如何使org.apache.http.legacy与ProGuard(azure移动服务)协同工作?

问题:

我正在使用android移动服务,它依赖于androidhttpclient。

引用org.apache.http.legacy可以解决所有的问题,而且应用程序运行的很好。 然而,随着进步,我不断遇到问题。

问题在两种情况下发挥。 如果我保持导出checkbox被选中(在jave构buildpath中),我得到一个“Stub!” 如预期的exception(见下面的讨论)(请参阅我正在谈论的checkbox的截图)

在这里输入图像说明

types为“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) 

但是,如果我不选中checkbox(如build议 – 见下面的讨论),我得到和AbstractMethodErrorexception。

 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) 

使用的proguardconfiguration:

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

有没有其他人遇到这一点,并找出了它?

这是我正在使用的,允许操作系统在运行时正确replace存根方法。

 -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文件夹之外,并添加到构buildpath(使用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.** { *; }