Wie verwende ich den älteren Apache HTTP-Client auf Android Marshmallow?

76

Hintergrund

Auf Android Marshmallow hat Google die Unterstützung des Apache HTTP-Clients (Link hier ) vollständig entfernt, da die Leistung im Vergleich zu den Alternativen nicht gut ist.

Dies könnte auch die Ursache dafür sein, dass so viele Apps auf Android Marshmallow abstürzen.

Das Problem

Mit Google können Sie diese API weiterhin verwenden, nur nicht als integrierte API, indem Sie diese Zeile zur Gradle-Datei hinzufügen:

useLibrary 'org.apache.http.legacy'

Also, das habe ich getan:

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
}

Und:

android {
    compileSdkVersion 'android-MNC'
    buildToolsVersion "23.0.0 rc3"
    useLibrary 'org.apache.http.legacy'

    defaultConfig {
        applicationId "com.example.user.androidmtest"
        minSdkVersion 'MNC'
        targetSdkVersion 'MNC'
        versionCode 1
        versionName "1.0"
    }

Als ich es ausprobierte, wurde es gut kompiliert (es wurden keine Fehler angezeigt und ich konnte die Proof-of-Concept-App ausführen, da sie keinen speziellen Code enthält), aber als ich versuchte, einige der mir bekannten Klassen zu verwenden sind Teil der alten API (wie "HttpClient" -Klasse), ich sehe, dass es mir nicht erlaubt, dies zu tun.

Ich weiß, dass es nicht empfohlen wird, diese Lösung zu verwenden, aber wir müssen die App zumindest vorübergehend einsatzbereit haben, bis wir zu 100% an allen Dingen arbeiten, die sich für Android Marshmallow ändern sollten, und wir wollen keine Überraschungen in der Form von Abstürzen.

Hier ist ein Screenshot:

Geben Sie hier die Bildbeschreibung ein

Die Frage

Warum kommt es vor? Habe ich es richtig benutzt?


EDIT: über dieses Problem hier berichtet:

https://code.google.com/p/android/issues/detail?id=181474

Android-Entwickler
quelle
durch sie fein kompilierte Sie mittlere gradle synchronisiert Fein- oder bekommen Sie eine ClassNotFoundException zur Laufzeit?
Blackbelt
Können Sie einen Screenshot von Android Studioat
DevUt
@Blackbelt Ich meine, bis zu dem Zeitpunkt, an dem ich Klassen geschrieben habe, die unterstützt werden sollen, könnte es kompiliert werden und gut laufen (weil es nichts gibt, um es zu verwenden). Es kann keine ClassNotFoundException geben, da ich sie noch nicht verwende. Nur wenn ich versuche, Klassen zu verwenden, die dort sein sollen, kann ich nicht. Es erlaubt mir dies nicht und bietet mir nicht die erforderlichen Importe.
Android-Entwickler
@ user4847410 Screenshot von was genau? Der Versuch, den Import mit Gewalt durchzuführen, führt dazu, dass er nicht erkannt wird. und eine Klasse zu verwenden, die dort existiert, tut es auch. Wie auch immer, ich habe die Frage aktualisiert, um die aktuelle Situation zu zeigen, die ziemlich minimal ist ...
Android-Entwickler
Überprüfen Sie, ob Sie den neuesten Beta- Gradle verwenden. Abhängigkeiten {Klassenpfad 'com.android.tools.build:gradle:1.3.0'} Das scheint, als ob nach der Version etwas fehlt (dh '-beta' oder so). Mit der neuesten Beta hat es für mich gelöst
Milosmns

Antworten:

93

Android Studio beschwerte sich, dass org.apache.httpKlassen mögen

org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils

wurden vermisst.

Also habe ich hinzugefügt, org.apache.http.legacy.jarwas im Android/Sdk/platforms/android-23/optionalOrdner zu istapp/libs

Ich habe diese Zeile auch zu meiner app.gradleDatei hinzugefügt

compile files('libs/org.apache.http.legacy.jar')

Wenn Sie jedoch mehr Bibliotheken verwenden, können Sie diese verwenden

compile fileTree(dir: 'libs', include: ['*.jar'])

Dadurch wurden alle meine Fehler behoben, die verursacht wurden, weil Google die Unterstützung des Apache HTTP-Clients entfernt hat.

CoPLaS
quelle
2
Hat für mich gearbeitet. Ich musste das Jar jedoch als Bibliothek zu meinem App-Modul hinzufügen, um die Android Studio-Fehler in Bezug auf HttpClient usw. zu beseitigen.
Jürgen 'Kashban' Wahlmann
1
Ich bekomme Proguard-Probleme, wenn ich org.apache.http.legacy.jar einbinde: IOExcpetion: Can't write [path to classes.jar] (Can't read [path to libs/org.apache.http.legacy.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [org.apache.http.legacy.jar:org/apache/commons/codec/binary/Hex.class]))Verwendet noch jemand Proguard? Irgendwelche Ideen?
Ashughes
1
Es ist sehr traurig, dass Google sich für einen Hack entschieden hat, bei dem Benutzer eine Binärdatei zu ihrem Projekt hinzufügen müssen, anstatt http-Legacy in einem Artefakt-Repo zu veröffentlichen. Ich dachte, wir hätten dieses Anti-Muster vor 10 Jahren hinter uns gelassen.
William
1
Sie sind Genie, Sir.
Aktivität
1
Auch danach hat es bei mir noch nicht funktioniert. Jede mögliche Diagnose bitte @CoPLaS
Lakshmi Narayanan
9

