java.lang.NoClassDefFoundError : : Lorg / apache / http / ProtocolVersion의 해결에 실패했습니다


324

안드로이드 스튜디오 3.1을 사용하여 안드로이드 P의 앱을 빌드 할 때 이러한 오류가 발생했습니다. .

java.lang.NoClassDefFoundError : : Lorg / apache / http / ProtocolVersion의 해결에 실패했습니다

여기에 이미지 설명을 입력하십시오

App 모듈 아래에있는 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) 이상을 대상으로하고 Android 16.0.0 이하용 Google Maps SDK를 사용하는 경우 (또는 앱이 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/…
Kevin Robatel

@AdamK는 안드로이드 9 API 레벨 28 = P이다 (안 서버 측에서 버그가 있지만, P 행동 변화에 대한)
봉 LAM

10
이 문제가 발생하는지도를 사용하지 않는 사람이 있습니까?
Robin Dijkhof

2
예. Apache HTTP Legacy 라이브러리를 사용하거나 종속성 중 하나를 사용하는 경우에도 실행할 수 있습니다.
AdamK

2
Apache HTTP Legacy 라이브러리를 사용하고 있는데 저를 구했습니다. 감사합니다!
Eric B.

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부터는 해당 라이브러리가 bootclasspath에서 제거되고 기본적으로 앱에서 사용할 수 없습니다.


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은 이러한 버그를 호출하고 동작이 변경 될 것을 주장합니다.
saeed khalafinejad

20

레거시 jar와 함께 Android 9.0을 사용하는 경우 사용해야합니다. mainfest 파일에.

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


17

Android 9.0 Pie에서 org.apache.http.legacy를 완벽하게 실행하려면 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>

그리고 AndroidManifest.xml에 태그 2 개를 추가하십시오

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

이 답변은 받아 들여야합니다. 나는 여러 가지 방법을 시도했지만 아무 효과가 없었습니다. @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>



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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.