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) або вище та використовує SDK Карт Google для Android 16.0.0 або нижче (або якщо ваш додаток використовує HTTP Apache HTTP) Спадкова бібліотека). Зараз він включений в офіційні документи . Публічне питання було закрито як призначена поведінка.

Це помилка на стороні Play Services Google, поки вона не вирішена, ви повинні бути в змозі тимчасового рішення, додавши в ваш AndroidManifest.xmlУсередині <application>тега:

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

84
Це вже не є вирішенням проблеми. Це правильний шлях, який зараз розробники.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 -> Позбавлення клієнта Apache HTTP пояснює причину додавання наступних даних у ваш AndroidManifest.xml:

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

За допомогою Android 6.0 ми видалили підтримку клієнта Apache HTTP. Починаючи з Android 9, ця бібліотека видаляється із завантажувального класу і не доступна для додатків за замовчуванням.


33

Виконайте що-небудь із наступного:

1- Оновіть бібліотеку карт-служб-сервісів до останньої версії:

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 наполягає на тому, щоб викликати ці помилки, зміни поведінки!
saeed khalafinejad

20

Якщо ви використовуєте Android 9.0 із застарілою банкою, ніж вам доведеться використовувати. у вашому головному файлі.

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

Це схоже на те, що ви не повинні робити, коли ви збираєтеся запустити додаток для широкого загалу. Для розвитку, можливо, це має сенс, але тоді він все одно не буде працювати на виробництві, тому сенсу в цьому немає.
Мацей Пігульський

Ця відповідь повинна бути прийнятою відповіддю, я перепробував багато способів, але не працював жодним. Good Job @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.