programing

자바.java.javaNoClassDefFoundError:Log/apache/http/ProtocolVersion 확인 실패

testmans 2023. 8. 13. 09:35
반응형

자바.java.javaNoClassDefFoundError:Log/apache/http/ProtocolVersion 확인 실패

Android Studio를 사용하여 앱을 빌드할 때 이 오류가 발생합니다.APK는 컴파일되어 있지만 Android Emulator에서 앱을 실행하려고 하면 크래시가 발생하여 다음과 같은 오류가 발생합니다.자세한 내용은 첨부 파일을 참조하십시오.

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

enter image description here

이것은 나의 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'
        }

업데이트: 이는 더 이상 버그나 해결 방법이 아닙니다. 앱이 API 레벨 28(Android 9.0) 이상을 대상으로 하고 Android 16.0.0 이하용 Google Maps SDK를 사용하는 경우(또는 앱이 Apache HTTP 레거시 라이브러리를 사용하는 경우) 필요합니다.그것은 이제 공식 문서에 포함되어 있습니다.공개 이슈가 의도된 동작으로 닫혔습니다.

이것은 Google Play Services 측의 버그입니다. 해결될 때까지 이 문제를 해결할 수 있어야 합니다.AndroidManifest.xml내부에<application>태그:

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

링크 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부터는 해당 라이브러리가 부트 클래스 경로에서 제거되며 기본적으로 앱에서 사용할 수 없습니다.

다음 중 하나를 수행합니다.

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

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>

기존 병과 함께 Android 9.0을 사용하는 경우 사용해야 하는 것보다 많습니다.당신의 메인 페스트 파일에.

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

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="message.security.config"

<?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'당신의 앱에서 빌드 그라들.

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

Android 버그 트래커에서도 보고됩니다. https://issuetracker.google.com/issues/79478779

사용 중인 경우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

답변이 늦어질 수 있습니다. 하지만 누군가 시간을 절약할 수 있기를 바랍니다.

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의 기본값은 "false"입니다.이 값을 true로 설정하면 앱이 일반 네트워크 트래픽을 사용하려는 것입니다.

Android 10 장치에서 실행할 때 앱이 범위가 지정된 저장소를 벗어나면 requestLegacy를 계속 설정하는 것이 좋습니다.의 매니페스트 파일에서 외부 저장소를 true로 지정합니다.그러면 Android 10을 실행하는 장치에서 앱이 계속해서 예상대로 작동할 수 있습니다.

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 수준을 목표로 하는 경우에는 필요하지 않습니다.

대응 네이티브에서는 맵을 표시하지 않고 앱을 닫고 adblogcat을 실행하고 콘솔 내에서 오류를 표시하지 않습니다.

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

AndroidManifest.xml 내에 추가하여 수정합니다.

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

SO 답변에 따르면 SDK 버전 2.6.30에서 해결된 것으로 보이는 AWS SDK 버그로 인해 발생하므로 버전을 최신 버전으로 업데이트하면 문제를 해결하는 데 도움이 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/50461881/java-lang-noclassdeffounderrorfailed-resolution-of-lorg-apache-http-protocolve

반응형