Java.lang.NoClassDefFoundError: неудачное разрешение: Lorg / apache / http / ProtocolVersion

Я сталкиваюсь с этой ошибкой, когда использую Android Studio для создания своего приложения. APK скомпилирован, но когда я пытаюсь запустить приложение на эмуляторе Android P, оно вылетает и выдает следующую ошибку. Подробности смотрите в приложениях:

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

Java.lang.NoClassDefFoundError: неудачное разрешение: Lorg / apache / http / ProtocolVersion

Это мой файл build.grade. Если у кого-нибудь есть предложение о том, в чем может быть проблема, я был бы признателен. Большое спасибо.

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'
        }
351
0
128 521
12

Ответы 12

Также сообщается об отслеживании ошибок Android: https://issuetracker.google.com/issues/79478779

И это также в документации developers.google.com/maps/documentation/android-sdk/…

Renetik 12.11.2018 06:08

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

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

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

Это больше не обходное решение. Теперь это правильный путь developers.google.com/maps/documentation/android-sdk/…

Kevin Robatel 14.08.2018 00:09

@AdamK, Android 9 - это уровень API 28. = P (ошибка не на стороне сервера, а об изменении поведения P)

Fung LAM 16.08.2018 08:24

Кто-нибудь, не использующий карты, тоже сталкивался с этим?

Robin Dijkhof 12.10.2018 19:51

Да, вы также можете столкнуться с этим, если используете библиотеку Apache HTTP Legacy (или одну из ваших зависимостей).

AdamK 13.10.2018 04:07

Я использую библиотеку Apache HTTP Legacy, и это меня просто спасло. Спасибо!

Eric B. 14.10.2018 01:21

Проблема с Firebase все еще возникает? Я думаю, что у меня такая же проблема, но при использовании других служб Firebase, таких как Crashlytics

android developer 07.11.2018 00:23

@androiddeveloper, возможно, это связано с GeoFire.

Martin Zeitler 19.11.2018 02:27

Получил ту же ошибку при использовании устаревшего Volley, который пытался получить доступ к DateUtils из apache. Это исправление сработало.

zed 16.04.2019 13:37

Я потратил час на то, чтобы понять это. Я даже пробовал сравнивать каждый файл со старым приложением (api27). Слава богу, я проглотил свое эго и начал искать здесь. Также большое спасибо Адаму и Кевину.

Tosh 07.05.2019 05:14

Работал как шарм. Спасибо!!

akshay gore 15.05.2019 21:08

@RobinDijkhof, я использую рекламу Google, и у меня точно такая же проблема, и это исправило ее.

3c71 19.06.2019 20:32

Но почему эта проблема возникает на некоторых устройствах, в частности, она вызывает сбой на Samsung, но отлично работает на Honor.

Rajat Mehra 04.11.2019 08:26

Отлично, спас мне день.Спасибо

Mohammad Arman 27.02.2020 10:36

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

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

With Android 6.0, we removed support for the Apache HTTP client. Beginning with Android 9, that library is removed from the bootclasspath and is not available to apps by default.

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

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

Опять же, это большой позор для разработчиков Android 9 и, конечно же, для Google. Я надеюсь, что они пересмотрят реализацию и поведение Android 9, так как в нем много ошибок. К сожалению, Google настаивает на том, чтобы называть эти ошибки изменениями поведения!

saeed khalafinejad 07.07.2019 12:34

Если вы используете 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.

Чтобы полностью запустить 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'
}

Это похоже на то, что вам не следует делать, когда вы собираетесь запустить приложение для публики. Для разработки, возможно, это имеет смысл, но тогда он все равно не будет работать на производстве, поэтому в этом нет смысла.

Maciej Pigulski 16.04.2019 09:08

Этот ответ должен быть принятым ответом, я пробовал много способов, но не работал. Хорошая работа @Gitesh

Mitesh Jain 21.08.2019 12:49

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

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

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

В react native у меня была ошибка: не показывать карты и закрывать приложение, запускать 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" />

Если вы используете 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

In your AndroidManifest.xml add this two-line.

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

See this below code

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

Это может быть поздний ответ. но я надеюсь, что это сэкономит кому-то время:

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

<application
        ...
        ...
        android:usesCleartextTraffic = "true"
        android:requestLegacyExternalStorage = "true">

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

</application>

Примечание: android:requestLegacyExternalStorage = "true" требуется для Android 10+ для доступа к хранилищу R / W

Android 6.0 представил атрибут useCleartextTraffic в элементе приложения в манифесте Android. Значение по умолчанию в Android P «ложный». Установка этого параметра на правда указывает, что приложение намеревается использовать чистый сетевой трафик.

Если ваше приложение отказывается от ограниченного хранилища при работе на Устройства Android 10, рекомендуется продолжить установку requestLegacyExternalStorage в true в файле манифеста вашего приложения. Таким образом, ваше приложение может продолжать вести себя должным образом на устройствах, на которых запущен Android 10.

Другие вопросы по теме