java.lang.NoClassDefFoundError: การแก้ปัญหาล้มเหลวของ: Lorg / apache / http / ProtocolVersion


324

ฉันพบข้อผิดพลาดดังกล่าวเมื่อฉันใช้ Android studio 3.1 เพื่อสร้างแอป Android P สามารถสร้าง apk ได้ แต่เมื่อฉันใช้งานบน Android P emulator มันจะพังและโยนข้อมูลด้านล่างรายละเอียดเพิ่มเติมดูรูป .

java.lang.NoClassDefFoundError: การแก้ปัญหาล้มเหลวของ: Lorg / apache / http / ProtocolVersion

ป้อนคำอธิบายรูปภาพที่นี่

ส่วนหนึ่งของ 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) ขึ้นไปและใช้ Google Maps SDK สำหรับ Android 16.0.0 หรือต่ำกว่า (หรือหากแอปของคุณใช้ 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/ …
Kevin Robatel

@AdamK, Android 9 คือ API ระดับ 28. = P (ไม่ใช่บั๊กจากเซิร์ฟเวอร์ แต่เกี่ยวกับการเปลี่ยนพฤติกรรม P)
Fung LAM

10
ทุกคนที่ไม่ได้ใช้แผนที่ประสบปัญหาเช่นนี้หรือไม่?
Robin Dijkhof

2
ใช่คุณสามารถใช้งานได้เช่นกันหากคุณใช้ไลบรารี Apache HTTP Legacy (หรือการพึ่งพาของคุณ)
AdamK

2
ฉันใช้ห้องสมุด Apache HTTP Legacy และนี่เพิ่งบันทึกฉัน ขอบคุณ!
Eric 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

ถ้าคุณใช้ Android 9.0 กับ jar ดั้งเดิมกว่าที่คุณต้องใช้ ในไฟล์ mainfest ของคุณ

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


17

หากต้องการเรียกใช้ org.apache.http.legacy อย่างสมบูรณ์แบบใน Android 9.0 Pie ให้สร้างไฟล์ 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>

และเพิ่มแท็ก 2 แท็กใน AndroidManifest.xml ของคุณ

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'สร้างแอปของคุณใน gradle

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 ของคุณเพิ่มสองบรรทัดนี้

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

1

ตามคำตอบของ SO นี้มันเกิดขึ้นเนื่องจากข้อผิดพลาด AWS SDK ที่ดูเหมือนว่าจะได้รับการแก้ไขในเวอร์ชัน 2.6.30 ของ SDKดังนั้นการอัปเดตเวอร์ชันเป็นเวอร์ชันใหม่สามารถช่วยคุณแก้ไขปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.