Come aggiungere API HTTP Apache (legacy) come dipendenza in fase di compilazione a build.grade per Android M?


96

Come accennato qui , Android M non supporterà l'API HTTP di Apache. I documenti affermano di:

utilizzare invece la classe HttpURLConnection.

o

Per continuare a utilizzare le API HTTP di Apache, devi prima dichiarare la seguente dipendenza in fase di compilazione nel tuo file build.gradle:

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

Ho convertito gran parte dell'utilizzo di HttpClient nel mio progetto in HttpURLConnection, tuttavia, ho ancora bisogno di utilizzare HttpClient in alcune aree. Quindi, sto cercando di dichiarare 'org.apache.http.legacy' come dipendenza in fase di compilazione ma ricevo un errore in build.gradle:

Metodo DSL Gradle non trovato: 'useLibrary ()'

La mia domanda è: come dichiaro "org.apache.http.legacy" come dipendenza in fase di compilazione nel mio progetto?

Ogni aiuto è molto apprezzato. Grazie


3
Assicurati di utilizzare un plugin Gradle per Android abbastanza recente. La mia ipotesi è che questo sia davvero nuovo, il che significa che avresti bisogno di qualcosa di simile 1.3.0-rc2. Potresti anche prendere in considerazione l'utilizzo dell'edizione di HttpClient compatibile con Android di Apache .
CommonsWare

Grazie per la rapida risposta @CommonsWare ... Ti riferisci alla riga "classpath 'com.android.tools.build:gradle:1.0.0'" nel file build.gradle di primo livello?
Virat Singh

1
Sì. Sarò piuttosto sorpreso se 1.0.0ha la useLibrarycosa. È possibile che sia entrato prima della 1.3.x, quindi potresti provare 1.2.3(AFAIK, l'ultima versione di produzione) e vedere cosa succede.
CommonsWare

Ho appena provato "1.2.3" e senza fortuna - stesso errore -> "Metodo DSL Gradle non trovato: 'useLibrary ()'": /
Virat Singh

Sì, poiché questo è legato all'anteprima per sviluppatori M, non ne sono scioccato. Probabilmente ti serve 1.3.0-rc2(o qualcosa di più nuovo, se ce n'è uno).
CommonsWare

Risposte:


172

Per API 23:

Build.gradle di primo livello - /build.gradle

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

Build.gradle specifico del modulo - /app/build.gradle

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

Documenti ufficiali (per l'anteprima però): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Ultimo changelog del plugin gradle per Android: http://tools.android.com/tech-docs/new-build-system


2
Aggiorno la versione build gradle e quindi dichiaro useLibrary anche per apache, ma poi ricevo anche l'errore: Errore: (204, 13) errore: impossibile trovare la classe di simboli DefaultHttpClient Errore: (204, 48) errore: impossibile trovare la classe di simboli DefaultHttpClient Errore: (205, 13) errore: impossibile trovare la classe di simboli HttpPost Errore: (205, 37) errore: impossibile trovare la classe di simboli HttpPost Errore: (207, 13) errore: impossibile trovare la classe di simboli HttpResponse Errore: (208, 13) errore: impossibile trova la classe di simboli HttpEntity Errore: (209, 19) errore: impossibile trovare la variabile simbolo EntityUtils
Varnit Khandelwal

1
Qualcosa che mi è sfuggito dalla risposta: devi assicurarti che il percorso di classe gradle sia nel file di build di primo livello delle tue app, dove useLibrarydeve essere nel file di build specifico della tua app.
Graeme

Inoltre, non dimenticare di aggiungere questo file jar per far funzionare la soluzione di cui sopra :)
Sheraz Ahmad Khilji

@Sheraz che non è più necessario - la build gradle lo raccoglie automaticamente
Richard Le Mesurier

1
@Ratul dovresti aggiungere un packagingOptions {}blocco all'interno del androidblocco, all'interno di questo blocco, aggiungi exclude 'META-INF/LICENSE'... (ogni riga per file duplicato segnalato)
hidro

28

Un'altra alternativa è aggiungere semplicemente la dipendenza jbundle. È più compatibile con Android Studio in quanto Android Studio non fornisce il messaggio "Impossibile risolvere il simbolo ..."

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

è disponibile nel repository mavenCentral ().
nexDev

