¿Cómo agregar Apache HTTP API (heredado) como dependencia en tiempo de compilación para build.grade para Android M?

96

Como se menciona aquí , Android M no admitirá la API HTTP de Apache. Los documentos dicen:

use la clase HttpURLConnection en su lugar.

o

Para continuar usando las API HTTP de Apache, primero debe declarar la siguiente dependencia en tiempo de compilación en su archivo build.gradle:

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

He convertido gran parte del uso de HttpClient de mi proyecto en HttpURLConnection, sin embargo, todavía necesito usar HttpClient en algunas áreas. Por lo tanto, estoy tratando de declarar 'org.apache.http.legacy' como una dependencia en tiempo de compilación, pero obtengo un error en build.gradle:

Método DSL de Gradle no encontrado: 'useLibrary ()'

Mi pregunta es: ¿cómo declaro 'org.apache.http.legacy' como una dependencia en tiempo de compilación en mi proyecto?

Cualquier ayuda es muy apreciada. Gracias

Virat Singh
fuente
3
Asegúrate de estar usando un complemento de Gradle para Android bastante reciente. Supongo que esto es realmente nuevo, lo que significa que necesitarías algo como 1.3.0-rc2. También podría considerar usar la propia edición de HttpClient compatible con Android de Apache .
CommonsWare
Gracias por la respuesta rápida @CommonsWare ... ¿Se está refiriendo a la línea "classpath 'com.android.tools.build:gradle:1.0.0'" en el archivo build.gradle de nivel superior?
Virat Singh
1
Si. Me sorprendería bastante si 1.0.0tiene la useLibrarycosa. Es posible que haya aparecido antes de 1.3.x, por lo que podría intentarlo 1.2.3(AFAIK, la última versión de producción) y ver qué sucede.
CommonsWare
Intenté '1.2.3' y no tuve suerte - el mismo error -> "Método DSL de Gradle no encontrado: 'useLibrary ()'": /
Virat Singh
Sí, dado que esto está relacionado con la Vista previa del desarrollador M, no me sorprende eso. Probablemente lo necesite 1.3.0-rc2(o algo más nuevo, si lo hay).
CommonsWare

Respuestas:

172

Para API 23:

Build.gradle de nivel superior - /build.gradle

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

Build.gradle específico del módulo - /app/build.gradle

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

Documentos oficiales (aunque para una vista previa): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Último registro de cambios del complemento gradle de Android: http://tools.android.com/tech-docs/new-build-system

hidro
fuente
2
Actualizo la versión de compilación de gradle y luego declaro useLibrary para apache también, pero también obtendré el error: Error: (204, 13) error: no se puede encontrar la clase de símbolo DefaultHttpClient Error: (204, 48) error: no se puede encontrar la clase de símbolo DefaultHttpClient Error: (205, 13) error: no se puede encontrar la clase de símbolo HttpPost Error: (205, 37) error: no se puede encontrar la clase de símbolo HttpPost Error: (207, 13) error: no se puede encontrar la clase de símbolo HttpResponse Error: (208, 13) error: no se puede encontrar la clase de símbolo HttpEntity Error: (209, 19) error: no se puede encontrar la variable de símbolo EntityUtils
Varnit Khandelwal
1
Algo que me perdí de la respuesta: debe asegurarse de que la ruta de clase de gradle esté en el archivo de compilación de nivel superior de su aplicación, donde useLibrarydebe estar en el archivo de compilación específico de su aplicación.
Graeme
Además, no olvide agregar este archivo jar para que la solución anterior funcione :)
Sheraz Ahmad Khilji
@Sheraz que ya no es necesario: la compilación de Gradle lo recoge automáticamente
Richard Le Mesurier
1
@Ratul debe agregar un packagingOptions {}bloque dentro del androidbloque, dentro de este bloque, agregar exclude 'META-INF/LICENSE'... (cada línea por archivo duplicado informado)
hidro
28

