java.lang.NoClassDefFoundError: resolusi gagal: Lorg / apache / http / ProtocolVersion


324

Saya telah bertemu kesalahan seperti itu ketika saya menggunakan Android studio 3.1 untuk membangun aplikasi Android P, apk dapat dibuat, tetapi ketika saya menggunakannya pada Android P emulator, itu akan crash dan melempar info di bawah, lebih jelasnya lihat gambar .

java.lang.NoClassDefFoundError: resolusi gagal: Lorg / apache / http / ProtocolVersion

masukkan deskripsi gambar di sini

bagian dari build.gradle saya di bawah modul App di bawah ini, ada yang memenuhi ini? Dan memberikan saran? Terimakasih banyak.

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'

        }

Jawaban:


836

Pembaruan: Ini bukan lagi bug atau solusi, diperlukan jika aplikasi Anda menargetkan API Level 28 (Android 9.0) atau lebih tinggi dan menggunakan Google Maps SDK untuk Android 16.0.0 atau lebih rendah (atau jika aplikasi Anda menggunakan Apache HTTP Perpustakaan lama). Sekarang dimasukkan dalam dokumen resmi . Masalah publik telah ditutup sebagai perilaku yang dimaksudkan.

Ini adalah bug di sisi Layanan Google Play, sampai diperbaiki, Anda harus dapat mengatasinya dengan menambahkan ini ke AndroidManifest.xmldalam <application>tag Anda:

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

84
Ini bukan solusi lagi. Ini adalah cara yang benar sekarang developers.google.com/maps/documentation/android-sdk/…
Kevin Robatel

@ AdamK, Android 9 adalah API level 28. = P (bukan bug dari serveride, tetapi tentang perubahan perilaku P)
Fung LAM

10
Adakah yang tidak menggunakan peta yang mengalami ini juga?
Robin Dijkhof

2
Ya, Anda juga dapat menemukannya jika Anda menggunakan pustaka HTTP HTTP Legacy Apache (atau salah satu dari dependensi Anda lakukan).
AdamK

2
Saya menggunakan perpustakaan Apache HTTP Legacy dan ini baru saja menyelamatkan saya. Terima kasih!
Eric B.

55

Tautan ini android-9.0-changes-28 -> Penghentian klien Apache HTTP menjelaskan alasan untuk menambahkan yang berikut ke AndroidManifest.xml Anda:

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

Dengan Android 6.0, kami menghapus dukungan untuk klien HTTP Apache. Dimulai dengan Android 9, perpustakaan itu dihapus dari bootclasspath dan tidak tersedia untuk aplikasi secara default.


33

Lakukan salah satu dari yang berikut:

1- Perbarui perpustakaan main-layanan-peta ke versi terbaru:

com.google.android.gms:play-services-maps:16.1.0

2- Atau sertakan deklarasi berikut dalam <application>elemen AndroidManifest.xml.

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

3
Sekali lagi ini sangat memalukan bagi pengembang Android 9 dan tentu saja untuk Google. Saya harap mereka merevisi implementasi dan perilaku Android 9 karena memiliki banyak bug. Sayangnya, Google bersikeras memanggil bug ini, perubahan perilaku!
saeed khalafinejad

20

Jika Anda menggunakan Android 9.0 dengan stoples lama dari yang harus Anda gunakan. dalam file mainfest Anda.

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


17

Untuk menjalankan org.apache.http.legacy dengan sempurna di Android 9.0 Pie buat file 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>

Dan tambahkan 2 tag tag di AndroidManifest.xml Anda

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>

Tambahkan juga useLibrary 'org.apache.http.legacy'gradasi build aplikasi Anda

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

Ini terlihat seperti sesuatu yang seharusnya tidak Anda lakukan ketika Anda bermaksud meluncurkan aplikasi ke publik. Untuk pengembangan mungkin masuk akal, tetapi kemudian tidak akan bekerja pada produksi sehingga tidak ada gunanya.
Maciej Pigulski

Jawaban ini harus diterima jawaban, saya mencoba banyak cara tetapi tidak berhasil. Good Job @Gitesh
Mitesh Jain

16

Di AndroidManifest.xml Anda tambahkan dua baris ini.

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

Lihat kode di bawah ini

    <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

Jika Anda menggunakan com.google.android.gms: play-services-maps: 16.0.0 atau lebih rendah dan aplikasi Anda menargetkan API level 28 (Android 9.0) atau lebih tinggi, Anda harus menyertakan deklarasi berikut dalam elemen AndroidManifest. xml.

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

Ini ditangani untuk Anda jika Anda menggunakan com.google.android.gms: play-services-maps: 16.1.0 dan tidak perlu jika aplikasi Anda menargetkan tingkat API yang lebih rendah.


5

Sebagai reaksi asli, saya memiliki kesalahan tidak menampilkan peta dan menutup aplikasi, menjalankan adb logcat dan menampilkan kesalahan dalam konsol:

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

memperbaikinya dengan menambahkan dalam androidManifest.xml

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.