Jak dodać API Apache HTTP (starsze) jako zależność w czasie kompilacji do build.grade dla Androida M?


96

Jak wspomniano tutaj , system Android M nie będzie obsługiwał interfejsu API Apache HTTP. Dokumenty zawierają następujące informacje:

zamiast tego użyj klasy HttpURLConnection.

lub

Aby kontynuować korzystanie z interfejsów API Apache HTTP, musisz najpierw zadeklarować następującą zależność w czasie kompilacji w pliku build.gradle:

android {useLibrary 'org.apache.http.legacy'}

Przekonwertowałem wiele elementów HttpClient używanych w moim projekcie na HttpURLConnection, jednak nadal muszę używać HttpClient w kilku obszarach. Dlatego próbuję zadeklarować „org.apache.http.legacy” jako zależność czasu kompilacji, ale otrzymuję błąd w pliku build.gradle:

Nie znaleziono metody Gradle DSL: „useLibrary ()”

Moje pytanie brzmi: jak zadeklarować „org.apache.http.legacy” jako zależność czasu kompilacji w moim projekcie?

Każda pomoc jest bardzo ceniona. Dzięki


3
Upewnij się, że używasz całkiem nowej wtyczki Gradle dla Androida. Domyślam się, że to jest naprawdę nowe, co oznacza, że ​​potrzebujesz czegoś takiego 1.3.0-rc2. Możesz również rozważyć użycie własnej wersji HttpClient zgodnej z systemem Android Apache .
— CommonsWare

Dzięki za szybką odpowiedź @CommonsWare ... Czy masz na myśli wiersz „classpath” com.android.tools.build:gradle:1.0.0 ”w pliku build.gradle najwyższego poziomu?
— Virat Singh

1
Tak. Byłbym raczej zaskoczony, gdyby 1.0.0tak useLibrarybyło. Możliwe, że wkradł się przed 1.3.x, więc możesz spróbować 1.2.3(AFAIK, najnowsza wersja produkcyjna) i zobaczyć, co się stanie.
— CommonsWare,

Właśnie wypróbowałem '1.2.3' i bez powodzenia - ten sam błąd -> "Nie znaleziono metody Gradle DSL: 'useLibrary ()'": /
— Virat Singh

Tak, ponieważ jest to powiązane z M Developer Preview, nie jestem tym zszokowany. Prawdopodobnie potrzebujesz 1.3.0-rc2(lub czegoś nowszego, jeśli istnieje).
— CommonsWare,

Odpowiedzi:


172

W przypadku interfejsu API 23:

Najwyższy poziom build.gradle - /build.gradle

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

Build.gradle dla konkretnego modułu - /app/build.gradle

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

Oficjalne dokumenty (do podglądu): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Najnowsza lista zmian wtyczek Android Gradle: http://tools.android.com/tech-docs/new-build-system


2
Aktualizuję wersję kompilacji Gradle, a następnie deklaruję useLibrary również dla Apache, ale również pojawia się błąd: Błąd: (204, 13) Błąd: nie można znaleźć klasy symbolu DefaultHttpClient Błąd: (204, 48) Błąd: nie można znaleźć klasy symbolu DefaultHttpClient Błąd: (205, 13) Błąd: nie można znaleźć klasy symbolu HttpPost Błąd: (205, 37) Błąd: nie można znaleźć klasy symbolu HttpPost Błąd: (207, 13) Błąd: nie można znaleźć klasy symbolu HttpResponse Błąd: (208, 13) Błąd: nie można znajdź klasę symbolu HttpEntity Błąd: (209, 19) błąd: nie można znaleźć zmiennej symbolu EntityUtils
— Varnit Khandelwal

1
Coś, czego przegapiłem w odpowiedzi: Musisz upewnić się, że ścieżka klas gradle znajduje się w pliku kompilacji najwyższego poziomu aplikacji, gdzie useLibrarymusi znajdować się w pliku kompilacji konkretnej aplikacji.
— Graeme

Nie zapomnij również dodać tego pliku jar , aby powyższe rozwiązanie działało :)
— Sheraz Ahmad Khilji

@Sheraz, który nie jest już potrzebny - kompilacja gradle podnosi ją automatycznie
— Richard Le Mesurier

1
@Ratul, powinieneś dodać packagingOptions {}blok wewnątrz androidbloku, wewnątrz tego bloku, dodaj exclude 'META-INF/LICENSE'... (każda linia na zduplikowany plik zgłoszony)
— hidro

28

Inną alternatywą jest po prostu dodanie zależności jbundle. Jest to bardziej przyjazne dla Android Studio, ponieważ Android Studio nie wyświetla komunikatu „nie można rozwiązać symbolu ...”

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }

jest dostępny w repozytorium mavenCentral ().
— nexDev

