java.lang.NoClassDefFoundError: विफल संकल्प: Lorg / apache / http / प्रोटोकॉल विसर्जन


324

जब मैं एंड्रॉइड P के ऐप को बनाने के लिए एंड्रॉइड स्टूडियो 3.1 का उपयोग करता हूं, तो मुझे ऐसी त्रुटि मिली, एपीके बनाया जा सकता है, लेकिन जब मैं एंड्रॉइड पी एमुलेटर पर इसका उपयोग करता हूं, तो यह क्रैश हो जाएगा और नीचे दी गई जानकारी को फेंक देगा, अधिक विवरण तस्वीर देखें ।

java.lang.NoClassDefFoundError: विफल संकल्प: Lorg / apache / http / प्रोटोकॉल विसर्जन

यहां छवि विवरण दर्ज करें

App build के तहत मेरे 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

अपडेट: यह अब बग या वर्कअराउंड नहीं है, यह आवश्यक है यदि आपका ऐप एपीआई स्तर 28 (एंड्रॉइड 9.0) या उससे ऊपर का लक्ष्य रखता है और एंड्रॉइड 16.0.0 या उससे नीचे के लिए Google मैप्स एसडीके का उपयोग करता है (या यदि आपका ऐप अपाचे HTTP का उपयोग करता है विरासत पुस्तकालय)। यह अब आधिकारिक डॉक्स में शामिल है । सार्वजनिक मुद्दे को इच्छित व्यवहार के रूप में बंद कर दिया गया है।

यह Google Play Services की ओर से एक बग है , जब तक यह ठीक नहीं हो जाता है, आपको टैग के AndroidManifest.xmlअंदर इसे जोड़कर वर्कअराउंड करने में सक्षम होना चाहिए <application>:

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

84
यह अब वर्कअराउंड नहीं है। यह सही तरीका है developers.google.com/maps/documentation/android-sdk/...
केविन Robatel

@ अदम, एंड्रॉइड 9 एपीआई स्तर 28 है। = पी (सर्वरसाइड से बग नहीं, लेकिन पी व्यवहार परिवर्तन के बारे में)
फुंग लाम

10
किसी को भी इस अनुभव के नक्शे का उपयोग नहीं?
रॉबिन दिजाखोफ़

2
यदि आप अपाचे HTTP लिगेसी लाइब्रेरी (या आपकी एक निर्भरता करते हैं) का उपयोग करते हैं तो हाँ आप इसमें भी भाग सकते हैं।
एडमके

2
मैं अपाचे HTTP लिगेसी लाइब्रेरी का उपयोग कर रहा हूं और इसने मुझे बचाया। धन्यवाद!
एरिक बी।

55

यह लिंक Android-9.0-changes-28 -> अपाचे HTTP क्लाइंट अपवर्जन आपके AndroidManifest.xml में निम्नलिखित जोड़ने का कारण बताता है:

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

Android 6.0 के साथ, हमने Apache HTTP क्लाइंट के लिए समर्थन हटा दिया। एंड्रॉइड 9 के साथ शुरुआत करके, उस लाइब्रेरी को बूटक्लासपथ से हटा दिया जाता है और डिफ़ॉल्ट रूप से एप्लिकेशन के लिए उपलब्ध नहीं होता है।


33

निम्न में से कोई एक करें:

1- नवीनतम संस्करण के लिए प्ले-सर्विसेज-मैप्स लाइब्रेरी को अपडेट करें :

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
फिर से यह एंड्रॉइड 9 डेवलपर्स के लिए और Google के लिए निश्चित रूप से बहुत शर्म की बात है। मुझे उम्मीद है कि वे एंड्रॉइड 9 के कार्यान्वयन और व्यवहार को संशोधित करते हैं क्योंकि इसमें कई बग हैं। दुर्भाग्य से, Google इन बगों, व्यवहार में परिवर्तन पर जोर देता है!
सईद खलफीनजाद

20

यदि आप विरासत का उपयोग करने की तुलना में विरासत के साथ एंड्रॉयड 9.0 का उपयोग कर रहे हैं। आपकी मुख्य फ़ाइल में।

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


17

Android 9.0 पाई में पूरी तरह से 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'
}

जब आप किसी ऐप को जनता के लिए लॉन्च करने का इरादा रखते हैं तो ऐसा कुछ नहीं दिखता है। विकास के लिए शायद यह समझ में आता है, लेकिन फिर भी यह उत्पादन पर काम नहीं करेगा, इसलिए इसमें कोई समझदारी नहीं है।
मैकीज पिगुलस्की

इस उत्तर को स्वीकार किया जाना चाहिए, मैंने कई तरीके आजमाए लेकिन कोई काम नहीं किया। अच्छी नौकरी @ गीतेश
मितेश जैन

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या नीचे और आपका ऐप एपीआई स्तर 28 (एंड्रॉइड 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 के तत्व में निम्नलिखित घोषणा शामिल करनी होगी। एक्सएमएल।

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

यदि आप com.google.android.gms: play-services-Maps: 16.1.0 का उपयोग कर रहे हैं तो यह आपके लिए नियंत्रित किया जाता है और यदि आपका ऐप निम्न API स्तर को लक्षित कर रहा है तो यह आवश्यक नहीं है।


5

मूल निवासी की प्रतिक्रिया में, मुझे नक्शे और नज़दीकी ऐप न दिखाने, एडीबी लॉगकैट चलाने और कंसोल के भीतर त्रुटि दिखाने में त्रुटि हुई:

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

androidManifest.xml के भीतर जोड़कर इसे ठीक करें

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

1

इस एसओ उत्तर के अनुसार , यह एक एडब्ल्यूएस एसडीके बग के कारण होता है जो एसडीके के संस्करण 2.6.30 में हल किया गया प्रतीत होता है , इसलिए संस्करण को नए सिरे से अपडेट करने से आपको समस्या को ठीक करने में मदद मिल सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.