Como adicionar Apache HTTP API (legado) como dependência de tempo de compilação para build.grade para Android M?

96

Conforme mencionado aqui , o Android M não oferece suporte à API Apache HTTP. Os documentos declaram:

use a classe HttpURLConnection em vez disso.

ou

Para continuar usando as APIs HTTP Apache, você deve primeiro declarar a seguinte dependência de tempo de compilação em seu arquivo build.gradle:

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

Eu converti muito do uso do HttpClient em meu projeto para HttpURLConnection, no entanto, ainda preciso usar o HttpClient em algumas áreas. Portanto, estou tentando declarar 'org.apache.http.legacy' como uma dependência de tempo de compilação, mas estou recebendo um erro em build.gradle:

Método DSL Gradle não encontrado: 'useLibrary ()'

Minha pergunta é: como declaro 'org.apache.http.legacy' como uma dependência de tempo de compilação em meu projeto?

Qualquer ajuda é muito apreciada. obrigado

Virat Singh
fonte
3
Certifique-se de estar usando um plug-in Gradle para Android relativamente recente. Meu palpite é que isso é realmente novo, o que significa que você precisaria de algo como 1.3.0-rc2. Você também pode considerar o uso da edição do HttpClient compatível com Android do próprio Apache .
CommonsWare de
Obrigado pela resposta rápida @CommonsWare ... Você está se referindo à linha "classpath 'com.android.tools.build:gradle:1.0.0'" no arquivo build.gradle de nível superior?
Virat Singh de
1
Sim. Ficarei bastante surpreso se 1.0.0tiver a useLibrarycoisa. É possível que tenha surgido antes de 1.3.x, então você pode tentar 1.2.3(AFAIK, a versão de produção mais recente) e ver o que acontece.
CommonsWare
Acabei de tentar '1.2.3' e sem sorte - mesmo erro -> "Método DSL Gradle não encontrado: 'useLibrary ()'": /
Virat Singh
Sim, já que isso está vinculado ao M Developer Preview, não estou chocado com isso. Provavelmente você precisa 1.3.0-rc2(ou algo mais recente, se houver).
CommonsWare

Respostas:

172

Para API 23:

Build.gradle de nível superior - /build.gradle

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

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

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

Documentos oficiais (para visualização): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Log de alterações mais recente do plug-in gradle do Android: http://tools.android.com/tech-docs/new-build-system

hidro
fonte
2
Eu atualizo a versão de compilação do gradle e declaro useLibrary para apache também, mas também recebo o erro: Erro: (204, 13) erro: não é possível encontrar a classe de símbolo DefaultHttpClient Erro: (204, 48) erro: não é possível encontrar a classe de símbolo Erro DefaultHttpClient: (205, 13) erro: não é possível encontrar a classe de símbolo HttpPost Erro: (205, 37) erro: não é possível encontrar a classe de símbolo HttpPost Erro: (207, 13) erro: não é possível encontrar a classe de símbolo HttpResponse Erro: (208, 13) erro: não é possível encontrar a classe de símbolo HttpEntity Erro: (209, 19) erro: não é possível encontrar a variável de símbolo EntityUtils
Varnit Khandelwal
1
Algo que perdi na resposta: você precisa garantir que o classpath do gradle esteja no arquivo de compilação de nível superior do seu aplicativo, onde useLibrarydeve estar no arquivo de compilação específico do seu aplicativo.
Graeme
Também não se esqueça de adicionar este arquivo jar para fazer a solução acima funcionar :)
Sheraz Ahmad Khilji
@Sheraz que não é mais necessário - a compilação do gradle o pega automaticamente
Richard Le Mesurier
1
@Ratul você deve adicionar um packagingOptions {}bloco dentro do androidbloco, dentro deste bloco, adicionar exclude 'META-INF/LICENSE'... (cada linha por arquivo duplicado relatado)
hidro
28

