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

Virat Singh
źródło
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

hidro
źródło
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'
 }
nexDev
źródło
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

lrampazzo
źródło
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.

CodeBulls Inc.
źródło
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'
}
OGŁOSZENIE
źródło
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.

ahmed_khan_89
źródło
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'.
logeshwaran
źródło
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>

Coder Roadie
źródło
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'
GUG
źródło