Die useLibrary 'org.apache.http.legacy' funktionierte für mich erst, als ich die Gradle-Tools-Version in meiner Hauptdatei build.gradle meines Android Studio-Projekts wie folgt aktualisiert habe:

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
}
Jamie Hall
quelle
Vielen Dank! Irgendeine Idee, warum nur diese Änderung das Problem löst?
Shirane85
Anscheinend wurde die Direktive useLibrary erst vor relativ kurzer Zeit zu Gradle hinzugefügt. Daher muss eine neuere Version verwendet werden, wie oben angegeben.
Jamie Hall
Ich habe dies in der Haupt-Gradle-Datei: Klassenpfad 'com.android.tools.build:gradle:1.0.0-rc2' Also sollte ich dies entfernen und Ihre Zeile hinzufügen oder beide Zeilen behalten und es würde ohne Probleme funktionieren
Sagar Devanga
Entfernen Sie das und fügen Sie das oben hinzu.
Jamie Hall
9

Perfekte Lösung, indem Sie eine einfache Dateipfadprüfung durchführen. durch Laufen

   android {
    compileSdkVersion 'android-MNC'
    buildToolsVersion "23.0.0 rc3"
    useLibrary 'org.apache.http.legacy'

    defaultConfig {
        applicationId "com.example.user.androidmtest"
        minSdkVersion 'MNC'
        targetSdkVersion 'MNC'
        versionCode 1
        versionName "1.0"

    }

        getBootClasspath().each{File file ->
           println file.absolutePath
        }
    }
}

Sie erhalten so etwas wie unten

/Users/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/android.jar /Users/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/optional/org.apache .http.legacy.jar

Also los, das Glas ist da. Aus irgendeinem Grund wurde es nicht zum Projekt hinzugefügt. aber Sie können es immer manuell hinzufügen, denke ich.

WenChao
quelle
1
Ich verstehe nicht. Was ist dieser Code, den Sie geschrieben haben? Du meinst, ich sollte nach diesem Glas suchen und es dem Projekt hinzufügen. Bitte erkläre.
Android-Entwickler
Ja, du hast recht. Ich habe diesen Code in build.gradle unter der Android-Klausel geschrieben. Genau das, was ich sage, das Glas wurde nicht automatisch abgeholt. Vielleicht müssen Sie es manuell hinzufügen
WenChao
Was macht der Code? Wird es wirklich gebraucht? Hast du es auch überprüft? Funktioniert es gut?
Android-Entwickler
Nein, es wird nur der Dateipfad gedruckt. macht nichts Besonderes, Sie können es sicher entfernen. Dieses Glas enthält alles aus dem alten Apache-Glas (HttpClient, Log usw.). Ich nehme an, es wird gut funktionieren.
WenChao
OK danke. hoffe, dass ich es nicht brauche, wenn es soweit ist. Wird es bei Bedarf erneut überprüfen. Im Moment erhalten Sie +1 für die Anstrengung.
Android-Entwickler
6

Nach vielen frustrierenden Stunden funktionierte Folgendes:

1. Suchen Sie das Apache-Glas. Es sollte sich irgendwo befinden wie:

C:\Users\<yourname>\AppData\Local\Android\sdk\platforms\android-23\optional

2. Kopieren Sie org.apache.http.legacy.jar in Ihren libs-Ordner.

Klicken Sie entweder mit der rechten Maustaste auf libs -> Einfügen oder navigieren Sie mit Ihrem Datei-Explorer zum libs-Ordner Ihres Projekts und fügen Sie ihn ein.

Wenn Sie wie ich keinen libs-Ordner haben, erstellen Sie ein neues Projekt und importieren Sie alle relevanten Dateien an die entsprechenden Stellen.

3. Klicken Sie hier, ok um dies zu sehen