Otra alternativa es simplemente agregar la dependencia jbundle. Esto es más compatible con Android Studio, ya que Android Studio no muestra el mensaje "no se puede resolver el símbolo ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }
nexDev
fuente
está disponible en el repositorio mavenCentral ().
nexDev
No se puede compilar: Error: Falló la ejecución de la tarea ': <Proj>: paquete <Proj> Debug'. > No se puede calcular el hash de /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov
¿Ha intentado compilar (reconstruir) sin proguard?
nexDev
¿Puede mostrar un proyecto de muestra que funcione con esto? Ahora recibo este error: Error: Error de ejecución para la tarea ': app: packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.ZipException: entrada duplicada: org / apache / http / annotation / GuardedBy.class
desarrollador de Android
Bueno, el tipo de error que tiene parece específico de su proyecto. Tiene paquetes de apache duplicados. Uno aparentemente en el org.jbundle. .... y el otro en algún lugar de una de sus bibliotecas.
Buscaría
13

En su archivo build.gradle agregue useLibrary 'org.apache.http.legacy' según Android 6.0 Changes> Apache HTTP Client Removalnotas.

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

Para evitar errores de enlaces perdidos, agregue a las dependencias

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

usando 'proporcionado' la dependencia no se incluirá en el apk

lrampazzo
fuente
11

Archivo recién copiado: org.apache.http.legacy.jarde la Android/Sdk/platforms/android-23/optionalcarpeta a la carpeta del proyecto app/libs.

Funcionó como un encanto para 23.1.1.

CodeBulls Inc.
fuente
2

Resolví este problema así:

1.) Establezca classpath en el archivo de compilación de nivel superior como mencionó GUG:

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

2.) En el archivo de compilación del módulo específico:

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

Como las respuestas son un poco antiguas, pondré mi solución (lo que funcionó para mí), puede ser útil para alguien más ... Tomé mi solución de la documentación oficial de Apache, sin solución .

1 / en gradle:

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

2 / en el resto de la aplicación, reemplace org.apache.httppor cz.msebera.android.httpclienty todas sus importaciones (dependencias) serán corregidas. puede simplemente hacer ctrl + shift + R y reemplazarlo en todo el proyecto.

ahmed_khan_89
fuente
2

debería ayudar:

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

Para evitar errores de enlaces perdidos, agregue a las dependencias

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'
}

porque

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.
Logeshwaran
fuente
o dar compilación en lugar de proporcionar ambos funcionarán
logeshwaran
con la configuración anterior, me encontré con el Error: (155, 0) Método Gradle DSL no encontrado: 'proporcionado ()'
RoFF
1

FWIW, la eliminación de la biblioteca Apache se anunció hace un tiempo. Nuestro buen amigo Jesse Wilson nos dio una pista en 2011: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google dejó de trabajar en ApacheHTTPClient hace un tiempo, por lo que cualquier biblioteca que todavía dependa de ella debe incluirse en la lista de bibliotecas obsoletas a menos que los encargados del mantenimiento actualicen su código.

<rant> No puedo decirte cuántos argumentos técnicos he tenido con personas que insistieron en seguir con el cliente HTTP Apache. Hay algunas aplicaciones importantes que van a fallar porque la gerencia de mis empleadores anteriores no nombrados no escuchó a sus mejores ingenieros o sabía de lo que estaban hablando cuando ignoraron la advertencia ... pero, agua debajo el puente.

Yo gano.

</rant>

Codificador Roadie
fuente
1
Tengo entendido que Apache HttpClient está oculto en android-23 pero en realidad no se elimina. La eliminación rompería muchos clientes existentes que apuntan a plataformas anteriores, donde HttpClient no está oculto, y aún se espera que estas aplicaciones existentes se ejecuten en Android-23. En android-23, agregar useLibrary sirve para agregar estas clases heredadas a la ruta de clases de arranque, es decir, a la lista de clases que proporciona la plataforma. Esto esencialmente muestra las clases en android-23.
Joe Bowbeer
Cuando una clase está en desuso, es común ocultarla primero para evitar que se use en el futuro. Luego, puede eliminarse a medida que pasa el tiempo. Algo como: 1. marcar como obsoleto en la versión actual. 2. esconderse en la segunda versión. 3. Refactorice todo el código para eliminar completamente la clase anterior.
Coder Roadie
0

Para resolver los problemas, asegúrese de utilizar las herramientas de compilación de la versión "23.0.0 rc2" con las siguientes herramientas para compilar la dependencia de gradle:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
GUG
fuente