9

Das Problem:Wie kann org.apache.http.legacy mit ProGuard (azure mobile services) funktionieren?

Ich benutze Android mobile Dienste, die auf androidhttpclient beruht.

Referenzieren org.apache.http.legacy behebt alle Probleme und die App läuft einwandfrei. Mit Progress geht es aber immer wieder um Probleme.

Das Problem tritt in zwei Szenarien auf. Wenn ich das Export-Kontrollkästchen aktiviere (im Jave-Build-Pfad), bekomme ich einen "Stub!" Ausnahme wie erwartet (siehe Diskussion unten) (siehe Screenshot für die Checkbox ich spreche)

enter image description here

Die Runtime-Crash vom Typ: "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) 

Wenn jedoch Ich habe das Kontrollkästchen deaktiviert (wie vorgeschlagen - siehe unten), bekomme ich und AbstractMethodError Ausnahme.

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

Hat jemand in diesem Lauf und hat es herausgefunden?

+0

nicht sicher, was bauen Werkzeuge, die Sie verwenden, aber im Allgemeinen, verknüpfen die Stub-Bibliothek in Ihr Projekt. Bauen Sie dagegen als bereitgestellte Abhängigkeit auf. –

+0

@KevinKrumwiede das ist eine Sache, org.apache.http.legacy sollte nicht eine Stub-Bibliothek sein ... fand einen anderen Link, der darauf hinweist, dass es ein Klassenpfad-Bestellproblem ist (https://groups.google.com/forum/#!topic/robolectric/guRK1b8aEIQ), aber Dinge zu bewegen scheint nicht zu helfen. – rothschild86

+2

Ja, es soll eine Stub-Bibliothek sein. Das gesamte Android SDK ist eine Stub-Bibliothek. Apache HTTP ist weiterhin auf API 23-Geräten vorhanden. Es wurde gerade aus der Hauptstubbibliothek entfernt, um seine Verwendung weiter zu verhindern. –

Antwort

12

Hier ist, was ich verwende, so dass das Betriebssystem die stubbed-Methoden zur Laufzeit ordnungsgemäß ersetzen kann.

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

Es sind alle Stubed-Pakete, die von org.apache.http.legacy.jar zur Verfügung gestellt werden.

+0

danke für deinen Beitrag. immer noch eine stub/abstract Laufzeitausnahme in meinem Fall ... – rothschild86

+0

Diese Antwort braucht mehr Aufmerksamkeit - es war die einzige Lösung, die mir erlaubt, SDK 23 mit Eclipse mit Proguard zu kompilieren. – mike47

+1

@mikejeep das ist die einzige Antwort so weit :) BTW, obwohl meine kompiliert, begann ich Laufzeitfehler zu bekommen ... – rothschild86

0

Sie haben Recht, die Legacy-Apache-Bibliothek nicht zu exportieren. Es muss sich jedoch außerhalb des Ordners libs befinden und zum Erstellungspfad hinzugefügt werden (bei Verwendung von Eclipse). Sonst wird es trotzdem mit deiner Android Private Libraries exportiert.

Ich benutze GMS, Volley und AndroidHttpClient in meinen eigenen Kommunikationsklassen. Hier ist, was ich zu den proguard Einstellungen hinzuzufügen hatte:

-dontwarn org.apache.http.** 
-dontwarn com.google.android.gms.** 
-dontwarn com.android.volley.toolbox.** 
-dontwarn com.myapp.communication.** 
-keep class com.google.android.gms.** { *; }