web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:Lorg/Apache/http/ProtocolVersionの解決に失敗しました

Android Studio 3.1を使用してAndroid Pのアプリを作成すると、apkを作成できますが、Android Pエミュレータで使用するとクラッシュして情報の下にスローされます。 。

Java.lang.NoClassDefFoundError:Lorg/Apache/http/ProtocolVersionの解決に失敗しました

enter image description here

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'

        }
181
dukeking

更新:これはもはやバグや回避策ではなく、アプリがAPIレベル28(Android 9.0)以上をターゲットとしており、Google Maps SDKを使用する場合に必要ですAndroid 16.0.0以前(またはアプリでApache HTTP Legacyライブラリを使用している場合)。 公式ドキュメント に含まれるようになりました。公開の問題は、意図された動作として closed でした。

これは bug です。GooglePlay Services側では、修正されるまで、これをAndroidManifest.xmlタグ内の<application>に追加することで回避できるはずです。

<uses-library Android:name="org.Apache.http.legacy" Android:required="false" />
637
AdamK

このリンク 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から削除され、デフォルトではアプリで利用できなくなりました。

23
pradip tilala

以下のいずれかを行います。

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

Androidのバグ追跡システムでも報告されています: https://issuetracker.google.com/issues/79478779

13
Benoit

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'を追加する

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

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レベルをターゲットにしている場合は不要です。

2
jeevashankar

this SO answer によると、解決されたように見えるAWS SDKバグが原因です SDKのバージョン2.6.30で バージョンを新しいものにすると、問題の修正に役立ちます。

0
Carlos Daniel

古いjarでAndroid 9.0を使用する場合は、使用する必要があります。あなたのメインフェストファイルに。

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

0
Suresh kumar