Outra alternativa é apenas adicionar a dependência jbundle. Isso é mais amigável com o Android Studio, pois o Android Studio não exibe a mensagem "não é possível resolver o símbolo ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }
nexDev
fonte
está disponível no repositório mavenCentral ().
nexDev
Não pode ser compilado: Erro: Falha na execução da tarefa ': <Proj>: pacote <Proj> Depurar'. > Não foi possível calcular o hash de /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov
você tentou compilar (reconstruir) sem proguard?
nexDev
você pode mostrar um projeto de exemplo que funcione com isso? Agora estou recebendo este erro: Erro: Falha na execução da tarefa ': app: packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.ZipException: entrada duplicada: org / apache / http / annotation / GuardedBy.class
desenvolvedor Android
Bem, o tipo de erro que você tem parece específico para o seu projeto. Você tem pacotes apache duplicados. Um aparentemente no org.jbundle. .... e o outro em alguma das suas Bibliotecas. Eu procuraria o pacote duplicado em:
nexDev
13

Em seu arquivo build.gradle, adicione useLibrary 'org.apache.http.legacy' conforme Android 6.0 Changes> Apache HTTP Client Removalnotas.

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

Para evitar erros de link ausente, adicione às dependências

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

usando 'fornecido' a dependência não será incluída no apk

lrampazzo
fonte
11

Arquivo copiado: org.apache.http.legacy.jarda Android/Sdk/platforms/android-23/optionalpasta para a pasta do projeto app/libs.

Funcionou como charme para 23.1.1.

CodeBulls Inc.
fonte
2

Resolvi este problema assim:

1.) Defina o caminho de classe no arquivo de compilação de nível superior como o GUG mencionou:

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

2.) No arquivo de construção do módulo específico:

android {
   useLibrary 'org.apache.http.legacy'
   compileSdkVersion 'android-MNC'
   buildToolsVersion '23.0.0 rc3'
}
DE ANÚNCIOS
fonte
2

Como as respostas são um pouco antigas, vou colocar minha solução (o que funcionou para mim), pode ser útil para outra pessoa ... Tirei minha solução da documentação oficial do Apache, sem contornar.

1 / no gradle:

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

2 / no resto do aplicativo, substitua o org.apache.httppor cz.msebera.android.httpcliente todas as suas importações (dependências) serão corrigidas. você pode apenas fazer ctrl + shift + R e substituí-lo em todo o projeto.

ahmed_khan_89
fonte
2

deve ajudar:

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

Para evitar erros de link ausente, adicione às dependências

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

ou

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
fonte
ou fornecer compilar em vez de fornecer ambos funcionarão
logeshwaran
com a configuração acima, encontrei o erro: (155, 0) Método Gradle DSL não encontrado: 'fornecido ()'
RoFF
1

FWIW, a remoção da biblioteca Apache foi prenunciada há algum tempo. Nosso bom amigo Jesse Wilson nos deu uma pista em 2011: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

O Google parou de trabalhar no ApacheHTTPClient há um tempo, então qualquer biblioteca que ainda dependa disso deve ser colocada na lista de bibliotecas obsoletas, a menos que os mantenedores atualizem seu código.

<rant> Eu não posso te dizer quantos argumentos técnicos eu tive com pessoas que insistiam em ficar com o cliente Apache HTTP. Existem alguns aplicativos importantes que vão falhar porque a administração em meus empregadores anteriores não-nomeados não deu ouvidos aos seus melhores engenheiros ou sabia do que eles estavam falando quando ignoraram o aviso ... mas, água abaixo a Ponte.

Eu ganhei.

</rant>

Coder Roadie
fonte
1
Meu entendimento é que o Apache HttpClient está oculto no android-23, mas não foi realmente removido. A remoção quebraria muitos clientes existentes que visam plataformas anteriores, onde HttpClient não está oculto, e esses aplicativos existentes ainda devem ser executados no android-23. No android-23, adicionar useLibrary serve para anexar essas classes legadas ao classpath de inicialização, ou seja, à lista de classes que são fornecidas pela plataforma. Essencialmente, isso exibe as classes no android-23.
Joe Bowbeer,
Quando uma classe está obsoleta, é comum primeiro ocultá-la para evitar que seja usada no futuro. Em seguida, ele pode ser removido com o passar do tempo. Algo como: 1. marcar como obsoleto na versão atual. 2. ocultar na segunda versão. 3. refatore todo o código para eliminar completamente a classe antiga.
Coder Roadie
0

Para resolver os problemas, certifique-se de usar as ferramentas de compilação da versão "23.0.0 rc2" com as seguintes ferramentas de dependência do gradle de compilação:

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