java.lang.NoClassDefFoundError: không giải quyết được: Lorg / apache / http / ProtocolVersion


324

Tôi đã gặp lỗi như vậy khi tôi sử dụng Android studio 3.1 để xây dựng ứng dụng Android P, apk có thể được tạo, nhưng khi tôi sử dụng nó trên trình giả lập Android P, nó sẽ bị sập và ném bên dưới thông tin, xem thêm chi tiết .

java.lang.NoClassDefFoundError: không giải quyết được: Lorg / apache / http / ProtocolVersion

nhập mô tả hình ảnh ở đây

một phần của build.gradle của tôi trong mô-đun ứng dụng bên dưới, có ai gặp điều này không? Và đưa ra một số cách? Cảm ơn nhiều.

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'

        }

Câu trả lời:


836

Cập nhật: Đây không còn là lỗi hay giải pháp nữa, nó được yêu cầu nếu ứng dụng của bạn nhắm mục tiêu API cấp 28 (Android 9.0) trở lên và sử dụng SDK Google Maps cho Android 16.0.0 trở xuống (hoặc nếu ứng dụng của bạn sử dụng HTTP HTTP Thư viện kế thừa). Bây giờ nó được bao gồm trong các tài liệu chính thức . Các vấn đề công cộng đã được đóng lại như hành vi dự định.

Đây là một lỗi ở phía Dịch vụ Google Play, cho đến khi được khắc phục, bạn sẽ có thể khắc phục bằng cách thêm lỗi này vào AndroidManifest.xmlbên trong <application>thẻ:

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

84
Đây không phải là một cách giải quyết nữa. Đây là cách chính xác ngay bây giờ developers.google.com/maps/documentation/android-sdk/
Kẻ

@AdamK, Android 9 là API cấp 28. = P (không phải lỗi từ máy chủ, nhưng về thay đổi hành vi của P)
Fung LAM

10
Bất cứ ai không sử dụng bản đồ trải nghiệm điều này là tốt?
Robin Dijkhof

2
Có, bạn cũng có thể gặp phải nó nếu bạn sử dụng thư viện Apache HTTP Legacy (hoặc một trong những phụ thuộc của bạn làm).
AdamK

2
Tôi đang sử dụng thư viện Apache HTTP Legacy và điều này vừa cứu tôi. Cảm ơn bạn!
Eric B.

55

Liên kết này android-9.0-thay đổi-28 -> Sự phản đối của máy khách HTTP HTTP giải thích lý do cho việc thêm phần sau vào AndroidManifest.xml của bạn:

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

Với Android 6.0, chúng tôi đã xóa hỗ trợ cho máy khách HTTP Apache. Bắt đầu với Android 9, thư viện đó sẽ bị xóa khỏi boot classpath và không có sẵn cho các ứng dụng theo mặc định.


33

Thực hiện bất kỳ thao tác nào sau đây:

1- Cập nhật thư viện play-services-maps lên phiên bản mới nhất:

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

2- Hoặc bao gồm khai báo sau trong <application>phần tử của AndroidManifest.xml.

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

3
Một lần nữa, đó là một sự xấu hổ lớn cho các nhà phát triển Android 9 và tất nhiên đối với Google. Tôi hy vọng họ sửa đổi cách thực hiện và hành vi của Android 9 vì nó có nhiều lỗi. Thật không may, Google khăng khăng gọi những lỗi này, thay đổi hành vi!
saeed khalafinejad

20

Nếu bạn sử dụng Android 9.0 với jar kế thừa thì bạn phải sử dụng. trong tập tin chính của bạn.

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


17

Để chạy org.apache.http.legacy hoàn hảo trong Android 9.0 Pie, hãy tạo một tệp 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>

Và thêm 2 thẻ tag vào AndroidManifest.xml của bạn

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>

Ngoài ra, thêm useLibrary 'org.apache.http.legacy'vào lớp xây dựng ứng dụng của bạn

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

Điều này trông giống như một cái gì đó bạn không nên làm khi bạn có ý định khởi chạy một ứng dụng ra công chúng. Đối với sự phát triển có thể nó có ý nghĩa, nhưng sau đó nó sẽ vẫn không hoạt động trong sản xuất nên không có ý nghĩa gì trong đó.
Maciej Pigulski

Câu trả lời này nên được chấp nhận câu trả lời, tôi đã thử nhiều cách nhưng không hiệu quả. Công việc tốt @Gitesh
Mitesh Jain

16

Trong AndroidManifest.xml của bạn, thêm hai dòng này.

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

Xem mã dưới đây

    <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

Nếu bạn đang sử dụng com.google.android.gms:play-services-maps:16.0.0hoặc thấp hơn và ứng dụng của bạn đang nhắm mục tiêu API cấp 28 (Android 9.0) trở lên, bạn phải bao gồm khai báo sau trong phần tử của AndroidManifest.xml

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

Kiểm tra liên kết này - https://developers.google.com/maps/documentation/android-sdk/config#specify_Vquirement_for_apache_http_legacy_l Library


8

Nếu bạn đang sử dụng com.google.android.gms: play-services-maps: 16.0.0 trở xuống và ứng dụng của bạn đang nhắm mục tiêu API cấp 28 (Android 9.0) trở lên, bạn phải bao gồm khai báo sau trong phần tử của AndroidManifest. xml.

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

Điều này được xử lý cho bạn nếu bạn đang sử dụng com.google.android.gms: play-services-maps: 16.1.0 và không cần thiết nếu ứng dụng của bạn nhắm mục tiêu mức API thấp hơn.


5

Trong phản ứng gốc, tôi đã gặp lỗi không hiển thị bản đồ và đóng ứng dụng, chạy logcat adb và hiển thị lỗi trong bảng điều khiển:

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

khắc phục bằng cách thêm vào trong androidManifest.xml

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.