4. Wichtigster Schritt: Klicken Sie mit der rechten Maustaste auf den Apache-Ordner und wählen Sie Add As Library. Sieh dir das an

Hoffe, das hilft jemandem, mit seinem Leben weiterzukommen.

Die AEB
quelle
5

Die obige Antwort hilft nur dabei, die Debug-Builds auszuführen und Builds freizugeben, die Gradle verwenden.

Fügen Sie dies in das Anwendungs-Tag in der Manifestdatei auf allen Projektinstanzen ein, die die älteren Apache-Klassen verwenden:

<uses-library android:name="org.apache.http.legacy" android:required="false" />

Dies ist hilfreich für diejenigen, die beim Kompilieren noch Eclipse- und Ant-Skripte verwenden.

Pier Betos
quelle
2

Ich weiß, das ist ein dummer Grund, aber auf der Liste versuchen Sie es ...

Ich habe dieses Problem kürzlich festgestellt und es wird durch die Pfadlängenbeschränkung verursacht, die meiner Meinung nach maximal 256 Zeichen beträgt.

Verschieben Sie Ihr Projekt und der Build wird erfolgreich sein. Hoffen Sie, dass diese Arbeit für Sie funktioniert.

Arpit Patel
quelle
das ist nicht albern ... das ist die Antwort, die in meinem Fall funktioniert hat ... In den letzten 36 Stunden habe ich alles auf der Erde ausprobiert, außer dem ... Es klingt am Anfang albern, also habe ich es nicht ernst genommen ...
KawaiKx
Leute, probiert
Es ist mir ein Vergnügen. @ KawaiKx
Arpit Patel
2

Legacy Apache Bibliothek befindet sich in

[ANDROID_SDK]\platforms\android-23\optional\org.apache.http.legacy.jar 

So können Sie es kopieren können innerhalb Sie projizieren Libs oder Verwendung

compile files("${android.getSdkDirectory().getAbsolutePath()}" + File.separator + "platforms" + File.separator + "android-23" + File.separator + "optional" + File.separator + "org.apache.http.legacy.jar")

in Ihrem /app/build.gradle

AndreyICE
quelle
2

Zuerst müssen Sie das in Ihrem libs-Ordner überprüfen

Stellen Sie sicher, dass im Libs-Ordner die Apache-Bibliothek überprüft wird

Then add into your gradle file like this 

    android {
        compileSdkVersion 23
        buildToolsVersion '23.0.2'

        defaultConfig {
            applicationId "info.tranetech.laundry"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    android {
        useLibrary 'org.apache.http.legacy'
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.0.1
        compile 'com.android.support:design:23.0.1
        testCompile 'junit:junit:4.12'
        compile files('libs/android-async-http-1.4.4.jar')
        compile 'com.google.android.gms:play-services:8.4.0'
    }

Dies ist meine Gradle-Datei

Überprüfen Sie auch die externe Bibliothek

Arpit Patel
quelle
1

Aktivieren Sie dies in sdk / platform / android-23 / optional / optional.json

[
  {
    "name": "org.apache.http.legacy",
    "jar": "org.apache.http.legacy.jar",
    "manifest": false
  }
]
arun-r
quelle
0

Entfernen

useLibrary 'org.apache.http.legacy' 

aus dem build.gradle und ich habe diese Zeile auch zu meiner app.gradle-Datei hinzugefügt

compile files('libs/org.apache.http.legacy.jar')

Wenn Sie jedoch mehr Bibliotheken verwenden, können Sie diese verwenden

compile fileTree(dir: 'libs', include: ['*.jar'])

Die CoPLaS-Antwort hat meine Probleme behoben.

Roger Belk
quelle
2
Dann stimmen Sie einfach der CoPLaS-Antwort zu, anstatt sie hier zu reproduzieren!
Leo unterstützt Monica Cellio
0

Wie verwende ich den älteren Apache HTTP-Client auf Android Marshmallow?

So verwenden Sie Apache HTTP-Klassen für API 23+ weiter:

Stellen Sie zunächst sicher, dass Sie die Gradle-Abhängigkeit in das build.gradlef einfügen

buildscript {

    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }
}

Fügen Sie dann die Referenz in build.gradleIhr Projekt ein:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.apache.http.legacy'
    ...
}
Jorgesys
quelle
0

Eine einfache Möglichkeit, dieses Problem zu beheben, ist C: \ Benutzer \ Benutzername \ AppData \ Local \ Android \ sdk \ Plattformen. Hier löschen Sie Ihr Android-23 und aktualisieren Sie Ihre API 23 aus dem SDK-Manager erneut. Es wird Ihr Problem lösen.

impathuri
quelle