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


324

Android Studio 3.1を使用してAndroid Pのアプリをビルドすると、このようなエラーに遭遇しましたが、apkを作成できますが、Android 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/...
ケビンRobatel

@ AdamK、Android 9はAPIレベル28です。= P(サーバーサイドからのバグではなく、Pの動作変更について)
Fung LAM

10
これを経験しているマップを使用していない人もいますか?
Robin Dijkhof、2018年

2
はい、Apache HTTP Legacyライブラリを使用している場合(または、依存関係の1つが使用している場合)にも実行できます。
AdamK、2018年

2
私はApache HTTP Legacyライブラリを使用していますが、これで節約できました。ありがとうございました!
エリック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'アプリビルドグラドル も追加します

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

この答えは受け入れられるはずです。私は多くの方法を試しましたが、うまくいきませんでした。Good Job @Gitesh
Mitesh Jain

16

AndroidManifest.xmlに次の2行を追加します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.