当我使用Android Studio构建我的应用程序时,我遇到了这个错误。APK被编译,但当我试图在Android P模拟器上运行应用程序时,它会崩溃并抛出以下错误。详情请见附件:

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

这是我的身材。级文件。如果有人对问题有什么建议,我将不胜感激。多谢。

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

当前回答

这个链接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,默认情况下对应用程序不可用。

其他回答

做以下任何一件事:

更新play-services-maps库到最新版本:

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

或者在AndroidManifest.xml的<application>元素中包含以下声明。

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

这可能是迟到的回答。但是,我希望这能节省一些人的时间:

如果你正在使用com.google.android.gms:play-services-maps:16.0.0或以下,并且你的应用程序是API级别28 (Android 9.0)或以上,你必须在AndroidManifest.xml的元素中包含以下声明

<application
        ...
        ...
        android:usesCleartextTraffic="true"
        android:requestLegacyExternalStorage="true">

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

</application>

注意:android:requestLegacyExternalStorage="true", android 10+访问存储R/W

Android 6.0在Android manifest的application元素下引入了useCleartextTraffic属性。Android P的默认值是false。将此设置为true表示应用程序打算使用清除网络流量。

如果你的应用程序在Android 10设备上运行时选择退出作用域存储,建议你在应用程序的清单文件中继续将requestLegacyExternalStorage设置为true。这样,你的应用程序就可以在运行Android 10的设备上继续正常运行

为了在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。遗留'在你的应用程序构建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'
}

如果你使用安卓9.0的遗留jar比你必须使用。 在你的mainfest文件里。

< uses-library android: name = " org.apache.http。遗产”android:要求= " false " / >

Android漏洞追踪器https://issuetracker.google.com/issues/79478779上也有报道