java.lang.NoClassDefFoundError: falha na resolução de: Lorg / apache / http / ProtocolVersion

324

Eu encontrei esse erro ao usar o Android studio 3.1 para criar um aplicativo do Android P, o apk pode ser feito, mas quando o uso no emulador do Android P, ele falha e lança informações abaixo, mais detalhes veja a foto .

java.lang.NoClassDefFoundError: falha na resolução de: Lorg / apache / http / ProtocolVersion

insira a descrição da imagem aqui

parte do meu build.gradle no módulo App está abaixo, alguém conhece isso? E dá uma sugestão? Muito Obrigado.

android {

     compileSdkVersion 'android-P'
     buildToolsVersion '28-rc1'

    useLibrary 'org.apache.http.legacy'

    //for Lambda
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }

    packagingOptions {

        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
    defaultConfig {
        applicationId "xxx.xxx.xxx"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode xxxx
        versionName "Vx.x.x"

        multiDexEnabled true


     //other setting required
        ndk {

            abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64'

        }
dukeking
fonte

Respostas:

836

Atualização: isso não é mais um bug ou uma solução alternativa, é necessário se o aplicativo atingir a API Nível 28 (Android 9.0) ou superior e usar o SDK do Google Maps para Android 16.0.0 ou inferior (ou se o aplicativo usar o Apache HTTP Biblioteca herdada). Agora está incluído nos documentos oficiais . O problema público foi encerrado como comportamento pretendido.

Este é um erro do lado do Google Play Services. Até que seja corrigido, você poderá contornar isso adicionando isso à sua tag AndroidManifest.xmlinterna <application>:

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
fonte
84
Isso não é mais uma solução alternativa. Esta é a maneira correta agora: developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel
@AdamK, Android 9 é o nível API 28. = P (não um bug de serverside, mas cerca de P mudança de comportamento)
Fung LAM
10
Alguém que não está usando mapas também?
Robin Dijkhof
2
Sim, você também pode encontrá-lo se usar a biblioteca Apache HTTP Legacy (ou uma de suas dependências).
AdamK
2
Estou usando a biblioteca Apache HTTP Legacy e isso me salvou. Obrigado!
Eric B.
55

Este link android-9.0-changes-28 -> descontinuação do cliente HTTP Apache explica o motivo da adição do seguinte ao seu AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Com o Android 6.0, removemos o suporte para o cliente HTTP Apache. A partir do Android 9, essa biblioteca é removida do caminho do bootclass e não está disponível para aplicativos por padrão.

pradip tilala
fonte
33

Siga um destes procedimentos:

1- Atualize a biblioteca play-services-maps para a versão mais recente:

com.google.android.gms:play-services-maps:16.1.0

2- Ou inclua a seguinte declaração no <application>elemento de AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
fonte
3
Novamente, é uma grande pena para os desenvolvedores do Android 9 e, claro, para o Google. Espero que eles revisem a implementação e o comportamento do Android 9, pois há muitos bugs. Infelizmente, o Google insiste em chamar esses bugs, mudanças de comportamento!
9788687 #: 007407/10/2018
20

Se você estiver usando o Android 9.0 com jar herdado, precisará usar. no seu arquivo mainfest.

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Suresh kumar
fonte
17

Para executar o org.apache.http.legacy perfeitamente no Android 9.0 Pie, crie um arquivo xml res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
      <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
        <certificates src="system" />
       </trust-anchors>
      </base-config>
    </network-security-config>

E adicione 2 tags no seu AndroidManifest.xml

android: networkSecurityConfig = "@ xml / network_security_config" android: name = "org.apache.http.legacy"

<?xml version="1.0" encoding="utf-8"?>
 <manifest......>
  <application android:networkSecurityConfig="@xml/network_security_config">
   <activity..../> 
   ......
   ......
 <uses-library
        android:name="org.apache.http.legacy"
        android:required="false"/>
</application>

Adicione também useLibrary 'org.apache.http.legacy'no seu app build gradle

android {
compileSdkVersion 28
defaultConfig {
    applicationId "your application id"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    useLibrary 'org.apache.http.legacy'
}
Gitesh
fonte
Parece algo que você não deveria fazer quando pretende lançar um aplicativo ao público. Para o desenvolvimento, talvez faça sentido, mas ainda não funcionará na produção, portanto não faz sentido nisso.
Maciej Pigulski 16/04/19
Esta resposta deve ser aceita, tentei de várias maneiras, mas não funcionou. Bom Job @Gitesh
Mitesh Jain
16

No seu AndroidManifest.xml, adicione esta duas linhas.

android:usesCleartextTraffic="true"  
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Veja este código abaixo

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">
        <activity android:name=".activity.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    </application>
Aftab Alam
fonte
9

Se você estiver usando com.google.android.gms:play-services-maps:16.0.0ou abaixo, e seu aplicativo tiver como alvo o nível 28 da API 28 (Android 9.0) ou superior, inclua a seguinte declaração no elemento AndroidManifest.xml

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />

Verifique este link - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Gideon Kitili
fonte
8

Se você estiver usando com.google.android.gms: play-services-maps: 16.0.0 ou inferior e seu aplicativo estiver direcionado para o nível 28 da API 28 (Android 9.0) ou superior, inclua a seguinte declaração no elemento AndroidManifest. xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />

Isso é tratado para você se você estiver usando com.google.android.gms: play-services-maps: 16.1.0 e não será necessário se seu aplicativo estiver segmentando um nível de API mais baixo.

jeevashankar
fonte
5

Em reagir nativo, tive o erro de não mostrar mapas e fechar o aplicativo, executar o adb logcat e mostrar erro no console:

java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion

corrija-o adicionando no androidManifest.xml

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Diego Santa Cruz Mendezú
fonte
1

De acordo com esta resposta do SO , isso ocorre devido a um bug do AWS SDK que parece ter sido resolvido na versão 2.6.30 do SDK , portanto, a atualização da versão para uma mais recente pode ajudar a corrigir o problema.

Carlos Daniel
fonte