java.lang.NoClassDefFoundError: сбой при разрешении: Lorg / apache / http / ProtocolVersion

324

Я встречал такую ​​ошибку, когда я использую Android studio 3.1 для создания приложения для Android P, можно сделать apk, но когда я использую его на эмуляторе Android P, он вылетит и выдаст ниже информацию, более подробную информацию смотрите на рис. ,

java.lang.NoClassDefFoundError: сбой при разрешении: Lorg / apache / http / ProtocolVersion

введите описание изображения здесь

часть моего build.gradle под модулем приложения находится ниже, кто-нибудь встречал это? И дать некоторые предложения? Большое спасибо.

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
источник

Ответы:

836

Обновление: это больше не ошибка или обходной путь, это требуется, если ваше приложение предназначено для API уровня 28 (Android 9.0) или выше и использует Google Maps SDK для Android 16.0.0 или ниже (или если ваше приложение использует Apache HTTP Библиотека наследия). Теперь он включен в официальные документы . Публичная проблема была закрыта как намеченное поведение.

Это ошибка со стороны Сервисов Google Play, пока она не исправлена, вы сможете обойти ее, добавив это AndroidManifest.xmlв <application>тег внутри :

<uses-library android:name="org.apache.http.legacy" android:required="false" />
AdamK
источник
84
Это больше не обходной путь. Теперь это правильный путь developers.google.com/maps/documentation/android-sdk/…
Кевин Робатель
@AdamK, Android 9 - уровень API 28. = P (не ошибка со стороны сервера, а об изменении поведения P)
Fung LAM
10
Кто-нибудь, не пользующийся картами, испытывает это?
Робин Диджхоф
2
Да, вы также можете столкнуться с этим, если используете библиотеку Apache HTTP Legacy (или одну из ваших зависимостей).
AdamK
2
Я использую библиотеку Apache HTTP Legacy, и это меня спасло. Спасибо!
Эрик Б.
55

Эта ссылка android-9.0-changes-28 -> Устаревание клиента HTTP Apache объясняет причину добавления следующего в ваш AndroidManifest.xml:

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

В Android 6.0 мы убрали поддержку HTTP-клиента Apache. Начиная с Android 9, эта библиотека удаляется из пути загрузки и по умолчанию недоступна для приложений.

прадип тилала
источник
33

Выполните любое из следующих действий:

1- Обновите библиотеку play-services-maps до последней версии:

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

2- Или включите следующую декларацию в <application>элемент AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
источник
3
Опять же, это большой позор для разработчиков Android 9 и, конечно, для Google. Я надеюсь, что они пересмотрят реализацию и поведение Android 9, так как в нем много ошибок. К сожалению, Google настаивает на том, чтобы называть эти ошибки изменением поведения!
Саид Халафинеджад
20

Если вы используете Android 9.0 с устаревшим jar, чем вы должны использовать. в вашем файле mainfest.

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

Суреш Кумар
источник
17

Для запуска org.apache.http.legacy в Android 9.0 Pie создайте файл 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>

И добавьте 2 тега тега в свой 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>

Также добавьте useLibrary 'org.apache.http.legacy'в ваше приложение сборку 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
источник
Это похоже на то, что вы не должны делать, когда намереваетесь запустить приложение для публики. Для разработки, возможно, это имеет смысл, но тогда это не будет работать на производстве, так что в этом нет никакого смысла.
Мацей Пигульски
Этот ответ должен быть принят ответ, я пробовал много способов, но не работал ни один. Хорошая работа @Gitesh
Mitesh Jain
16

В вашем AndroidManifest.xml добавьте две строки.

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

Посмотрите этот код ниже

    <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>
Афтаб Алам
источник
9

Если вы используете com.google.android.gms:play-services-maps:16.0.0или ниже, и ваше приложение ориентировано на уровень API 28 (Android 9.0) или выше, вы должны включить следующую декларацию в элемент AndroidManifest.xml

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

Проверьте эту ссылку - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Гидеон Китили
источник
8

Если вы используете com.google.android.gms: play-services-maps: 16.0.0 или ниже и ваше приложение ориентировано на уровень API 28 (Android 9.0) или выше, вы должны включить следующее объявление в элемент AndroidManifest. XML.

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

Это обрабатывается для вас, если вы используете com.google.android.gms: play-services-maps: 16.1.0, и не требуется, если ваше приложение ориентировано на более низкий уровень API.

jeevashankar
источник
5

В реагировать на родной, я имел ошибку не показать карты и закрыть приложение, запустить adb logcat и показать ошибку в консоли:

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

исправить это, добавив в androidManifest.xml

<uses-library
  android:name="org.apache.http.legacy"
  android:required="false" />
Диего Санта Круз Мендесу
источник
1

Согласно этому ответу SO , это происходит из-за ошибки AWS SDK, которая, по-видимому, устранена в версии 2.6.30 SDK , поэтому обновление версии до более новой может помочь вам решить проблему.

Карлос Даниэль
источник