Nie można go skompilować: Błąd: nie powiodło się wykonanie zadania „: <Proj>: pakiet <Proj> Debug”. > Nie można obliczyć skrótu /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
— Jurij Czernyszow

czy próbowałeś kompilować (przebudowywać) bez programu Proguard?
— nexDev

czy możesz pokazać przykładowy projekt, który z tym współpracuje? Teraz pojawia się ten błąd: Błąd: nie powiodło się wykonanie zadania „: app: packageAllSyncmeappDebugClassesForMultiDex”. > java.util.zip.ZipException: zduplikowany wpis: org / apache / http / annotation / GuardedBy.class
— programista Androida

Cóż, typ błędu wydaje się być specyficzny dla twojego projektu. Masz zduplikowane pakiety Apache. Jeden najwyraźniej w org.jbundle. .... a druga gdzieś w jednej z twoich bibliotek.
— Poszukałbym


13

W pliku build.gradle dodaj useLibrary 'org.apache.http.legacy' zgodnie z Android 6.0 Changes> Apache HTTP Client Removaluwagami.

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Aby uniknąć błędów brakujących linków, dodaj zależności

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

przy użyciu „pod warunkiem” zależność nie zostanie uwzględniona w apk


11

Właśnie skopiowany plik: org.apache.http.legacy.jarz Android/Sdk/platforms/android-23/optionalfolderu do folderu projektuapp/libs .

Działało jak urok przez 23.1.1.


2

Rozwiązałem ten problem w ten sposób:

1.) Ustaw ścieżkę klasy w pliku kompilacji najwyższego poziomu, jak wspomniał GUG:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta2'
    }
    allprojects {
        repositories {
           jcenter()
        }
    }
}

2.) W pliku kompilacji konkretnego modułu:

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

2

Ponieważ odpowiedzi są trochę stare, umieszczę moje rozwiązanie (które zadziałało dla mnie), może być pomocne dla kogoś innego ... Swoje rozwiązanie zaczerpnąłem z oficjalnej dokumentacji Apache, bez obejścia.

1 / w klasie:

dependencies {
...
// This is the maintained version from apache.
compile group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.1'
}

2 / w pozostałej części aplikacji zamień org.apache.httpby, cz.msebera.android.httpclienta wszystkie importowane elementy (zależności) zostaną naprawione. możesz po prostu zrobić ctrl + shift + R i zastąpić go w całym projekcie.


2

powinno pomóc:

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Aby uniknąć błędów brakujących linków, dodaj zależności

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

lub

dependencies {
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

ponieważ

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.

lub daj kompilację zamiast pod warunkiem, że oba będą działać
— logeshwaran

z powyższą konfiguracją spotkałem się z błędem: (155, 0) Nie znaleziono metody Gradle DSL:
— ``

1

FWIW zapowiedziano usunięcie biblioteki Apache jakiś czas temu. Nasz dobry przyjaciel Jesse Wilson dał nam wskazówkę w 2011 roku: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google przestał pracować nad ApacheHTTPClient jakiś czas temu, więc każda biblioteka, która wciąż na nim polega, powinna zostać umieszczona na liście przestarzałych bibliotek, chyba że opiekunowie zaktualizują swój kod.

<rant> Nie potrafię powiedzieć, ile technicznych kłótni miałem z ludźmi, którzy nalegali na trzymanie się klienta HTTP Apache. Jest kilka poważnych aplikacji, które się zepsują, ponieważ kierownictwo moich poprzednich pracodawców nie słuchało ich najlepszych inżynierów lub nie wiedziało, o czym mówią, kiedy zignorowali ostrzeżenie ... ale woda pod wodą most.

Wygrałem.

</rant>


1
Rozumiem, że Apache HttpClient jest ukryty w systemie Android-23, ale w rzeczywistości nie jest usuwany. Usunięcie mogłoby zepsuć wiele istniejących klientów ukierunkowanych na wcześniejsze platformy, w których HttpClient nie jest ukryty, a te istniejące aplikacje nadal powinny działać na systemie Android-23. W systemie Android-23 dodanie useLibrary służy do dołączania tych starszych klas do ścieżki klas rozruchowych, czyli do listy klas dostarczanych przez platformę. To zasadniczo ujawnia klasy w systemie Android-23.
— Joe Bowbeer

Kiedy klasa jest przestarzała, często najpierw ją ukrywa się, aby zapobiec jej używaniu w przyszłości. Następnie można go usunąć w miarę upływu czasu. Coś takiego: 1. oznacz jako przestarzałe w bieżącej wersji. 2. ukryj się w drugiej wersji. 3. refaktoryzuj cały kod, aby całkowicie wyeliminować starą klasę.
— Coder Roadie

0

Aby rozwiązać te problemy, upewnij się, że korzystasz z narzędzi do kompilacji w wersji „23.0.0 rc2” z następującymi narzędziami do kompilacji zależności:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.