¿Cómo hacer que org.apache.http.legacy funcione con ProGuard (azure mobile services)?
El problema:
Estoy utilizando los servicios móviles android, que se basa en androidhttpclient.
- Exportación de un proyecto de Android durante el uso de proguard en adt & sdk 20
- Android: ¿Es seguro poner una cadena sensible en mi código Java?
- Error de ejecución de Android para la aplicación de tarea: proguardRelease
- Proguard elimina el código no utilizado (en Android)
- ¿Dexguard evita grietas simples de LVL?
Hacer referencia a org.apache.http.legacy resuelve todos los problemas y la aplicación se ejecuta correctamente. Sin embargo, con proguard en, sigo corriendo en los problemas.
El problema se desarrolla en dos escenarios. Si mantengo la casilla de verificación de exportación marcada (en el camino de construcción de jave), obtengo un 'Stub!' Excepción como se esperaba (ver discusión a continuación) (ver captura de pantalla de la que estoy hablando)
El tiempo de ejecución de tipo: "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)
Si, sin embargo, mantengo la casilla desmarcada (como se sugiere – vea la discusión a continuación), me sale y AbstractMethodError excepción.
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 utilizado:
-dontwarn org.apache.http.** -dontwarn android.net.http.** -dontwarn com.microsoft.windowsazure.mobileservices.**
¿Alguien más se ha topado con esto y lo ha descubierto?
- AssertionError en Gson EnumTypeAdapter cuando se utiliza Proguard Obfuscation
- Android pesadilla proguard
- Android Proguard saltar el frasco externo
- Android form build.xml con proguard no se construye en la versión
- Proguard eliminando anotaciones en la aplicación de Android
- El uso de MultiDex en Android App ejecuta ProGuard dos veces y sólo segunda vez con Advertencias / Notas?
- Proguard con la colección parametrizada orrmlite
- Android obfuscate aplicación utilizando proguard mantiene obfuscating frascos de la biblioteca - o es?
Esto es lo que estoy usando, permitiendo que el sistema operativo reemplace correctamente los métodos stubbed en tiempo de ejecución.
-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.**
Se trata de todos los paquetes de stubbed proporcionados por org.apache.http.legacy.jar
.
Tienes razón al no exportar el legacy apache lib. Sin embargo, tiene que estar ubicado fuera de la carpeta libs
y agregado a la ruta de compilación (cuando se utiliza Eclipse). De lo contrario se exporta de todos modos con sus Android Private Libraries
.
Estoy usando GMS, Volley y AndroidHttpClient en mis propias clases de comunicación. Esto es lo que tuve que añadir a la configuración 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.** { *; }