Non può essere compilato: Errore: esecuzione non riuscita per l'attività ': <Proj>: pacchetto <Proj> Debug'. > Impossibile calcolare l'hash di /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov

hai provato a compilare (ricostruire) senza proguard?
nexDev

puoi per favore mostrare un progetto di esempio che funziona con questo? Ora ricevo questo errore: Errore: esecuzione non riuscita per l'attività ": app: packageAllSyncmeappDebugClassesForMultiDex". > java.util.zip.ZipException: voce duplicata: org / apache / http / annotation / GuardedBy.class
sviluppatore Android

Bene, il tipo di errore che hai sembra specifico per il tuo progetto. Hai pacchetti Apache duplicati. Uno apparentemente nell'org.jbundle. .... e l'altro da qualche parte in una delle tue biblioteche.
Cercherei


13

Nel tuo file build.gradle aggiungi useLibrary 'org.apache.http.legacy' come da Android 6.0 Changes> Apache HTTP Client Removalnotes.

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

Per evitare errori di collegamento mancanti aggiungere alle dipendenze

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

usando 'fornito' la dipendenza non sarà inclusa nell'apk


11

File appena copiato: org.apache.http.legacy.jardalla Android/Sdk/platforms/android-23/optionalcartella alla cartella del progetto app/libs.

Ha funzionato come il fascino per 23.1.1.


2

Ho risolto questo problema in questo modo:

1.) Imposta classpath nel file di build di primo livello come menzionato da GUG:

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

2.) Nel file di build del modulo specifico:

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

2

Poiché le risposte sono un po 'vecchie, metterò la mia soluzione (cosa ha funzionato per me), può essere utile per qualcun altro ... Ho preso la mia soluzione dalla documentazione ufficiale di Apache, nessuna soluzione.

1 / in grado:

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

2 / nel resto dell'app, sostituisci il org.apache.httpby cz.msebera.android.httpcliente tutte le tue importazioni (dipendenze) verranno corrette. puoi semplicemente fare ctrl + maiusc + R e sostituirlo nell'intero progetto.


2

dovrebbe aiutare:

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

Per evitare errori di collegamento mancanti aggiungere alle dipendenze

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

o

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

perché

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

o dare la compilazione invece di fornire entrambi funzioneranno
logeshwaran

con la configurazione precedente, ho riscontrato l'errore: (155, 0) Metodo DSL Gradle non trovato: 'provided ()'
RoFF

1

FWIW la rimozione della libreria Apache era stata prefigurata qualche tempo fa. Il nostro buon amico Jesse Wilson ci ha dato un indizio nel 2011: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google ha smesso di funzionare su ApacheHTTPClient qualche tempo fa, quindi qualsiasi libreria su cui si basa ancora dovrebbe essere inserita nell'elenco delle librerie deprecate a meno che i manutentori non aggiornino il loro codice.

<rant> Non posso dirti quanti argomenti tecnici ho avuto con persone che hanno insistito per restare con il client HTTP Apache. Ci sono alcune app importanti che si interromperanno perché la direzione dei miei precedenti datori di lavoro non nominati non ha ascoltato i loro migliori ingegneri o sapeva di cosa stavano parlando quando hanno ignorato l'avvertimento ... ma, l'acqua sotto il ponte.

Io vinco.

</rant>


1
La mia comprensione è che Apache HttpClient è nascosto in Android-23 ma non viene effettivamente rimosso. La rimozione interromperà molti client esistenti che prendono di mira piattaforme precedenti, dove HttpClient non è nascosto, e queste app esistenti dovrebbero ancora essere eseguite su Android-23. Su android-23, l'aggiunta di useLibrary serve per aggiungere queste classi legacy al classpath di avvio, ovvero all'elenco delle classi fornite dalla piattaforma. Questo essenzialmente mostra le classi su Android-23.
Joe Bowbeer

Quando una classe è deprecata, è comune prima nasconderla per impedirne l'utilizzo in futuro. Quindi può essere rimosso col passare del tempo. Qualcosa come: 1. Contrassegna come deprecato nella versione corrente. 2. nascondi nella seconda versione. 3. refactoring di tutto il codice per eliminare completamente la vecchia classe.
Coder Roadie

0

Per risolvere i problemi, assicurati di utilizzare la versione degli strumenti di build "23.0.0 rc2" con i seguenti strumenti di build gradle dependency:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.