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'

        }
dukeking
sumber

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" />
AdamK
sumber
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.

pradip tilala
sumber
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" />
Darush
sumber
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"/>

Suresh kumar
sumber
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'
}
Gitesh
sumber
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>
Aftab Alam
sumber
9

Jika Anda menggunakan com.google.android.gms:play-services-maps:16.0.0atau di bawah 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" />

Periksa tautan ini - https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

Gideon Kitili
sumber
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.

jeevashankar
sumber
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" />
Diego Santa Cruz Mendezú
sumber