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'

        }

Ответы:


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" />

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" />

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
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.


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" />

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.